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).