diff mbox series

[v2,1/2] x86_64: Set the syscall register right before doing the syscall.

Message ID 20230412211104.2609738-2-josimmon@redhat.com
State New
Headers show
Series x86_64: aarch64: Set call number just before syscall | expand

Commit Message

Joe Simmons-Talbott April 12, 2023, 9:11 p.m. UTC
To make identifying syscalls easier during call tree analysis load the
syscall number just before performing the syscall.
---
 sysdeps/unix/sysv/linux/x86_64/sysdep.h | 33 +++++++++++++++++++++++++
 1 file changed, 33 insertions(+)
diff mbox series

Patch

diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
index cfb51be8c5..800a56723f 100644
--- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
@@ -250,12 +250,20 @@ 
     (long int) resultvar;						\
 })
 
+#define MSTR_HELPER(x) #x
+#define MSTR(x) MSTR_HELPER(x)
+
 #undef internal_syscall1
 #define internal_syscall1(number, arg1)					\
 ({									\
     unsigned long int resultvar;					\
     TYPEFY (arg1, __arg1) = ARGIFY (arg1);			 	\
     register TYPEFY (arg1, _a1) asm ("rdi") = __arg1;			\
+    if (__builtin_constant_p(number))                        \
+      asm volatile ("movl $" MSTR(number) ", %%eax\n\t" \
+        : /* no outputs */                                   \
+        : "i" (number)                                       \
+		: "eax");                                            \
     asm volatile (							\
     "syscall\n\t"							\
     : "=a" (resultvar)							\
@@ -272,6 +280,11 @@ 
     TYPEFY (arg1, __arg1) = ARGIFY (arg1);			 	\
     register TYPEFY (arg2, _a2) asm ("rsi") = __arg2;			\
     register TYPEFY (arg1, _a1) asm ("rdi") = __arg1;			\
+    if (__builtin_constant_p(number))                        \
+      asm volatile ("movl $" MSTR(number) ", %%eax\n\t" \
+        : /* no outputs */                                   \
+        : "i" (number)                                       \
+		: "eax");                                            \
     asm volatile (							\
     "syscall\n\t"							\
     : "=a" (resultvar)							\
@@ -290,6 +303,11 @@ 
     register TYPEFY (arg3, _a3) asm ("rdx") = __arg3;			\
     register TYPEFY (arg2, _a2) asm ("rsi") = __arg2;			\
     register TYPEFY (arg1, _a1) asm ("rdi") = __arg1;			\
+    if (__builtin_constant_p(number))                        \
+      asm volatile ("movl $" MSTR(number) ", %%eax\n\t" \
+        : /* no outputs */                                   \
+        : "i" (number)                                       \
+		: "eax");                                            \
     asm volatile (							\
     "syscall\n\t"							\
     : "=a" (resultvar)							\
@@ -310,6 +328,11 @@ 
     register TYPEFY (arg3, _a3) asm ("rdx") = __arg3;			\
     register TYPEFY (arg2, _a2) asm ("rsi") = __arg2;			\
     register TYPEFY (arg1, _a1) asm ("rdi") = __arg1;			\
+    if (__builtin_constant_p(number))                        \
+      asm volatile ("movl $" MSTR(number) ", %%eax\n\t" \
+        : /* no outputs */                                   \
+        : "i" (number)                                       \
+		: "eax");                                            \
     asm volatile (							\
     "syscall\n\t"							\
     : "=a" (resultvar)							\
@@ -332,6 +355,11 @@ 
     register TYPEFY (arg3, _a3) asm ("rdx") = __arg3;			\
     register TYPEFY (arg2, _a2) asm ("rsi") = __arg2;			\
     register TYPEFY (arg1, _a1) asm ("rdi") = __arg1;			\
+    if (__builtin_constant_p(number))                        \
+      asm volatile ("movl $" MSTR(number) ", %%eax\n\t" \
+        : /* no outputs */                                   \
+        : "i" (number)                                       \
+		: "eax");                                            \
     asm volatile (							\
     "syscall\n\t"							\
     : "=a" (resultvar)							\
@@ -357,6 +385,11 @@ 
     register TYPEFY (arg3, _a3) asm ("rdx") = __arg3;			\
     register TYPEFY (arg2, _a2) asm ("rsi") = __arg2;			\
     register TYPEFY (arg1, _a1) asm ("rdi") = __arg1;			\
+    if (__builtin_constant_p(number))                        \
+      asm volatile ("movl $" MSTR(number) ", %%eax\n\t" \
+        : /* no outputs */                                   \
+        : "i" (number)                                       \
+		: "eax");                                            \
     asm volatile (							\
     "syscall\n\t"							\
     : "=a" (resultvar)							\