Re: [PATCH 26/31] gdb/testsuite/lib/my-syscalls.S: Refactor new SYSCALL macro

Andrew Burgess via Gdb-patches
2023-06-10T10:34:12Z

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