ARM tracehook support

Russell King - ARM Linux linux at arm.linux.org.uk
Tue Feb 21 12:27:50 EST 2012


On Mon, Feb 20, 2012 at 11:08:57AM -0700, Wade Farnsworth wrote:
> Will Deacon wrote:
> > On Wed, Nov 30, 2011 at 02:46:20PM +0000, Steven Walter wrote:
> >> +static inline void syscall_get_arguments(struct task_struct *task,
> >> +					 struct pt_regs *regs,
> >> +					 unsigned int i, unsigned int n,
> >> +					 unsigned long *args)
> >> +{
> >> +	BUG_ON(i + n > 6);
> >
> > So I guess 6 is the maximum number of registers that are used for
> > syscall passing. That sounds about right to me, but I wondered how
> > you worked it out (and whether or not it should be defined
> > somewhere?).
>
> I believe the 6 argument constraint is a specific to  
> syscall_get_arguments().  Notice the comment in  
> include/asm-generic/syscall.h:

Well, there's two things here.  Is a BUG_ON() really suitable here?
What controls how many arguments are fetched?  Userspace?  If so, that's
a nice way to oops the kernel.

Secondly, there is a 7 argument syscall - sys_syscall, which we use on
OABI to deal with calling a syscall by number.  That really does show
up as a unique syscall there, so if you want to parse the last argument
to such a syscall you need to be able to read up to and including ARM
register 7.

> /*
> [...]
>  *
>  * It's only valid to call this when @task is stopped for tracing on
>  * entry to a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT.
>  * It's invalid to call this with @i + @n > 6; we only support system calls
>  * taking up to 6 arguments.
>  */
>
> Additionally, if you'll look at the other architectures' implementations  
> you'll see similar code.
>
> > In fact, how are these things supposed to deal with 64-bit arguments
> > that straddle two registers? I think we always pack arguments such
> > that we don't get holes in the register layout, but it might be worth  
> > checking (EABI requires 64-bit arguments to be passed in even
> > registers).
>
> Hmm, I do believe that 32-bit powerpc has similar alignment issues  
> (64-bit args must be passed in odd/even pairs), but I don't see any  
> special handling of this in that architecture's  
> syscall_get/set_arguments().  So I'm wondering if the handling of this  
> is or should be handled elsewhere.  I'll keep digging on this.

I did point that issue out when it first came up, and I think Roland had
an answer for it, though I forget what it was.

The big stumbling block to this is OABI, and as I continue to be wholely
OABI based here, it's extremely important that nothing in OABI land gets
broken.  I don't see there's any chance of me ever getting off OABI given
the range of platforms I have, and the restriction that EABI was designed
to be impossible on ARMv4 architectures.



More information about the linux-arm-kernel mailing list