Message ID | 20230419135821.4113156-3-josimmon@redhat.com |
---|---|
State | New |
Headers | show |
Series | x86_64: aarch64: Set call number just before syscall | expand |
The 04/19/2023 09:58, Joe Simmons-Talbott via Libc-alpha wrote: > --- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h > +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h > @@ -168,15 +168,26 @@ > # define HAVE_CLONE3_WRAPPER 1 > > # undef INTERNAL_SYSCALL_RAW > -# define INTERNAL_SYSCALL_RAW(name, nr, args...) \ > - ({ long _sys_result; \ > - { \ > - LOAD_ARGS_##nr (args) \ > - register long _x8 asm ("x8") = (name); \ > - asm volatile ("svc 0 // syscall " # name \ > - : "=r" (_x0) : "r"(_x8) ASM_ARGS_##nr : "memory"); \ > - _sys_result = _x0; \ > - } \ > +# define INTERNAL_SYSCALL_RAW(name, nr, args...) \ > + ({ long _sys_result; \ > + { \ > + LOAD_ARGS_##nr (args) \ > + if (__builtin_constant_p(name)) \ > + asm volatile ("mov x8, %1 // syscall " # name "\n" \ > + "svc 0" \ > + : "=r" (_x0) \ > + : "i" (name) ASM_ARGS_##nr \ > + : "x8", "memory"); \ > + else \ > + { \ > + register long _x8 asm ("x8") = (name); \ > + asm volatile ("svc 0\n\t" \ why \n\t ? i don't think that's needed. > + : "=r" (_x0) \ > + : "r"(_x8) ASM_ARGS_##nr \ > + : "memory"); \ > + } \ > + _sys_result = _x0; \ > + } \ > _sys_result; }) > > # undef INTERNAL_SYSCALL
On Wed, Apr 19, 2023 at 03:56:05PM +0100, Szabolcs Nagy wrote: > The 04/19/2023 09:58, Joe Simmons-Talbott via Libc-alpha wrote: > > --- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h > > +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h > > @@ -168,15 +168,26 @@ > > # define HAVE_CLONE3_WRAPPER 1 > > > > # undef INTERNAL_SYSCALL_RAW > > -# define INTERNAL_SYSCALL_RAW(name, nr, args...) \ > > - ({ long _sys_result; \ > > - { \ > > - LOAD_ARGS_##nr (args) \ > > - register long _x8 asm ("x8") = (name); \ > > - asm volatile ("svc 0 // syscall " # name \ > > - : "=r" (_x0) : "r"(_x8) ASM_ARGS_##nr : "memory"); \ > > - _sys_result = _x0; \ > > - } \ > > +# define INTERNAL_SYSCALL_RAW(name, nr, args...) \ > > + ({ long _sys_result; \ > > + { \ > > + LOAD_ARGS_##nr (args) \ > > + if (__builtin_constant_p(name)) \ > > + asm volatile ("mov x8, %1 // syscall " # name "\n" \ > > + "svc 0" \ > > + : "=r" (_x0) \ > > + : "i" (name) ASM_ARGS_##nr \ > > + : "x8", "memory"); \ > > + else \ > > + { \ > > + register long _x8 asm ("x8") = (name); \ > > + asm volatile ("svc 0\n\t" \ > > why \n\t ? > > i don't think that's needed. I'll remove it in v6. Thanks, Joe
diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h index e94d1703ad..6fe40aaf89 100644 --- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h @@ -168,15 +168,26 @@ # define HAVE_CLONE3_WRAPPER 1 # undef INTERNAL_SYSCALL_RAW -# define INTERNAL_SYSCALL_RAW(name, nr, args...) \ - ({ long _sys_result; \ - { \ - LOAD_ARGS_##nr (args) \ - register long _x8 asm ("x8") = (name); \ - asm volatile ("svc 0 // syscall " # name \ - : "=r" (_x0) : "r"(_x8) ASM_ARGS_##nr : "memory"); \ - _sys_result = _x0; \ - } \ +# define INTERNAL_SYSCALL_RAW(name, nr, args...) \ + ({ long _sys_result; \ + { \ + LOAD_ARGS_##nr (args) \ + if (__builtin_constant_p(name)) \ + asm volatile ("mov x8, %1 // syscall " # name "\n" \ + "svc 0" \ + : "=r" (_x0) \ + : "i" (name) ASM_ARGS_##nr \ + : "x8", "memory"); \ + else \ + { \ + register long _x8 asm ("x8") = (name); \ + asm volatile ("svc 0\n\t" \ + : "=r" (_x0) \ + : "r"(_x8) ASM_ARGS_##nr \ + : "memory"); \ + } \ + _sys_result = _x0; \ + } \ _sys_result; }) # undef INTERNAL_SYSCALL