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>
/* 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