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

Message ID 20221212203101.1034916-27-pedro@palves.net
State New
Headers
Series Step over thread clone and thread exit |

Commit Message

Pedro Alves Dec. 12, 2022, 8:30 p.m. UTC
  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

Andrew Burgess June 10, 2023, 10:33 a.m. UTC | #1
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
  

Patch

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