]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
powerpc: Add missing registers to clobbers list for syscalls [BZ #27623]
authorMatheus Castanho <msc@linux.ibm.com>
Wed, 17 Mar 2021 13:14:15 +0000 (10:14 -0300)
committerMatheus Castanho <msc@linux.ibm.com>
Fri, 16 Apr 2021 11:40:37 +0000 (08:40 -0300)
Some registers that can be clobbered by the kernel during a syscall are not
listed on the clobbers list in sysdeps/unix/sysv/linux/powerpc/sysdep.h.

For syscalls using sc:
    - XER is zeroed by the kernel on exit

For syscalls using scv:
    - XER is zeroed by the kernel on exit
    - Different from the sc case, most CR fields can be clobbered (according to
      the ELF ABI and the Linux kernel's syscall ABI for powerpc
      (linux/Documentation/powerpc/syscall64-abi.rst)

The same should apply to vsyscalls, which effectively execute a function call
but are not currently adding these registers as clobbers either.

These are likely not causing issues today, but they should be added to the
clobbers list just in case things change on the kernel side in the future.

Reported-by: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Raphael M Zinsly <rzinsly@linux.ibm.com>
sysdeps/unix/sysv/linux/powerpc/sysdep.h

index 6b99464e61b8d4e4670ff647c44019c7ab31535d..2f31f9177bb25e59c76b6fa54cd7002ab181fa4e 100644 (file)
@@ -56,7 +56,9 @@
        "0:"                                                            \
        : "+r" (r0), "+r" (r3), "+r" (r4), "+r" (r5),  "+r" (r6),        \
          "+r" (r7), "+r" (r8)                                          \
-       : : "r9", "r10", "r11", "r12", "cr0", "ctr", "lr", "memory");   \
+       : : "r9", "r10", "r11", "r12",                                  \
+           "cr0", "cr1", "cr5", "cr6", "cr7",                          \
+           "xer", "lr", "ctr", "memory");                              \
     __asm__ __volatile__ ("" : "=r" (rval) : "r" (r3));                        \
     (long int) r0 & (1 << 28) ? -rval : rval;                          \
   })
@@ -86,7 +88,8 @@
         "=&r" (r6), "=&r" (r7), "=&r" (r8)     \
        : ASM_INPUT_##nr                        \
        : "r9", "r10", "r11", "r12",            \
-        "lr", "ctr", "memory");                \
+        "cr0", "cr1", "cr5", "cr6", "cr7",     \
+        "xer", "lr", "ctr", "memory");         \
     r3;                                        \
   })
 
         "=&r" (r6), "=&r" (r7), "=&r" (r8)     \
        : ASM_INPUT_##nr                        \
        : "r9", "r10", "r11", "r12",            \
-        "cr0", "ctr", "memory");               \
+        "xer", "cr0", "ctr", "memory");        \
     r0 & (1 << 28) ? -r3 : r3;                 \
   })