public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
* [glibc/azanella/syscall-refactor] arm: Remove assembly syscall macros
@ 2020-06-29 21:49 Adhemerval Zanella
0 siblings, 0 replies; only message in thread
From: Adhemerval Zanella @ 2020-06-29 21:49 UTC (permalink / raw)
To: glibc-cvs
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=6351f0d6ad73dc52485fbb4dd979a492ee57cb40
commit 6351f0d6ad73dc52485fbb4dd979a492ee57cb40
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date: Wed Jun 24 18:28:15 2020 -0300
arm: Remove assembly syscall macros
Diff:
---
sysdeps/unix/sysv/linux/arm/____longjmp_chk.S | 2 +-
sysdeps/unix/sysv/linux/arm/clone.S | 6 +-
sysdeps/unix/sysv/linux/arm/sigrestorer.S | 4 +-
sysdeps/unix/sysv/linux/arm/syscall.S | 2 +-
sysdeps/unix/sysv/linux/arm/sysdep.h | 251 +-------------------------
sysdeps/unix/sysv/linux/arm/vfork.S | 15 +-
6 files changed, 19 insertions(+), 261 deletions(-)
diff --git a/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S b/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S
index 3c248c8142..6e51b0e450 100644
--- a/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S
@@ -56,7 +56,7 @@ longjmp_msg:
cfi_rel_offset (r7, 0); \
mov r5, r0; \
cfi_undefined (r5); \
- mov r7, #SYS_ify(sigaltstack); \
+ mov r7, #__NR_sigaltstack; \
mov r0, #0; \
sub sp, sp, #12; /* == sizeof (stack_t) */ \
cfi_adjust_cfa_offset (12); \
diff --git a/sysdeps/unix/sysv/linux/arm/clone.S b/sysdeps/unix/sysv/linux/arm/clone.S
index 2671d031c3..fadf904943 100644
--- a/sysdeps/unix/sysv/linux/arm/clone.S
+++ b/sysdeps/unix/sysv/linux/arm/clone.S
@@ -52,7 +52,7 @@ ENTRY(__clone)
ldr r2, [sp, #8]
ldr r3, [sp, #12]
ldr r4, [sp, #16]
- ldr r7, =SYS_ify(clone)
+ ldr r7, =__NR_clone
swi 0x0
cfi_endproc
cmp r0, #0
@@ -62,7 +62,7 @@ ENTRY(__clone)
RETINSTR(, lr)
cfi_startproc
-PSEUDO_END (__clone)
+END (__clone)
1:
.fnstart
@@ -73,7 +73,7 @@ PSEUDO_END (__clone)
BLX (ip)
@ and we are done, passing the return value through r0
- ldr r7, =SYS_ify(exit)
+ ldr r7, =__NR_exit
swi 0x0
.fnend
diff --git a/sysdeps/unix/sysv/linux/arm/sigrestorer.S b/sysdeps/unix/sysv/linux/arm/sigrestorer.S
index 2e2ec0d62a..383e19bb6c 100644
--- a/sysdeps/unix/sysv/linux/arm/sigrestorer.S
+++ b/sysdeps/unix/sysv/linux/arm/sigrestorer.S
@@ -64,7 +64,7 @@
nop
ENTRY(__default_sa_restorer)
CFI
- mov r7, $SYS_ify(sigreturn)
+ mov r7, $__NR_sigreturn
swi 0x0
.fnend
END(__default_sa_restorer)
@@ -77,7 +77,7 @@ END(__default_sa_restorer)
nop
ENTRY(__default_rt_sa_restorer)
CFI
- mov r7, $SYS_ify(rt_sigreturn)
+ mov r7, $__NR_rt_sigreturn
swi 0x0
.fnend
END(__default_rt_sa_restorer)
diff --git a/sysdeps/unix/sysv/linux/arm/syscall.S b/sysdeps/unix/sysv/linux/arm/syscall.S
index 8ebf6644fc..dde4aa2a40 100644
--- a/sysdeps/unix/sysv/linux/arm/syscall.S
+++ b/sysdeps/unix/sysv/linux/arm/syscall.S
@@ -45,4 +45,4 @@ ENTRY (syscall)
it cc
RETINSTR(cc, lr)
b PLTJMP(syscall_error)
-PSEUDO_END (syscall)
+END (syscall)
diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h
index fe532d5d75..f65da0731e 100644
--- a/sysdeps/unix/sysv/linux/arm/sysdep.h
+++ b/sysdeps/unix/sysv/linux/arm/sysdep.h
@@ -24,159 +24,16 @@
#include <sysdeps/unix/sysv/linux/sysdep.h>
#include <sysdeps/unix/arm/sysdep.h>
-/* Defines RTLD_PRIVATE_ERRNO and USE_DL_SYSINFO. */
-#include <dl-sysdep.h>
-
-/* For Linux we can use the system call table in the header file
- /usr/include/asm/unistd.h
- of the kernel. But these symbols do not follow the SYS_* syntax
- so we have to redefine the `SYS_ify' macro here. */
-#undef SYS_ify
-#define SYS_ify(syscall_name) (__NR_##syscall_name)
-
#include <bits/hwcap.h>
-#ifdef __ASSEMBLER__
-
-#ifndef ARCH_HAS_HARD_TP
-/* Internal macro calling the linux kernel kuser_get_tls helper.
- Note that in thumb mode, a constant pool break is often out of range, so
- we always expand the constant inline. */
-# ifdef __thumb2__
-# define GET_TLS_BODY \
- movw r0, #0x0fe0; \
- movt r0, #0xffff; \
- blx r0
-# else
-# define GET_TLS_BODY \
- mov r0, #0xffff0fff; /* Point to the high page. */ \
- mov lr, pc; /* Save our return address. */ \
- sub pc, r0, #31 /* Jump to the TLS entry. */
-# endif
-
-/* Helper to get the TLS base pointer. Save LR in TMP, return in R0,
- and no other registers clobbered. TMP may be LR itself to indicate
- that no save is necessary. */
-# undef GET_TLS
-# define GET_TLS(TMP) \
- .ifnc TMP, lr; \
- mov TMP, lr; \
- cfi_register (lr, TMP); \
- GET_TLS_BODY; \
- mov lr, TMP; \
- cfi_restore (lr); \
- .else; \
- GET_TLS_BODY; \
- .endif
-#endif /* ARCH_HAS_HARD_TP */
-
-/* Linux uses a negative return value to indicate syscall errors,
- unlike most Unices, which use the condition codes' carry flag.
-
- Since version 2.1 the return value of a system call might be
- negative even if the call succeeded. E.g., the `lseek' system call
- might return a large offset. Therefore we must not anymore test
- for < 0, but test for a real error by making sure the value in R0
- is a real error number. Linus said he will make sure the no syscall
- returns a value in -1 .. -4095 as a valid result so we can safely
- test with -4095. */
-
-#undef PSEUDO
-#define PSEUDO(name, syscall_name, args) \
- .text; \
- ENTRY (name); \
- DO_CALL (syscall_name, args); \
- cmn r0, $4096;
-
-#define PSEUDO_RET \
- it cc; \
- RETINSTR(cc, lr); \
- b PLTJMP(SYSCALL_ERROR)
-#undef ret
-#define ret PSEUDO_RET
-
-#undef PSEUDO_END
-#define PSEUDO_END(name) \
- SYSCALL_ERROR_HANDLER; \
- END (name)
-
-#undef PSEUDO_NOERRNO
-#define PSEUDO_NOERRNO(name, syscall_name, args) \
- .text; \
- ENTRY (name); \
- DO_CALL (syscall_name, args);
-
-#define PSEUDO_RET_NOERRNO \
- DO_RET (lr);
-
-#undef ret_NOERRNO
-#define ret_NOERRNO PSEUDO_RET_NOERRNO
-
-#undef PSEUDO_END_NOERRNO
-#define PSEUDO_END_NOERRNO(name) \
- END (name)
-
-/* The function has to return the error code. */
-#undef PSEUDO_ERRVAL
-#define PSEUDO_ERRVAL(name, syscall_name, args) \
- .text; \
- ENTRY (name) \
- DO_CALL (syscall_name, args); \
- rsb r0, r0, #0
-
-#undef PSEUDO_END_ERRVAL
-#define PSEUDO_END_ERRVAL(name) \
- END (name)
-
-#define ret_ERRVAL PSEUDO_RET_NOERRNO
-
-#if !IS_IN (libc)
-# define SYSCALL_ERROR __local_syscall_error
-# if RTLD_PRIVATE_ERRNO
-# define SYSCALL_ERROR_HANDLER \
-__local_syscall_error: \
- rsb r0, r0, #0; \
- LDST_PCREL(str, r0, r1, C_SYMBOL_NAME(rtld_errno)); \
- mvn r0, #0; \
- DO_RET(lr)
-# else
-# if defined(__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__)
-# define POP_PC \
- pop { lr }; \
- cfi_adjust_cfa_offset (-4); \
- cfi_restore (lr); \
- bx lr
-# else
-# define POP_PC pop { pc }
-# endif
-# define SYSCALL_ERROR_HANDLER \
-__local_syscall_error: \
- push { lr }; \
- cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (lr, 0); \
- push { r0 }; \
- cfi_adjust_cfa_offset (4); \
- bl PLTJMP(C_SYMBOL_NAME(__errno_location)); \
- pop { r1 }; \
- cfi_adjust_cfa_offset (-4); \
- rsb r1, r1, #0; \
- str r1, [r0]; \
- mvn r0, #0; \
- POP_PC;
-# endif
-#else
-# define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
-# define SYSCALL_ERROR __syscall_error
-#endif
-
/* The ARM EABI user interface passes the syscall number in r7, instead
of in the swi. This is more efficient, because the kernel does not need
to fetch the swi from memory to find out the number; which can be painful
with separate I-cache and D-cache. Make sure to use 0 for the SWI
argument; otherwise the (optional) compatibility code for APCS binaries
- may be invoked. */
+ may be invoked.
-/* Linux takes system call args in registers:
+ Linux takes system call args in registers:
arg 1 r0
arg 2 r1
arg 3 r2
@@ -185,9 +42,7 @@ __local_syscall_error: \
arg 6 r5
arg 7 r6
- The compiler is going to form a call by coming here, through PSEUDO, with
- arguments
- syscall number in the DO_CALL macro
+ The compiler is going to form a call by coming here with arguments:
arg 1 r0
arg 2 r1
arg 3 r2
@@ -200,9 +55,7 @@ __local_syscall_error: \
caller's v1..v3 and stack frame are not corrupted, and the kernel
sees the right arguments.
-*/
-
-/* We must save and restore r7 (call-saved) for the syscall number.
+ We must save and restore r7 (call-saved) for the syscall number.
We never make function calls from inside here (only potentially
signal handlers), so we do not bother with doubleword alignment.
@@ -214,101 +67,7 @@ __local_syscall_error: \
The assembler will convert the literal pool load to a move for most
syscalls. */
-#undef DO_CALL
-#define DO_CALL(syscall_name, args) \
- DOARGS_##args; \
- ldr r7, =SYS_ify (syscall_name); \
- swi 0x0; \
- UNDOARGS_##args
-
-#undef DOARGS_0
-#define DOARGS_0 \
- .fnstart; \
- push { r7 }; \
- cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (r7, 0); \
- .save { r7 }
-#undef DOARGS_1
-#define DOARGS_1 DOARGS_0
-#undef DOARGS_2
-#define DOARGS_2 DOARGS_0
-#undef DOARGS_3
-#define DOARGS_3 DOARGS_0
-#undef DOARGS_4
-#define DOARGS_4 DOARGS_0
-#undef DOARGS_5
-#define DOARGS_5 \
- .fnstart; \
- push {r4, r7}; \
- cfi_adjust_cfa_offset (8); \
- cfi_rel_offset (r4, 0); \
- cfi_rel_offset (r7, 4); \
- .save { r4, r7 }; \
- ldr r4, [sp, #8]
-#undef DOARGS_6
-#define DOARGS_6 \
- .fnstart; \
- mov ip, sp; \
- push {r4, r5, r7}; \
- cfi_adjust_cfa_offset (12); \
- cfi_rel_offset (r4, 0); \
- cfi_rel_offset (r5, 4); \
- cfi_rel_offset (r7, 8); \
- .save { r4, r5, r7 }; \
- ldmia ip, {r4, r5}
-#undef DOARGS_7
-#define DOARGS_7 \
- .fnstart; \
- mov ip, sp; \
- push {r4, r5, r6, r7}; \
- cfi_adjust_cfa_offset (16); \
- cfi_rel_offset (r4, 0); \
- cfi_rel_offset (r5, 4); \
- cfi_rel_offset (r6, 8); \
- cfi_rel_offset (r7, 12); \
- .save { r4, r5, r6, r7 }; \
- ldmia ip, {r4, r5, r6}
-
-#undef UNDOARGS_0
-#define UNDOARGS_0 \
- pop {r7}; \
- cfi_adjust_cfa_offset (-4); \
- cfi_restore (r7); \
- .fnend
-#undef UNDOARGS_1
-#define UNDOARGS_1 UNDOARGS_0
-#undef UNDOARGS_2
-#define UNDOARGS_2 UNDOARGS_0
-#undef UNDOARGS_3
-#define UNDOARGS_3 UNDOARGS_0
-#undef UNDOARGS_4
-#define UNDOARGS_4 UNDOARGS_0
-#undef UNDOARGS_5
-#define UNDOARGS_5 \
- pop {r4, r7}; \
- cfi_adjust_cfa_offset (-8); \
- cfi_restore (r4); \
- cfi_restore (r7); \
- .fnend
-#undef UNDOARGS_6
-#define UNDOARGS_6 \
- pop {r4, r5, r7}; \
- cfi_adjust_cfa_offset (-12); \
- cfi_restore (r4); \
- cfi_restore (r5); \
- cfi_restore (r7); \
- .fnend
-#undef UNDOARGS_7
-#define UNDOARGS_7 \
- pop {r4, r5, r6, r7}; \
- cfi_adjust_cfa_offset (-16); \
- cfi_restore (r4); \
- cfi_restore (r5); \
- cfi_restore (r6); \
- cfi_restore (r7); \
- .fnend
-
-#else /* not __ASSEMBLER__ */
+#ifndef __ASSEMBLER__
#define VDSO_NAME "LINUX_2.6"
#define VDSO_HASH 61765110
diff --git a/sysdeps/unix/sysv/linux/arm/vfork.S b/sysdeps/unix/sysv/linux/arm/vfork.S
index fd88d4260a..7b63708cc5 100644
--- a/sysdeps/unix/sysv/linux/arm/vfork.S
+++ b/sysdeps/unix/sysv/linux/arm/vfork.S
@@ -28,18 +28,17 @@
and the process ID of the new process to the old process. */
ENTRY (__vfork)
- /* The DO_CALL macro saves r7 on the stack, to enable generation
- of ARM unwind info. Since the stack is initially shared between
- parent and child of vfork, that saved value could be corrupted.
- To avoid this problem, we save r7 into ip as well, and restore
- from there. */
+ /* Different than generic __internal_syscall macros that saves r7
+ on the stack, we save r7 into the ip, and restore from there.
+ It is because the stack is initially shared between parent and
+ child of vfork, thus the saved value could be corrupted. */
mov ip, r7
cfi_register (r7, ip)
.fnstart
push { r7 }
cfi_adjust_cfa_offset (4)
.save { r7 }
- ldr r7, =SYS_ify (vfork)
+ ldr r7, =__NR_vfork
swi 0x0
.fnend
add sp, sp, #4
@@ -51,8 +50,8 @@ ENTRY (__vfork)
it cc
RETINSTR(cc, lr)
- b PLTJMP(SYSCALL_ERROR)
-PSEUDO_END (__vfork)
+ b PLTJMP(syscall_error)
+END (__vfork)
libc_hidden_def (__vfork)
weak_alias (__vfork, vfork)
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-06-29 21:49 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-29 21:49 [glibc/azanella/syscall-refactor] arm: Remove assembly syscall macros Adhemerval Zanella
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).