From: Nick Alcock Date: Fri, 12 Dec 2014 19:28:55 +0000 (+0000) Subject: dtrace: stub syscall fixes for 3.18. X-Git-Tag: v4.1.12-92~313^2~25 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=7a4e1315ebecd02cb0b051d5b663bf8596ac073e;p=users%2Fjedix%2Flinux-maple.git dtrace: stub syscall fixes for 3.18. Fallout from Al Viro's pt_regs argument excision in 3.9. Orabug: 20456825 Signed-off-by: Nick Alcock Acked-by: Kris Van Hees --- diff --git a/arch/x86/kernel/dtrace_syscall.c b/arch/x86/kernel/dtrace_syscall.c index 85c9c1043785..a31fe68c9c4e 100644 --- a/arch/x86/kernel/dtrace_syscall.c +++ b/arch/x86/kernel/dtrace_syscall.c @@ -218,16 +218,22 @@ long dtrace_sys_execve(const char __user *name, 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); @@ -261,14 +267,20 @@ out: 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); @@ -276,7 +288,7 @@ long dtrace_sys_rt_sigreturn(struct pt_regs *regs) * 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, diff --git a/arch/x86/kernel/dtrace_syscall_stubs.S b/arch/x86/kernel/dtrace_syscall_stubs.S index b10a6a97847a..285ebb567188 100644 --- a/arch/x86/kernel/dtrace_syscall_stubs.S +++ b/arch/x86/kernel/dtrace_syscall_stubs.S @@ -141,23 +141,6 @@ 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 @@ -174,10 +157,22 @@ ENTRY(dtrace_stub_\func) 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 @@ -186,7 +181,6 @@ ENTRY(dtrace_stub_execve) 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 @@ -202,7 +196,6 @@ ENTRY(dtrace_stub_rt_sigreturn) 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