Thread (17 messages) 17 messages, 3 authors, 2014-11-25

[PATCH v8 2/6] arm64: ptrace: allow tracer to skip a system call

From: AKASHI Takahiro <hidden>
Date: 2014-11-25 07:42:20
Also in: lkml

On 11/21/2014 04:17 AM, Will Deacon wrote:
On Thu, Nov 20, 2014 at 05:13:04AM +0000, AKASHI Takahiro wrote:
quoted
On 11/20/2014 04:06 AM, Will Deacon wrote:
quoted
On Wed, Nov 19, 2014 at 08:46:19AM +0000, AKASHI Takahiro wrote:
quoted
Syscall(-1) will return -ENOSYS whether or not a syscallno is explicitly
replaced with -1 by a tracer, and, in this sense, it is *skipped*.
Ok, but now userspace sees -ENOSYS for a skipped system call in that case,
whereas it would usually see whatever the trace put in x0, right?
If you don't really like this behavior, how about this patch instead of my [2/6] patch?
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
index 726b910..1ef57d0 100644
--- a/arch/arm64/kernel/entry.S
+++ b/arch/arm64/kernel/entry.S
@@ -668,8 +668,15 @@ ENDPROC(el0_svc)
           * switches, and waiting for our parent to respond.
           */
   __sys_trace:
+       cmp     w8, #-1                         // default errno for invalid
+       b.ne    1f                              // system call
+       mov     x0, #-ENOSYS
+       str     x0, [sp, #S_X0]
+1:
          mov     x0, sp
          bl      syscall_trace_enter
+       cmp     w0, #-1                         // skip the syscall?
+       b.eq    __sys_trace_return_skipped
          adr     lr, __sys_trace_return          // return address
          uxtw    scno, w0                        // syscall number (possibly new)
          mov     x1, sp                          // pointer to regs
@@ -684,6 +691,7 @@ __sys_trace:

   __sys_trace_return:
          str     x0, [sp]                        // save returned x0
+__sys_trace_return_skipped:
          mov     x0, sp
          bl      syscall_trace_exit
          b       ret_to_user
With this change, I believe, syscall(-1) returns -ENOSYS by default whether traced
or not, and still you can change a return value when tracing.
(But a drawback here is that a tracer will see -ENOSYS in x0 even at syscall entry
for syscall(-1).)
But it's exactly these drawbacks that I'm objected to. syscall(-1) shouldn't
be treated any differently to syscall(42) with respect to restarting,
exactly like x86.
Can you elaborate a bit more as to "restarting?"
We can't make any assumption about the number of arguments taken by *invalid* syscall(-1)
and so changing a value in x0 (or any other registers) doesn't make any difference.
()

-Takahiro AKASHI
Will
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help