Re: Add private syscalls to support NPTL

Maxim Kuvyrkov
2009-08-19T08:06:42Z

Brad Boyer wrote:
> On Tue, Aug 18, 2009 at 11:07:26AM +0400, Maxim Kuvyrkov wrote:
>> Brad Boyer wrote:
>>> On Tue, Aug 18, 2009 at 01:48:39AM +0400, Maxim Kuvyrkov wrote:
>>>> +/* This syscall gets its arguments in A0 (mem), A1 (oldval) and
>>>> + D1 (newval). */
>>>> +asmlinkage int
>>>> +m68k_sys_atomic_cmpxchg_32(unsigned long newval, int d2, int d3, int d4,
>>>> int d5,
>>>> + unsigned long __user *mem, unsigned long oldval)
>>>> +{
>>> Any particular reason for this calling convention? The real CAS instruction
>>> specifically takes two data registers for the two values. It seems more
>>> logical to me to have oldval and newval in data registers and just have
>>> the mem argument in an address register.
>> The reason for this calling convention is to minimize difference in
>> invokation of the vDSO helper and the syscall. The helper gets its
>> arguments in a0 (mem), d0 (oldval) and d1 (newval); in a stub, which is
>> used when vDSO is not available, one then can do:
>>
>> movel %d0,%a1
>> movel #NR,%d0
>> trap #0
>
> Then wouldn't it make sense to use %d2 instead of %a1?

Thanks for pointing this out, there's no reason for using %a1 /anymore/.
As for the past, %d2 is call-clobbered, so it would've needed saving
on the stack.

Initially, I planned to argue changing ABI of the vDSO kernel helper to
allow clobber of %a1, but then decided that it doesn't worth it and that
it's better to save/restore whatever register a value from %d0 is being
moved to.

As there's no reasoning for using %a1 anymore, I'll make the syscall
expect its arguments in %a0(mem), %d1(newval) and %d2(oldval).

--
Maxim K.
CodeSourcery