diff options
author | Roland McGrath <roland@gnu.org> | 2002-10-11 07:20:46 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-10-11 07:20:46 +0000 |
commit | 704bb2fd8e613322b308ed53c98b3d0d1bd98526 (patch) | |
tree | 4776d237b664e7ef90df86538fec9e667786994a | |
parent | db7ffaa3042e02121120a6086aba01c9cecfc46f (diff) | |
download | glibc-704bb2fd8e613322b308ed53c98b3d0d1bd98526.zip glibc-704bb2fd8e613322b308ed53c98b3d0d1bd98526.tar.gz glibc-704bb2fd8e613322b308ed53c98b3d0d1bd98526.tar.bz2 |
2002-10-06 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h (INLINE_SYSCALL):
Add all necessary register outputs for syscall-clobbered registers.
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h | 77 |
1 files changed, 46 insertions, 31 deletions
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h index 0559210..c0f04f1 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h @@ -37,52 +37,67 @@ # include <errno.h> # undef INLINE_SYSCALL -# define INLINE_SYSCALL(name, nr, args...) \ - ({ \ - long ret, err; \ - LOADARGS_##nr(name, args); \ - __asm __volatile ("sc\n\t" \ - "mfcr %1\n\t" \ - : "=r" (r3), "=r" (err) \ - : ASM_INPUT_##nr \ - : "cc", "memory"); \ - ret = r3; \ - if (err & 1 << 28) \ - { \ - __set_errno (ret); \ - ret = -1L; \ - } \ - ret; \ +# define INLINE_SYSCALL(name, nr, args...) \ + ({ \ + register long r0 __asm__ ("r0"); \ + register long r3 __asm__ ("r3"); \ + register long r4 __asm__ ("r4"); \ + register long r5 __asm__ ("r5"); \ + register long r6 __asm__ ("r6"); \ + register long r7 __asm__ ("r7"); \ + register long r8 __asm__ ("r8"); \ + register long r9 __asm__ ("r9"); \ + register long r10 __asm__ ("r10"); \ + register long r11 __asm__ ("r11"); \ + register long r12 __asm__ ("r12"); \ + long ret, err; \ + LOADARGS_##nr(name, args); \ + __asm__ __volatile__ \ + ("sc\n\t" \ + "mfcr %0" \ + : "=&r" (r0), \ + "=&r" (r3), "=&r" (r4), "=&r" (r5), "=&r" (r6), "=&r" (r7), \ + "=&r" (r8), "=&r" (r9), "=&r" (r10), "=&r" (r11), "=&r" (r12) \ + : ASM_INPUT_##nr \ + : "cc", "memory"); \ + err = r0; \ + ret = r3; \ + if (err & (1 << 28)) \ + { \ + __set_errno (ret); \ + ret = -1L; \ + } \ + ret; \ }) # define LOADARGS_0(name) \ - register long r0 __asm__ ("r0") = __NR_##name; \ - register long r3 __asm__ ("r3") + r0 = __NR_##name # define LOADARGS_1(name, arg1) \ - LOADARGS_0(name) = (long) (arg1) + LOADARGS_0(name); \ + r3 = (long) (arg1) # define LOADARGS_2(name, arg1, arg2) \ LOADARGS_1(name, arg1); \ - register long r4 __asm__ ("r4") = (long) (arg2) + r4 = (long) (arg2) # define LOADARGS_3(name, arg1, arg2, arg3) \ LOADARGS_2(name, arg1, arg2); \ - register long r5 __asm__ ("r5") = (long) (arg3) + r5 = (long) (arg3) # define LOADARGS_4(name, arg1, arg2, arg3, arg4) \ LOADARGS_3(name, arg1, arg2, arg3); \ - register long r6 __asm__ ("r6") = (long) (arg4) + r6 = (long) (arg4) # define LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5) \ LOADARGS_4(name, arg1, arg2, arg3, arg4); \ - register long r7 __asm__ ("r7") = (long) (arg5) + r7 = (long) (arg5) # define LOADARGS_6(name, arg1, arg2, arg3, arg4, arg5, arg6) \ LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5); \ - register long r8 __asm__ ("r8") = (long) (arg6) + r8 = (long) (arg6) -# define ASM_INPUT_0 "r" (r0) -# define ASM_INPUT_1 ASM_INPUT_0, "0" (r3) -# define ASM_INPUT_2 ASM_INPUT_1, "r" (r4) -# define ASM_INPUT_3 ASM_INPUT_2, "r" (r5) -# define ASM_INPUT_4 ASM_INPUT_3, "r" (r6) -# define ASM_INPUT_5 ASM_INPUT_4, "r" (r7) -# define ASM_INPUT_6 ASM_INPUT_5, "r" (r8) +# define ASM_INPUT_0 "0" (r0) +# define ASM_INPUT_1 ASM_INPUT_0, "1" (r3) +# define ASM_INPUT_2 ASM_INPUT_1, "2" (r4) +# define ASM_INPUT_3 ASM_INPUT_2, "3" (r5) +# define ASM_INPUT_4 ASM_INPUT_3, "4" (r6) +# define ASM_INPUT_5 ASM_INPUT_4, "5" (r7) +# define ASM_INPUT_6 ASM_INPUT_5, "6" (r8) #endif /* __ASSEMBLER__ */ |