commit:     879cfbd1ec96b8690b70430b7d8b4b6ccd9ce7d8
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:07:44 2023 +0000
URL:        https://gitweb.gentoo.org/proj/sandbox.git/commit/?id=879cfbd1

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>
(cherry picked from commit f4c6bf434459d2d7b57c003e4eab81f2f8c21f51)

 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);
+}

Reply via email to