public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
* [glibc/azanella/syscall-refactor] arm: Add internal_syscall
@ 2020-06-29 21:45 Adhemerval Zanella
  0 siblings, 0 replies; only message in thread
From: Adhemerval Zanella @ 2020-06-29 21:45 UTC (permalink / raw)
  To: glibc-cvs

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=823d60dc52568b486f882eb41ee73572ce622d1e

commit 823d60dc52568b486f882eb41ee73572ce622d1e
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Thu May 21 18:42:29 2020 -0300

    arm: Add internal_syscall

Diff:
---
 sysdeps/unix/sysv/linux/arm/brk.c        |   2 +-
 sysdeps/unix/sysv/linux/arm/dl-machine.h |   2 +-
 sysdeps/unix/sysv/linux/arm/sysdep.h     | 195 +++++++++++++++++++++++++++++++
 sysdeps/unix/sysv/linux/arm/tls.h        |   8 +-
 4 files changed, 200 insertions(+), 7 deletions(-)

diff --git a/sysdeps/unix/sysv/linux/arm/brk.c b/sysdeps/unix/sysv/linux/arm/brk.c
index d4878939ae..22dfc90e2e 100644
--- a/sysdeps/unix/sysv/linux/arm/brk.c
+++ b/sysdeps/unix/sysv/linux/arm/brk.c
@@ -28,7 +28,7 @@ __brk (void *addr)
 {
   void *newbrk;
 
-  __curbrk = newbrk = (void *) INLINE_SYSCALL (brk, 1, addr);
+  __curbrk = newbrk = (void *) inline_syscall (__NR_brk, addr);
 
   if (newbrk < addr)
     {
diff --git a/sysdeps/unix/sysv/linux/arm/dl-machine.h b/sysdeps/unix/sysv/linux/arm/dl-machine.h
index a307326e9c..a36b3f58db 100644
--- a/sysdeps/unix/sysv/linux/arm/dl-machine.h
+++ b/sysdeps/unix/sysv/linux/arm/dl-machine.h
@@ -20,7 +20,7 @@
 
 /* This definition is Linux-specific.  */
 #define CLEAR_CACHE(BEG,END)                                            \
-  INTERNAL_SYSCALL_CALL (cacheflush, (BEG), (END), 0)
+  internal_syscall (__NR_cacheflush, (BEG), (END), 0)
 
 #endif
 
diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h
index 26b3ef5cec..9c0aff26eb 100644
--- a/sysdeps/unix/sysv/linux/arm/sysdep.h
+++ b/sysdeps/unix/sysv/linux/arm/sysdep.h
@@ -408,6 +408,201 @@ __local_syscall_error:						\
 #define INTERNAL_SYSCALL_NCS(number, nr, args...)              \
   INTERNAL_SYSCALL_RAW (number, nr, args)
 
+static inline long int
+__internal_syscall0 (long int name)
+{
+#if defined(__thumb__)
+  register int a1 asm ("a1");
+  register int nr asm ("ip") = name;
+  asm volatile ("bl __libc_do_syscall"
+		: "=r" (a1)
+		: "r" (nr)
+		: "memory", "lr");
+  return a1;
+#else
+  register int a1 asm ("r0");
+  register int nr asm ("r7") = name;
+  asm volatile ("swi 0x0"
+		: "=r" (a1)
+		: "r" (nr)
+		: "memory");
+  return a1;
+#endif
+}
+
+static inline long int
+__internal_syscall1 (long int name, __syscall_arg_t arg1)
+{
+#if defined(__thumb__)
+  register int a1 asm ("a1") = arg1;
+  register int nr asm ("ip") = name;
+  asm volatile ("bl __libc_do_syscall"
+		: "=r" (a1)
+		: "r" (nr), "r" (a1)
+		: "memory", "lr");
+  return a1;
+#else
+  register int a1 asm ("r0") = arg1;
+  register int nr asm ("r7") = name;
+  asm volatile ("swi 0x0"
+		: "=r" (a1)
+		: "r" (nr), "r" (a1)
+		: "memory");
+  return a1;
+#endif
+}
+
+static inline long int
+__internal_syscall2 (long int name, __syscall_arg_t arg1,
+		     __syscall_arg_t arg2)
+{
+#if defined(__thumb__)
+  register int a1 asm ("a1") = arg1;
+  register int a2 asm ("a2") = arg1;
+  register int nr asm ("ip") = name;
+  asm volatile ("bl __libc_do_syscall"
+		: "=r" (a1)
+		: "r" (nr), "r" (a1), "r" (a2)
+		: "memory", "lr");
+  return a1;
+#else
+  register int a1 asm ("r0") = arg1;
+  register int a2 asm ("a2") = arg2;
+  register int nr asm ("r7") = name;
+  asm volatile ("swi 0x0"
+		: "=r" (a1)
+		: "r" (nr), "r" (a1), "r" (a2)
+		: "memory");
+  return a1;
+#endif
+}
+
+static inline long int
+__internal_syscall3 (long int name, __syscall_arg_t arg1,
+		     __syscall_arg_t arg2, __syscall_arg_t arg3)
+{
+#if defined(__thumb__)
+  register int a1 asm ("a1") = arg1;
+  register int a2 asm ("a2") = arg1;
+  register int a3 asm ("a3") = arg3;
+  register int nr asm ("ip") = name;
+  asm volatile ("bl __libc_do_syscall"
+		: "=r" (a1)
+		: "r" (nr), "r" (a1), "r" (a2), "r" (a3)
+		: "memory", "lr");
+  return a1;
+#else
+  register int a1 asm ("r0") = arg1;
+  register int a2 asm ("a2") = arg2;
+  register int a3 asm ("a3") = arg3;
+  register int nr asm ("r7") = name;
+  asm volatile ("swi 0x0"
+		: "=r" (a1)
+		: "r" (nr), "r" (a1), "r" (a2), "r" (a3)
+		: "memory");
+  return a1;
+#endif
+}
+
+static inline long int
+__internal_syscall4 (long int name, __syscall_arg_t arg1,
+		     __syscall_arg_t arg2, __syscall_arg_t arg3,
+		     __syscall_arg_t arg4)
+{
+#if defined(__thumb__)
+  register int a1 asm ("a1") = arg1;
+  register int a2 asm ("a2") = arg1;
+  register int a3 asm ("a3") = arg3;
+  register int a4 asm ("a4") = arg4;
+  register int nr asm ("ip") = name;
+  asm volatile ("bl __libc_do_syscall"
+		: "=r" (a1)
+		: "r" (nr), "r" (a1), "r" (a2), "r" (a3), "r" (a4)
+		: "memory", "lr");
+  return a1;
+#else
+  register int a1 asm ("r0") = arg1;
+  register int a2 asm ("a2") = arg2;
+  register int a3 asm ("a3") = arg3;
+  register int a4 asm ("a4") = arg4;
+  register int nr asm ("r7") = name;
+  asm volatile ("swi 0x0"
+		: "=r" (a1)
+		: "r" (nr), "r" (a1), "r" (a2), "r" (a3), "r" (a4)
+		: "memory");
+  return a1;
+#endif
+}
+
+static inline long int
+__internal_syscall5 (long int name, __syscall_arg_t arg1,
+		     __syscall_arg_t arg2, __syscall_arg_t arg3,
+		     __syscall_arg_t arg4, __syscall_arg_t arg5)
+{
+#if defined(__thumb__)
+  register int a1 asm ("a1") = arg1;
+  register int a2 asm ("a2") = arg1;
+  register int a3 asm ("a3") = arg3;
+  register int a4 asm ("a4") = arg4;
+  register int a5 asm ("v1") = arg5;
+  register int nr asm ("ip") = name;
+  asm volatile ("bl __libc_do_syscall"
+		: "=r" (a1)
+		: "r" (nr), "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5)
+		: "memory", "lr");
+  return a1;
+#else
+  register int a1 asm ("r0") = arg1;
+  register int a2 asm ("a2") = arg2;
+  register int a3 asm ("a3") = arg3;
+  register int a4 asm ("a4") = arg4;
+  register int a5 asm ("v1") = arg5;
+  register int nr asm ("r7") = name;
+  asm volatile ("swi 0x0"
+		: "=r" (a1)
+		: "r" (nr), "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5)
+		: "memory");
+  return a1;
+#endif
+}
+
+static inline long int
+__internal_syscall6 (long int name, __syscall_arg_t arg1,
+		     __syscall_arg_t arg2, __syscall_arg_t arg3,
+		     __syscall_arg_t arg4, __syscall_arg_t arg5,
+		     __syscall_arg_t arg6)
+{
+#if defined(__thumb__)
+  register int a1 asm ("a1") = arg1;
+  register int a2 asm ("a2") = arg1;
+  register int a3 asm ("a3") = arg3;
+  register int a4 asm ("a4") = arg4;
+  register int a5 asm ("v1") = arg5;
+  register int a6 asm ("v2") = arg6;
+  register int nr asm ("ip") = name;
+  asm volatile ("bl __libc_do_syscall"
+		: "=r" (a1)
+		: "r" (nr), "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5),
+		  "r" (a6)
+		: "memory", "lr");
+  return a1;
+#else
+  register int a1 asm ("r0") = arg1;
+  register int a2 asm ("a2") = arg2;
+  register int a3 asm ("a3") = arg3;
+  register int a4 asm ("a4") = arg4;
+  register int a5 asm ("v1") = arg5;
+  register int a6 asm ("v2") = arg6;
+  register int nr asm ("r7") = name;
+  asm volatile ("swi 0x0"
+		: "=r" (a1)
+		: "r" (nr), "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5),
+		  "r" (a6)
+		: "memory");
+  return a1;
+#endif
+}
+
 #define SINGLE_THREAD_BY_GLOBAL	1
 
 #endif	/* __ASSEMBLER__ */
diff --git a/sysdeps/unix/sysv/linux/arm/tls.h b/sysdeps/unix/sysv/linux/arm/tls.h
index 57b583dbd8..4b4aff69ae 100644
--- a/sysdeps/unix/sysv/linux/arm/tls.h
+++ b/sysdeps/unix/sysv/linux/arm/tls.h
@@ -29,12 +29,10 @@
 
 /* Code to initially initialize the thread pointer.  This might need
    special attention since 'errno' is not yet available and if the
-   operation can cause a failure 'errno' must not be touched.  */
+   operation can cause a failure 'errno' must not be touched.
+   Note: __NR_set_tls does not fail.  */
 # define TLS_INIT_TP(tcbp) \
-  ({ long int result_var;						\
-     result_var = INTERNAL_SYSCALL_CALL (set_tls, (tcbp));		\
-     INTERNAL_SYSCALL_ERROR_P (result_var)				\
-       ? "unknown error" : NULL; })
+  ({ internal_syscall (__NR_set_tls, (tcbp)); NULL; })
 
 #endif /* __ASSEMBLER__ */


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-06-29 21:45 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:45 [glibc/azanella/syscall-refactor] arm: Add internal_syscall 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).