|
@@ -669,8 +669,15 @@ ENDPROC(el0_svc)
|
|
|
* switches, and waiting for our parent to respond.
|
|
|
*/
|
|
|
__sys_trace:
|
|
|
- mov x0, sp
|
|
|
+ mov w0, #-1 // set default errno for
|
|
|
+ cmp scno, x0 // user-issued syscall(-1)
|
|
|
+ b.ne 1f
|
|
|
+ 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
|
|
|
uxtw scno, w0 // syscall number (possibly new)
|
|
|
mov x1, sp // pointer to regs
|
|
|
cmp scno, sc_nr // check upper syscall limit
|
|
@@ -683,7 +690,8 @@ __sys_trace:
|
|
|
blr x16 // call sys_* routine
|
|
|
|
|
|
__sys_trace_return:
|
|
|
- str x0, [sp] // save returned x0
|
|
|
+ str x0, [sp, #S_X0] // save returned x0
|
|
|
+__sys_trace_return_skipped:
|
|
|
mov x0, sp
|
|
|
bl syscall_trace_exit
|
|
|
b ret_to_user
|