gdb/testsuite/lib/my-syscalls.S: Refactor new SYSCALL macro
authorPedro Alves <pedro@palves.net>
Fri, 2 Jul 2021 10:46:40 +0000 (11:46 +0100)
committerPedro Alves <pedro@palves.net>
Mon, 13 Nov 2023 14:16:11 +0000 (14:16 +0000)
Refactor the syscall assembly code in gdb/testsuite/lib/my-syscalls.S
behind a SYSCALL macro so that it's easy to add new syscalls without
duplicating code.

Note that the way the macro is implemented, it only works correctly
for syscalls with up to 3 arguments, and, if the syscall doesn't
return (the macro doesn't bother to save/restore callee-saved
registers).

The following patch will want to use the macro to define a wrapper for
the "exit" syscall, so the limitations continue to be sufficient.

Change-Id: I8acf1463b11a084d6b4579aaffb49b5d0dea3bba
Reviewed-By: Andrew Burgess <aburgess@redhat.com>
gdb/testsuite/lib/my-syscalls.S

index c0dbd0dffea83380379cdc9ab517cfa3d145e302..38299e45284ea7eb3ad20a6f2b66c11ed73653fc 100644 (file)
 
 #include <asm/unistd.h>
 
-/* int my_execve (const char *file, char *argv[], char *envp[]);  */
-
-.global my_execve
-my_execve:
+/* The SYSCALL macro below current supports calling syscalls with up
+   to 3 arguments, and, assumes the syscall never returns, like exec
+   and exit.  If you need to call syscalls with more arguments or you
+   need to call syscalls that actually return, you'll need to update
+   the macros.  We don't bother with optimizing setting up fewer
+   arguments for syscalls that take fewer arguments, as we're not
+   optimizating for speed or space, but for maintainability.  */
 
 #if defined(__x86_64__)
 
-       mov $__NR_execve, %rax
-       /* rdi, rsi and rdx already contain the right arguments.  */
-my_execve_syscall:
-       syscall
-       ret
+#define SYSCALL(NAME, NR)      \
+.global NAME                   ;\
+NAME:                          ;\
+       mov $NR, %rax           ;\
+       /* rdi, rsi and rdx already contain the right arguments.  */ \
+NAME ## _syscall:              ;\
+       syscall                 ;\
+       ret                     ;
 
 #elif defined(__i386__)
 
-       mov $__NR_execve, %eax
-       mov 4(%esp), %ebx
-       mov 8(%esp), %ecx
-       mov 12(%esp), %edx
-my_execve_syscall:
-       int $0x80
+#define SYSCALL(NAME, NR)      \
+.global NAME                   ;\
+NAME:                          ;\
+       mov $NR, %eax           ;\
+       mov 4(%esp), %ebx       ;\
+       mov 8(%esp), %ecx       ;\
+       mov 12(%esp), %edx      ;\
+NAME ## _syscall:              ;\
+       int $0x80               ;\
        ret
 
 #elif defined(__aarch64__)
 
-       mov x8, #__NR_execve
-       /* x0, x1 and x2 already contain the right arguments.  */
-my_execve_syscall:
+#define SYSCALL(NAME, NR)      \
+.global NAME                   ;\
+NAME:                          ;\
+       mov x8, NR              ;\
+       /* x0, x1 and x2 already contain the right arguments.  */ \
+NAME ## _syscall:              ;\
        svc #0
 
 #else
 # error "Unsupported architecture"
 #endif
 
+SYSCALL (my_execve, __NR_execve)
+
        .section        .note.GNU-stack,"",@progbits