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

Andrew Burgess aburgess@redhat.com
Sat Jun 10 10:33:29 GMT 2023


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



More information about the Gdb-patches mailing list