[PATCH 02/15] powerpc: Use Linux kABI for syscall return

Adhemerval Zanella adhemerval.zanella@linaro.org
Tue Feb 11 12:14:00 GMT 2020



On 11/02/2020 08:18, Florian Weimer wrote:
> * Adhemerval Zanella:
> 
>> diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/sysdep.h
>> index 01c26be24b..abdcfd4a63 100644
>> --- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h
>> +++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h
>> @@ -60,9 +60,8 @@
>>         : "+r" (r0), "+r" (r3), "+r" (r4), "+r" (r5),  "+r" (r6),        \
>>           "+r" (r7), "+r" (r8)						\
>>         : : "r9", "r10", "r11", "r12", "cr0", "ctr", "lr", "memory");	\
>> -    err = (long int) r0;						\
>>      __asm__ __volatile__ ("" : "=r" (rval) : "r" (r3));		        \
>> -    rval;								\
>> +    (long int) r0 & (1 << 28) ? -rval : rval;				\
>>    })
>>  
>>  #define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...)		\
>> @@ -110,21 +109,20 @@
>>         : ASM_INPUT_##nr							\
>>         : "r9", "r10", "r11", "r12",					\
>>           "cr0", "ctr", "memory");					\
>> -	  err = r0;  \
>> -    r3;  \
>> +    r0 & (1 << 28) ? -r3 : r3;						\
>>    })
>>  #define INTERNAL_SYSCALL(name, err, nr, args...)			\
>>    INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, args)
>>  
>>  #undef INTERNAL_SYSCALL_DECL
>> -#define INTERNAL_SYSCALL_DECL(err) long int err __attribute__ ((unused))
>> +#define INTERNAL_SYSCALL_DECL(err) do { } while (0)
>>  
>>  #undef INTERNAL_SYSCALL_ERROR_P
>>  #define INTERNAL_SYSCALL_ERROR_P(val, err) \
>> -  ((void) (val), __builtin_expect ((err) & (1 << 28), 0))
>> +  ((unsigned long) (val) >= (unsigned long) -4095)
>>  
>>  #undef INTERNAL_SYSCALL_ERRNO
>> -#define INTERNAL_SYSCALL_ERRNO(val, err)     (val)
>> +#define INTERNAL_SYSCALL_ERRNO(val, err)     (-(val))
>>  
>>  #if defined(__PPC64__) || defined(__powerpc64__)
>>  # define SYSCALL_ARG_SIZE 8
> 
> What's the baseline for this patch?

To simplify the Linux syscall handling on all architectures by using the
already set kABI interface (where returns values from
0xfffffffffffff000 to 0xffffffffffffffff indicates an error). The idea
is initially to consolidate the INLINE_SYSCALL macro and remove the
INTERNAL_SYSCALL_DECL macro.

This refactoring is an initial one, my long-term goal is twofold:

  1. Remove the assembly macros to define syscall and only use the
     C interface. It simplifies ports, requires less hackery to handle
     all its subtitles in C generations (static/pic/etc), and most likely
     would play nice on a possible LTO build.

  2. Rework the syscall interfaces to use static inline instead of
     macros. It will avoid the argument handling that led to the
     subtle BZ#25523 bug and it defines a proper kABI interface.



More information about the Libc-alpha mailing list