diff options
author | John David Anglin <dave.anglin@bell.net> | 2015-08-07 11:54:19 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2016-01-24 03:42:54 -0500 |
commit | c6d1664014de6e9f36aba21e8c84419885b396d8 (patch) | |
tree | 85363d60c45b8983f7638d6992d9c1eedc25008d | |
parent | 7a5d3129638db8a832e2c3090d263bbc1b1b919b (diff) | |
download | glibc-c6d1664014de6e9f36aba21e8c84419885b396d8.tar.gz glibc-c6d1664014de6e9f36aba21e8c84419885b396d8.tar.xz glibc-c6d1664014de6e9f36aba21e8c84419885b396d8.zip |
hppa: Fix miscompilation of sched_setaffinity() [BZ #18480]
The attached change fixes the miscompilation of sched_setaffinity() on hppa. This is an old problem that was fixed on other architectures using a similar approach to the attached change. See: https://sourceware.org/ml/libc-hacker/2004-04/msg00016.html Build tested on trunk. Patch has been applied to debian glibc for some time. (cherry picked from commit 04ece7d2dec91fe870c5f1a38032875915f44633)
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/hppa/syscall.c | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/hppa/sysdep.h | 61 |
4 files changed, 56 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog index 3e1d770b89..4f30c7e002 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2015-08-09 John David Anglin <danglin@gcc.gnu.org> + + [BZ #18480] + * sysdeps/unix/sysv/linux/hppa/sysdep.h (LOAD_ARGS_0, LOAD_ARGS_1, + LOAD_ARGS_2, LOAD_ARGS_3, LOAD_ARGS_4, LOAD_ARGS_5, LOAD_ARGS_6): + Define. + (LOAD_REGS_0, LOAD_REGS_1, LOAD_REGS_2, LOAD_REGS_3, LOAD_REGS_4, + LOAD_REGS_5, LOAD_REGS_6): Update. + (INTERNAL_SYSCALL): Update using new LOAD defines. + (INTERNAL_SYSCALL_NCS): Likewise. + * sysdeps/unix/sysv/linux/hppa/syscall.c (syscall): Likewise. + 2015-09-26 Paul Pluzhnikov <ppluzhnikov@google.com> [BZ #18985] diff --git a/NEWS b/NEWS index 5a1ebdc87e..bc2287d222 100644 --- a/NEWS +++ b/NEWS @@ -9,8 +9,8 @@ Version 2.22.1 * The following bugs are resolved with this release: - 17905, 18589, 18743, 18778, 18781, 18787, 18796, 18870, 18887, 18921, - 18928, 18969, 18985, 19018, 19058, 19174, 19178. + 17905, 18480, 18589, 18743, 18778, 18781, 18787, 18796, 18870, 18887, + 18921, 18928, 18969, 18985, 19018, 19058, 19174, 19178. * The LD_POINTER_GUARD environment variable can no longer be used to disable the pointer guard feature. It is always enabled. diff --git a/sysdeps/unix/sysv/linux/hppa/syscall.c b/sysdeps/unix/sysv/linux/hppa/syscall.c index aff67a8521..958fa47b1b 100644 --- a/sysdeps/unix/sysv/linux/hppa/syscall.c +++ b/sysdeps/unix/sysv/linux/hppa/syscall.c @@ -43,9 +43,10 @@ syscall (long int __sysno, ...) va_end (args); { + LOAD_ARGS_6 (arg0, arg1, arg2, arg3, arg4, arg5) register unsigned long int __res asm("r28"); PIC_REG_DEF - LOAD_ARGS_6 (arg0, arg1, arg2, arg3, arg4, arg5) + LOAD_REGS_6 asm volatile (SAVE_ASM_PIC " ble 0x100(%%sr2, %%r0) \n" " copy %1, %%r20 \n" diff --git a/sysdeps/unix/sysv/linux/hppa/sysdep.h b/sysdeps/unix/sysv/linux/hppa/sysdep.h index d20a04b8bb..cb1f163b4b 100644 --- a/sysdeps/unix/sysv/linux/hppa/sysdep.h +++ b/sysdeps/unix/sysv/linux/hppa/sysdep.h @@ -400,9 +400,10 @@ L(pre_end): ASM_LINE_SEP \ ({ \ long __sys_res; \ { \ + LOAD_ARGS_##nr(args) \ register unsigned long __res asm("r28"); \ PIC_REG_DEF \ - LOAD_ARGS_##nr(args) \ + LOAD_REGS_##nr \ /* FIXME: HACK save/load r19 around syscall */ \ asm volatile( \ SAVE_ASM_PIC \ @@ -425,9 +426,10 @@ L(pre_end): ASM_LINE_SEP \ ({ \ long __sys_res; \ { \ + LOAD_ARGS_##nr(args) \ register unsigned long __res asm("r28"); \ PIC_REG_DEF \ - LOAD_ARGS_##nr(args) \ + LOAD_REGS_##nr \ /* FIXME: HACK save/load r19 around syscall */ \ asm volatile( \ SAVE_ASM_PIC \ @@ -443,27 +445,44 @@ L(pre_end): ASM_LINE_SEP \ __sys_res; \ }) - - #define LOAD_ARGS_0() -#define LOAD_ARGS_1(r26) \ - register unsigned long __r26 __asm__("r26") = (unsigned long)(r26); \ +#define LOAD_REGS_0 +#define LOAD_ARGS_1(a1) \ + register unsigned long __x26 = (unsigned long)(a1); \ LOAD_ARGS_0() -#define LOAD_ARGS_2(r26,r25) \ - register unsigned long __r25 __asm__("r25") = (unsigned long)(r25); \ - LOAD_ARGS_1(r26) -#define LOAD_ARGS_3(r26,r25,r24) \ - register unsigned long __r24 __asm__("r24") = (unsigned long)(r24); \ - LOAD_ARGS_2(r26,r25) -#define LOAD_ARGS_4(r26,r25,r24,r23) \ - register unsigned long __r23 __asm__("r23") = (unsigned long)(r23); \ - LOAD_ARGS_3(r26,r25,r24) -#define LOAD_ARGS_5(r26,r25,r24,r23,r22) \ - register unsigned long __r22 __asm__("r22") = (unsigned long)(r22); \ - LOAD_ARGS_4(r26,r25,r24,r23) -#define LOAD_ARGS_6(r26,r25,r24,r23,r22,r21) \ - register unsigned long __r21 __asm__("r21") = (unsigned long)(r21); \ - LOAD_ARGS_5(r26,r25,r24,r23,r22) +#define LOAD_REGS_1 \ + register unsigned long __r26 __asm__("r26") = __x26; \ + LOAD_REGS_0 +#define LOAD_ARGS_2(a1,a2) \ + register unsigned long __x25 = (unsigned long)(a2); \ + LOAD_ARGS_1(a1) +#define LOAD_REGS_2 \ + register unsigned long __r25 __asm__("r25") = __x25; \ + LOAD_REGS_1 +#define LOAD_ARGS_3(a1,a2,a3) \ + register unsigned long __x24 = (unsigned long)(a3); \ + LOAD_ARGS_2(a1,a2) +#define LOAD_REGS_3 \ + register unsigned long __r24 __asm__("r24") = __x24; \ + LOAD_REGS_2 +#define LOAD_ARGS_4(a1,a2,a3,a4) \ + register unsigned long __x23 = (unsigned long)(a4); \ + LOAD_ARGS_3(a1,a2,a3) +#define LOAD_REGS_4 \ + register unsigned long __r23 __asm__("r23") = __x23; \ + LOAD_REGS_3 +#define LOAD_ARGS_5(a1,a2,a3,a4,a5) \ + register unsigned long __x22 = (unsigned long)(a5); \ + LOAD_ARGS_4(a1,a2,a3,a4) +#define LOAD_REGS_5 \ + register unsigned long __r22 __asm__("r22") = __x22; \ + LOAD_REGS_4 +#define LOAD_ARGS_6(a1,a2,a3,a4,a5,a6) \ + register unsigned long __x21 = (unsigned long)(a6); \ + LOAD_ARGS_5(a1,a2,a3,a4,a5) +#define LOAD_REGS_6 \ + register unsigned long __r21 __asm__("r21") = __x21; \ + LOAD_REGS_5 /* Even with zero args we use r20 for the syscall number */ #define ASM_ARGS_0 |