[PATCH 3/4] ARM: kprobes: Make ARM instruction emulation work on Thumb-2 kernels

Tixy tixy at yxit.co.uk
Tue Mar 22 09:05:14 UTC 2011


On Mon, 2011-03-21 at 15:58 -0400, Nicolas Pitre wrote:
> On Mon, 21 Mar 2011, Tixy wrote:
> 
> > From: Jon Medhurst <tixy at yxit.co.uk>
> > 
> > On Thumb-2 kernels there may still be some kernel code using the ARM
> > instruction set, so kprobes will need to support this. This patch
> > fixes the ARM emulation code to built and work correctly when built as
> > Thumb.
> > 
> > Signed-off-by: Jon Medhurst <tixy at yxit.co.uk>
> > ---
> 
> [...]
> 
> > @@ -108,8 +116,22 @@ static void __init find_str_pc_offset(void)
> >  	int addr, scratch, ret;
> >  
> >  	__asm__ (
> > +#ifdef CONFIG_THUMB2_KERNEL
> > +		/* Switch to ARM mode */
> > +		"adr	%[scr], 1f		\n\t"
> > +		"bx	%[scr]			\n\t"
> 
> A .align would be required here.

OK. I had assumed that the assembler would automatically align ARM
instructions but I doesn't say that it the docs.

> 
> > +		".arm				\n\t"
> > +		"1:				\n\t"
> > +#endif
> >  		"sub	%[ret], pc, #4		\n\t"
> >  		"str	pc, %[addr]		\n\t"
> > +#ifdef CONFIG_THUMB2_KERNEL
> > +		/* Switch back to Thumb mode */
> > +		"adr	%[scr], 2f + 1		\n\t"
> > +		"bx	%[scr]			\n\t"
> > +		".thumb				\n\t"
> > +		"2:				\n\t"
> 
> Here you could simply use something like:
> 
> 	sub	pc, pc, #3

Only on ARMv7, on ARMv6T2 it doesn't change state.

> 
> > +#endif
> >  		"ldr	%[scr], %[addr]		\n\t"
> >  		"sub	%[ret], %[scr], %[ret]	\n\t"
> >  		: [ret] "=r" (ret), [scr] "=r" (scratch), [addr] "+m" (addr));
> 
> Isn't the direct storage of pc architecturally defined with Thumb2 
> capable processors?  If so this whole code could be omitted in that 
> case.

Again, only on ARMv7, not ARMv6T2.

Does Linux support ARMv6T2? arch/arm/Kconfig has

	config THUMB2_KERNEL
		depends on CPU_V7 && !CPU_V6 && !CPU_V6K && EXPERIMENTAL

so if there isn't any other CPU_V6x config option then THUMB2_KERNEL
implies ARMv7.

-- 
Tixy




More information about the linaro-kernel mailing list