|
@@ -265,6 +265,21 @@ int do_syscall_trace_enter(struct pt_regs *regs)
|
|
|
|
|
|
void do_syscall_trace_exit(struct pt_regs *regs)
|
|
|
{
|
|
|
+ long errno;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * The standard tile calling convention returns the value (or negative
|
|
|
+ * errno) in r0, and zero (or positive errno) in r1.
|
|
|
+ * It saves a couple of cycles on the hot path to do this work in
|
|
|
+ * registers only as we return, rather than updating the in-memory
|
|
|
+ * struct ptregs.
|
|
|
+ */
|
|
|
+ errno = (long) regs->regs[0];
|
|
|
+ if (errno < 0 && errno > -4096)
|
|
|
+ regs->regs[1] = -errno;
|
|
|
+ else
|
|
|
+ regs->regs[1] = 0;
|
|
|
+
|
|
|
if (test_thread_flag(TIF_SYSCALL_TRACE))
|
|
|
tracehook_report_syscall_exit(regs, 0);
|
|
|
|