Re: 64-syscall args on 32-bit vs syscall()

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Benjamin Herrenschmidt
Date: Wednesday, March 17, 2010 - 3:18 am

On Wed, 2010-03-17 at 09:18 +0000, Jamie Lokier wrote:

No, the above "workaround" doesn't work. With the existing syscall()
definition, there is no difference between your two examples. In the
first case, you force a proper 64-bit aligment, but you are already off
by one register pair from the kernel expectation. In the second case,
gcc will imply one, which means that both your examples above will
result in my_64bit_arg in the -same- place, which is off by a register
pair from what the kernel expect.

IE. In the first case gcc will put SYS_foo in r3, 0 in r4, and
my_64bit_arg in r5 and r6. In the second case, gcc will put SYS_foo in
r3, won't care about r4, and will put the 64-bit arg in r5 and r6. Then,
glibc syscall() will shift r3 to r0, r3 to r4 etc... causing
my_64bit_arg to land in r4 and r5. But the kernel expects it in r3 and
r4.

The workaround that apps should use today is:

#if defined(__powerpc__) && WORDSIZE == 32
	syscall(SYS_foo, (u32)(my_64bit_arg >> 32), (u32)my_64bit_arg);
#else
	syscall(SYS_foo, my_64bit_arg);
#endif

And with my proposed change, both of the above will work. IE. gcc will
put the argument always in r5,r6 and the syscall() implementation will
always shift r5 to r3 and t6 to r4. 

Cheers,
Ben.


--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Sun Mar 14, 9:48 pm)
Re: 64-syscall args on 32-bit vs syscall(), David Miller, (Sun Mar 14, 10:06 pm)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Sun Mar 14, 10:18 pm)
Re: 64-syscall args on 32-bit vs syscall(), David Miller, (Sun Mar 14, 10:54 pm)
Re: 64-syscall args on 32-bit vs syscall(), Ralf Baechle, (Mon Mar 15, 6:44 am)
Re: 64-syscall args on 32-bit vs syscall(), Steven Munroe, (Mon Mar 15, 8:03 am)
Re: 64-syscall args on 32-bit vs syscall(), Jamie Lokier, (Mon Mar 15, 8:04 am)
Re: 64-syscall args on 32-bit vs syscall(), H. Peter Anvin, (Mon Mar 15, 8:13 am)
Re: 64-syscall args on 32-bit vs syscall(), Ulrich Drepper, (Mon Mar 15, 9:00 am)
Re: 64-syscall args on 32-bit vs syscall(), David Miller, (Mon Mar 15, 12:00 pm)
Re: 64-syscall args on 32-bit vs syscall(), H. Peter Anvin, (Mon Mar 15, 12:41 pm)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Mon Mar 15, 1:22 pm)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Mon Mar 15, 1:27 pm)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Mon Mar 15, 1:32 pm)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Mon Mar 15, 1:33 pm)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Mon Mar 15, 1:35 pm)
Re: 64-syscall args on 32-bit vs syscall(), H. Peter Anvin, (Mon Mar 15, 1:41 pm)
Re: 64-syscall args on 32-bit vs syscall(), Steven Munroe, (Tue Mar 16, 2:56 pm)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Tue Mar 16, 5:31 pm)
Re: 64-syscall args on 32-bit vs syscall(), Ulrich Drepper, (Tue Mar 16, 10:52 pm)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Wed Mar 17, 1:56 am)
Re: 64-syscall args on 32-bit vs syscall(), Ulrich Drepper, (Wed Mar 17, 2:14 am)
Re: 64-syscall args on 32-bit vs syscall(), Jamie Lokier, (Wed Mar 17, 2:18 am)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Wed Mar 17, 3:13 am)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Wed Mar 17, 3:18 am)
Re: 64-syscall args on 32-bit vs syscall(), H. Peter Anvin, (Wed Mar 17, 11:30 am)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Wed Mar 17, 1:35 pm)
Re: 64-syscall args on 32-bit vs syscall(), H. Peter Anvin, (Wed Mar 17, 1:53 pm)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Wed Mar 17, 3:58 pm)
Re: 64-syscall args on 32-bit vs syscall(), Steven Munroe, (Thu Mar 18, 9:08 am)
Re: 64-syscall args on 32-bit vs syscall(), Andreas Schwab, (Thu Mar 18, 9:21 am)
Re: 64-syscall args on 32-bit vs syscall(), Steven Munroe, (Thu Mar 18, 10:03 am)
Re: 64-syscall args on 32-bit vs syscall(), Benjamin Herrenschmidt, (Thu Mar 18, 2:18 pm)
Re: 64-syscall args on 32-bit vs syscall(), Jamie Lokier, (Thu Mar 18, 6:22 pm)