diff --git a/redhat_lsb_trigger.c b/redhat_lsb_trigger.c index 76db260..f76e5a5 100644 --- a/redhat_lsb_trigger.c +++ b/redhat_lsb_trigger.c @@ -424,6 +424,102 @@ register void *__thread_self __asm ("g7"); : inline_syscall_clobbers, "$20", "$21"); \ _sc_ret = _sc_0, _sc_err = _sc_19; \ } +#elif defined __aarch64__ +#undef SYS_ify +#define SYS_ify(syscall_name) (__NR_##syscall_name) + +# undef INLINE_SYSCALL +# define INLINE_SYSCALL(name, nr, args...) \ + ({ unsigned long _sys_result = INTERNAL_SYSCALL (name, , nr, args); \ + if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_sys_result, ), 0))\ + { \ + __set_errno (INTERNAL_SYSCALL_ERRNO (_sys_result, )); \ + _sys_result = (unsigned long) -1; \ + } \ + (long) _sys_result; }) + +# undef INTERNAL_SYSCALL_DECL +# define INTERNAL_SYSCALL_DECL(err) do { } while (0) + +# undef INTERNAL_SYSCALL_RAW +# define INTERNAL_SYSCALL_RAW(name, err, nr, args...) \ + ({ unsigned 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", CLOBBER_ARGS_##nr); \ + _sys_result = _x0; \ + } \ + (long) _sys_result; }) + +# undef INTERNAL_SYSCALL +# define INTERNAL_SYSCALL(name, err, nr, args...) \ + INTERNAL_SYSCALL_RAW(SYS_ify(name), err, nr, args) + +# undef INTERNAL_SYSCALL_ERROR_P +# define INTERNAL_SYSCALL_ERROR_P(val, err) \ + ((unsigned long) (val) >= (unsigned long) -4095) + +# undef INTERNAL_SYSCALL_ERRNO +# define INTERNAL_SYSCALL_ERRNO(val, err) (-(val)) + +# define CLOBBER_ARGS_0 CLOBBER_ARGS_1 +# define CLOBBER_ARGS_1 "x1", CLOBBER_ARGS_2 +# define CLOBBER_ARGS_2 "x2", CLOBBER_ARGS_3 +# define CLOBBER_ARGS_3 "x3", CLOBBER_ARGS_4 +# define CLOBBER_ARGS_4 "x4", CLOBBER_ARGS_5 +# define CLOBBER_ARGS_5 "x5", CLOBBER_ARGS_6 +# define CLOBBER_ARGS_6 "x6", CLOBBER_ARGS_7 +# define CLOBBER_ARGS_7 \ + "x7", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18" + +# define LOAD_ARGS_0() \ + register long _x0 asm ("x0"); + +# define ASM_ARGS_0 +# define LOAD_ARGS_1(x0) \ + long _x0tmp = (long) (x0); \ + LOAD_ARGS_0 () \ + _x0 = _x0tmp; +# define ASM_ARGS_1 "r" (_x0) +# define LOAD_ARGS_2(x0, x1) \ + long _x1tmp = (long) (x1); \ + LOAD_ARGS_1 (x0) \ + register long _x1 asm ("x1") = _x1tmp; +# define ASM_ARGS_2 ASM_ARGS_1, "r" (_x1) +# define LOAD_ARGS_3(x0, x1, x2) \ + long _x2tmp = (long) (x2); \ + LOAD_ARGS_2 (x0, x1) \ + register long _x2 asm ("x2") = _x2tmp; +# define ASM_ARGS_3 ASM_ARGS_2, "r" (_x2) +# define LOAD_ARGS_4(x0, x1, x2, x3) \ + long _x3tmp = (long) (x3); \ + LOAD_ARGS_3 (x0, x1, x2) \ + register long _x3 asm ("x3") = _x3tmp; +# define ASM_ARGS_4 ASM_ARGS_3, "r" (_x3) +# define LOAD_ARGS_5(x0, x1, x2, x3, x4) \ + long _x4tmp = (long) (x4); \ + LOAD_ARGS_4 (x0, x1, x2, x3) \ + register long _x4 asm ("x4") = _x4tmp; +# define ASM_ARGS_5 ASM_ARGS_4, "r" (_x4) +# define LOAD_ARGS_6(x0, x1, x2, x3, x4, x5) \ + long _x5tmp = (long) (x5); \ + LOAD_ARGS_5 (x0, x1, x2, x3, x4) \ + register long _x5 asm ("x5") = _x5tmp; +# define ASM_ARGS_6 ASM_ARGS_5, "r" (_x5) +# define LOAD_ARGS_7(x0, x1, x2, x3, x4, x5, x6)\ + long _x6tmp = (long) (x6); \ + LOAD_ARGS_6 (x0, x1, x2, x3, x4, x5) \ + register long _x6 asm ("x6") = _x6tmp; +# define ASM_ARGS_7 ASM_ARGS_6, "r" (_x6) + +# undef INTERNAL_SYSCALL_NCS +# define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \ + INTERNAL_SYSCALL_RAW (number, err, nr, args) + #endif #ifdef __i386__ @@ -539,10 +635,14 @@ int main (int argc, char **argv) p = mempcpy (p, LSBLDSO, sizeof LSBLDSO - 1); *p++ = '.'; strcpy (p, LSBVER); +#if defined(__NR_symlink) if (is_ia64 ()) INTERNAL_SYSCALL (symlink, err, 2, "/emul/ia32-linux/lib/" LDSO, buf); else INTERNAL_SYSCALL (symlink, err, 2, LDSO, buf); +#elif defined(__NR_symlinkat) + INTERNAL_SYSCALL (symlinkat, err, 3, AT_FDCWD, LDSO, buf); +#endif p = NULL; } INTERNAL_SYSCALL (exit, err, 1, 0); @@ -682,7 +682,7 @@ int __libc_start_main (int argc, char **argv, char **ev, void *auxvec, void (*rtld_fini) (void), struct startup_info *stinfo, char **stack_on_entry) -#elif defined __arm__ +#elif defined __arm__ || defined __aarch64__ int ___libc_start_main (int (*main) (int argc, char **argv), int argc, char **argv,