[26/31] gdb/testsuite/lib/my-syscalls.S: Refactor new SYSCALL macro
Commit Message
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
---
gdb/testsuite/lib/my-syscalls.S | 50 +++++++++++++++++++++------------
1 file changed, 32 insertions(+), 18 deletions(-)
Comments
Pedro Alves <pedro@palves.net> writes:
> 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.
LGTM.
Reviewed-By: Andrew Burgess <aburgess@redhat.com>
Thanks,
Andrew
>
> Change-Id: I8acf1463b11a084d6b4579aaffb49b5d0dea3bba
> ---
> gdb/testsuite/lib/my-syscalls.S | 50 +++++++++++++++++++++------------
> 1 file changed, 32 insertions(+), 18 deletions(-)
>
> diff --git a/gdb/testsuite/lib/my-syscalls.S b/gdb/testsuite/lib/my-syscalls.S
> index 7f06f9c398b..6fb53624f31 100644
> --- a/gdb/testsuite/lib/my-syscalls.S
> +++ b/gdb/testsuite/lib/my-syscalls.S
> @@ -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
> --
> 2.36.0
@@ -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