return rc;
}
-long dtrace_sys_iopl(unsigned int level, struct pt_regs *regs)
+long dtrace_sys_iopl(unsigned int level)
{
long rc = 0;
dtrace_id_t id;
dtrace_syscalls_t *sc;
+ struct pt_regs *regs = current_pt_regs();
unsigned int old = (regs->flags >> 12) & 3;
struct thread_struct *t = ¤t->thread;
sc = &systrace_info.sysent[__NR_iopl];
+ /*
+ * regs is an argument de facto since it is plucked straight out of the
+ * stack frame by current_pt_regs().
+ */
+
if ((id = sc->stsy_entry) != DTRACE_IDNONE)
(*systrace_probe)(id, (uintptr_t)level, (uintptr_t)regs,
0, 0, 0, 0);
return rc;
}
-long dtrace_sys_rt_sigreturn(struct pt_regs *regs)
+long dtrace_sys_rt_sigreturn(void)
{
long rc = 0;
dtrace_id_t id;
dtrace_syscalls_t *sc;
+ struct pt_regs *regs = current_pt_regs();
sc = &systrace_info.sysent[__NR_rt_sigreturn];
+ /*
+ * regs is an argument de facto since it is plucked straight out of the
+ * stack frame by current_pt_regs().
+ */
+
if ((id = sc->stsy_entry) != DTRACE_IDNONE)
(*systrace_probe)(id, (uintptr_t)regs, 0, 0, 0, 0, 0);
* FIXME: Add stop functionality for DTrace.
*/
- rc = sys_rt_sigreturn(regs);
+ rc = sys_rt_sigreturn();
if ((id = sc->stsy_return) != DTRACE_IDNONE)
(*systrace_probe)(id, (uintptr_t)rc, (uintptr_t)rc,
CFI_REL_OFFSET r15, R15+\offset
.endm
-/*
- * Certain special system calls that need to save a complete full stack frame.
- */
- .macro PTREGSCALL label,func,arg
-ENTRY(\label)
- PARTIAL_FRAME 1 8 /* offset 8: return address */
- subq $REST_SKIP, %rsp
- CFI_ADJUST_CFA_OFFSET REST_SKIP
- call save_rest
- DEFAULT_FRAME 0 8 /* offset 8: return address */
- leaq 8(%rsp), \arg /* pt_regs pointer */
- call \func
- jmp ptregscall_common
- CFI_ENDPROC
-END(\label)
- .endm
-
.macro FORK_LIKE func
ENTRY(dtrace_stub_\func)
CFI_STARTPROC
END(dtrace_stub_\func)
.endm
+ .macro FIXED_FRAME label,func
+ENTRY(\label)
+ CFI_STARTPROC
+ PARTIAL_FRAME 0 8 /* offset 8: return address */
+ FIXUP_TOP_OF_STACK %r11, 8-ARGOFFSET
+ call \func
+ RESTORE_TOP_OF_STACK %r11, 8-ARGOFFSET
+ ret
+ CFI_ENDPROC
+END(\label)
+ .endm
+
FORK_LIKE clone
FORK_LIKE fork
FORK_LIKE vfork
- PTREGSCALL dtrace_stub_iopl, dtrace_sys_iopl, %rsi
+ FIXED_FRAME dtrace_stub_iopl, dtrace_sys_iopl
ENTRY(dtrace_stub_execve)
CFI_STARTPROC
SAVE_REST
FIXUP_TOP_OF_STACK %r11
call dtrace_sys_execve
- RESTORE_TOP_OF_STACK %r11
movq %rax,RAX(%rsp)
RESTORE_REST
jmp int_ret_from_sys_call
addq $8, %rsp
PARTIAL_FRAME 0
SAVE_REST
- movq %rsp,%rdi
FIXUP_TOP_OF_STACK %r11
call dtrace_sys_rt_sigreturn
movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer