commit: f4c6bf434459d2d7b57c003e4eab81f2f8c21f51 Author: Mike Gilbert <floppym <AT> gentoo <DOT> org> AuthorDate: Sat Jul 8 02:50:02 2023 +0000 Commit: Mike Gilbert <floppym <AT> gentoo <DOT> org> CommitDate: Sat Jul 8 03:05:11 2023 +0000 URL: https://gitweb.gentoo.org/proj/sandbox.git/commit/?id=f4c6bf43
libsandbox/trace: fix syscall cancellation on arm64 arm64 has a dedicated regset to manipulate the system call number. See kernel commit 766a85d7bc5d7f1ddd6de28bdb844eae45ec63b0. Bug: https://bugs.gentoo.org/909416 Signed-off-by: Mike Gilbert <floppym <AT> gentoo.org> libsandbox/trace/linux/aarch64.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/libsandbox/trace/linux/aarch64.c b/libsandbox/trace/linux/aarch64.c index d056259..8f32912 100644 --- a/libsandbox/trace/linux/aarch64.c +++ b/libsandbox/trace/linux/aarch64.c @@ -1,5 +1,4 @@ #define trace_reg_ret regs[0] /* x0 */ -#define trace_reg_sysnum regs[8] /* w0 */ #undef trace_get_regs static long trace_get_regs(void *vregs) @@ -29,3 +28,23 @@ static unsigned long trace_arg(void *vregs, int num) else return -1; } + +static int trace_get_sysnum(void *vregs) +{ + int nr; + struct iovec iov_nr = { + .iov_base = &nr, + .iov_len = sizeof(nr), + }; + do_ptrace(PTRACE_GETREGSET, NT_ARM_SYSTEM_CALL, &iov_nr); + return nr; +} + +static void trace_set_sysnum(void *vregs, int nr) +{ + struct iovec iov_nr = { + .iov_base = &nr, + .iov_len = sizeof(nr), + }; + do_ptrace(PTRACE_SETREGSET, NT_ARM_SYSTEM_CALL, &iov_nr); +}
