forked from Imagelibrary/binutils-gdb
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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user