]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
dtrace: stub syscall fixes for 3.18.
authorNick Alcock <nick.alcock@oracle.com>
Fri, 12 Dec 2014 19:28:55 +0000 (19:28 +0000)
committerNick Alcock <nick.alcock@oracle.com>
Tue, 21 Jul 2015 14:29:53 +0000 (15:29 +0100)
Fallout from Al Viro's pt_regs argument excision in 3.9.

Orabug: 20456825

Signed-off-by: Nick Alcock <nick.alcock@oracle.com>
Acked-by: Kris Van Hees <kris.van.hees@oracle.com>
arch/x86/kernel/dtrace_syscall.c
arch/x86/kernel/dtrace_syscall_stubs.S

index 85c9c1043785b6a4e43321a58f8ea8a2535d3eb4..a31fe68c9c4e0723f0b3026bebd531f60e84de05 100644 (file)
@@ -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 = &current->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,
index b10a6a97847ad983cae52fdc458defcbe92f6427..285ebb5671880bbe3d05e3e99ae29f9bdc7f5a5d 100644 (file)
        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