[PATCH] ARM: OMAP2+: timer: Fix crash due to wrong arg to __omap_dm_timer_read_counter

Tony Lindgren tony at atomide.com
Thu Jan 26 18:30:01 EST 2012


* Vaibhav Hiremath <hvaibhav at ti.com> [120122 22:17]:
> In dmtimer_read_sched_clock(), wrong argument was getting passed to
> __omap_dm_timer_read_counter() function call; instead of "&clksrc",
> we were passing "clksrc.io_base", which results into kernel crash.
> 
> To reproduce kernel crash, just disable the CONFIG_OMAP_32K_TIMER config
> option (and DEBUG_LL) and build/boot the kernel.
> This will use dmtimer as a kernel clocksource and lead to kernel
> crash during boot  -
> 
> [    0.000000] OMAP clocksource: GPTIMER2 at 26000000 Hz
> [    0.000000] sched_clock: 32 bits at 26MHz, resolution 38ns, wraps every
> 165191ms
> [    0.000000] Unable to handle kernel paging request at virtual address
> 00030ef1
> [    0.000000] pgd = c0004000
> [    0.000000] [00030ef1] *pgd=00000000
> [    0.000000] Internal error: Oops: 5 [#1] SMP
> [    0.000000] Modules linked in:
> [    0.000000] CPU: 0    Not tainted  (3.3.0-rc1-11574-g0c76665-dirty #3)
> [    0.000000] PC is at dmtimer_read_sched_clock+0x18/0x4c
> [    0.000000] LR is at update_sched_clock+0x10/0x84
> [    0.000000] pc : [<c00243b8>]    lr : [<c0018684>]    psr: 200001d3
> [    0.000000] sp : c0641f38  ip : c0641e18  fp : 0000000a
> [    0.000000] r10: 151c3303  r9 : 00000026  r8 : 76276259
> [    0.000000] r7 : 00028547  r6 : c065ac80  r5 : 431bde82  r4 : c0655968
> [    0.000000] r3 : 00030ef1  r2 : fb032000  r1 : 00000028  r0 : 00000001

Thanks, applying into fixes.

Tony
 
> Signed-off-by: Vaibhav Hiremath <hvaibhav at ti.com>
> Cc: Tony Lindgren <tony at atomide.com>
> ---
>  arch/arm/mach-omap2/timer.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
> index 18f7614..5f2873e 100644
> --- a/arch/arm/mach-omap2/timer.c
> +++ b/arch/arm/mach-omap2/timer.c
> @@ -270,7 +270,7 @@ static struct clocksource clocksource_gpt = {
>  static u32 notrace dmtimer_read_sched_clock(void)
>  {
>  	if (clksrc.reserved)
> -		return __omap_dm_timer_read_counter(clksrc.io_base, 1);
> +		return __omap_dm_timer_read_counter(&clksrc, 1);
> 
>  	return 0;
>  }
> --
> 1.7.0.4
> 



More information about the linux-arm-kernel mailing list