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