gdb/testsuite/lib/my-syscalls.S: Refactor new SYSCALL macro

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
This commit is contained in:
Pedro Alves
2021-07-02 11:46:40 +01:00
parent 5e407d08c7
commit 09a31034a7

View File

@@ -21,38 +21,52 @@
#include <asm/unistd.h> #include <asm/unistd.h>
/* int my_execve (const char *file, char *argv[], char *envp[]); */ /* The SYSCALL macro below current supports calling syscalls with up
to 3 arguments, and, assumes the syscall never returns, like exec
.global my_execve and exit. If you need to call syscalls with more arguments or you
my_execve: 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__) #if defined(__x86_64__)
mov $__NR_execve, %rax #define SYSCALL(NAME, NR) \
/* rdi, rsi and rdx already contain the right arguments. */ .global NAME ;\
my_execve_syscall: NAME: ;\
syscall mov $NR, %rax ;\
ret /* rdi, rsi and rdx already contain the right arguments. */ \
NAME ## _syscall: ;\
syscall ;\
ret ;
#elif defined(__i386__) #elif defined(__i386__)
mov $__NR_execve, %eax #define SYSCALL(NAME, NR) \
mov 4(%esp), %ebx .global NAME ;\
mov 8(%esp), %ecx NAME: ;\
mov 12(%esp), %edx mov $NR, %eax ;\
my_execve_syscall: mov 4(%esp), %ebx ;\
int $0x80 mov 8(%esp), %ecx ;\
mov 12(%esp), %edx ;\
NAME ## _syscall: ;\
int $0x80 ;\
ret ret
#elif defined(__aarch64__) #elif defined(__aarch64__)
mov x8, #__NR_execve #define SYSCALL(NAME, NR) \
/* x0, x1 and x2 already contain the right arguments. */ .global NAME ;\
my_execve_syscall: NAME: ;\
mov x8, NR ;\
/* x0, x1 and x2 already contain the right arguments. */ \
NAME ## _syscall: ;\
svc #0 svc #0
#else #else
# error "Unsupported architecture" # error "Unsupported architecture"
#endif #endif
SYSCALL (my_execve, __NR_execve)
.section .note.GNU-stack,"",@progbits .section .note.GNU-stack,"",@progbits