arm64: ptrace: add PTRACE_SET_SYSCALL
authorAKASHI Takahiro <takahiro.akashi@linaro.org>
Thu, 4 Sep 2014 13:54:29 +0000 (14:54 +0100)
committerJP Abgrall <jpa@google.com>
Tue, 7 Oct 2014 22:15:31 +0000 (15:15 -0700)
Note: This patch is from v6 of Takahiro's proposed
"arm64: add seccomp support" patchset (leecam@google.com)

To allow tracer to be able to change/skip a system call by re-writing
a syscall number, there are several approaches:

(1) modify x8 register with ptrace(PTRACE_SETREGSET), and handle this case
    later on in syscall_trace_enter(), or
(2) support ptrace(PTRACE_SET_SYSCALL) as on arm

Thinking of the fact that user_pt_regs doesn't expose 'syscallno' to
tracer as well as that secure_computing() expects a changed syscall number
to be visible, especially case of -1, before this function returns in
syscall_trace_enter(), we'd better take (2).

Signed-off-by: AKASHI Takahiro <takahiro.akashi <at> linaro.org>
arch/arm64/include/uapi/asm/ptrace.h
arch/arm64/kernel/ptrace.c

index 6913643bbe54ebd5005bfeb74302329fa5e2d0f5..49c61746297d81398c544b48fc556d777f684235 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <asm/hwcap.h>
 
+#define PTRACE_SET_SYSCALL     23
 
 /*
  * PSR bits
index ee856d9f6f64e70c89e3eb1bef2d591e2b00c211..56a62ebf2bafb1696c2ca94b3af63952860804e8 100644 (file)
@@ -1064,7 +1064,19 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task)
 long arch_ptrace(struct task_struct *child, long request,
                 unsigned long addr, unsigned long data)
 {
-       return ptrace_request(child, request, addr, data);
+       int ret;
+
+       switch (request) {
+               case PTRACE_SET_SYSCALL:
+                       task_pt_regs(child)->syscallno = data;
+                       ret = 0;
+                       break;
+               default:
+                       ret = ptrace_request(child, request, addr, data);
+                       break;
+       }
+
+       return ret;
 }
 
 enum ptrace_syscall_dir {