MIPS: Remove nabi_no_regargs
authorPaul Burton <paul.burton@mips.com>
Wed, 1 Aug 2018 20:12:42 +0000 (13:12 -0700)
committerPaul Burton <paul.burton@mips.com>
Wed, 1 Aug 2018 20:20:15 +0000 (13:20 -0700)
Our sigreturn functions make use of a macro named nabi_no_regargs to
declare 8 dummy arguments to a function, forcing the compiler to expect
a pt_regs structure on the stack rather than in argument registers. This
is an ugly hack which unnecessarily causes these sigreturn functions to
need to care about the calling convention of the ABI the kernel is built
for. Although this is abstracted via nabi_no_regargs, it's still ugly &
unnecessary.

Remove nabi_no_regargs & the struct pt_regs argument from sigreturn
functions, and instead use current_pt_regs() to find the struct pt_regs
on the stack, which works cleanly regardless of ABI.

Signed-off-by: Paul Burton <paul.burton@mips.com>
Patchwork: https://patchwork.linux-mips.org/patch/20106/
Cc: James Hogan <jhogan@kernel.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
arch/mips/include/asm/sim.h
arch/mips/kernel/signal.c
arch/mips/kernel/signal_n32.c
arch/mips/kernel/signal_o32.c

index 91831800c48074a4a56bcdd881fb6035d0c00ba8..59f31a95facd1911a48ab038e7c5f99f28650259 100644 (file)
@@ -39,8 +39,6 @@ __asm__(                                                              \
        ".end\t__" #symbol "\n\t"                                       \
        ".size\t__" #symbol",. - __" #symbol)
 
-#define nabi_no_regargs
-
 #endif /* CONFIG_32BIT */
 
 #ifdef CONFIG_64BIT
@@ -67,16 +65,6 @@ __asm__(                                                             \
        ".end\t__" #symbol "\n\t"                                       \
        ".size\t__" #symbol",. - __" #symbol)
 
-#define nabi_no_regargs                                                        \
-       unsigned long __dummy0,                                         \
-       unsigned long __dummy1,                                         \
-       unsigned long __dummy2,                                         \
-       unsigned long __dummy3,                                         \
-       unsigned long __dummy4,                                         \
-       unsigned long __dummy5,                                         \
-       unsigned long __dummy6,                                         \
-       unsigned long __dummy7,
-
 #endif /* CONFIG_64BIT */
 
 #endif /* _ASM_SIM_H */
index 00f2535d22269ae99ec67536878af535f0991b63..ed6023a74f7761e530f6d473ffb035d646a5628b 100644 (file)
@@ -592,13 +592,15 @@ SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act,
 #endif
 
 #ifdef CONFIG_TRAD_SIGNALS
-asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs)
+asmlinkage void sys_sigreturn(void)
 {
        struct sigframe __user *frame;
+       struct pt_regs *regs;
        sigset_t blocked;
        int sig;
 
-       frame = (struct sigframe __user *) regs.regs[29];
+       regs = current_pt_regs();
+       frame = (struct sigframe __user *)regs->regs[29];
        if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
                goto badframe;
        if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
@@ -606,7 +608,7 @@ asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs)
 
        set_current_blocked(&blocked);
 
-       sig = restore_sigcontext(&regs, &frame->sf_sc);
+       sig = restore_sigcontext(regs, &frame->sf_sc);
        if (sig < 0)
                goto badframe;
        else if (sig)
@@ -618,8 +620,8 @@ asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs)
        __asm__ __volatile__(
                "move\t$29, %0\n\t"
                "j\tsyscall_exit"
-               :/* no outputs */
-               :"r" (&regs));
+               : /* no outputs */
+               : "r" (regs));
        /* Unreached */
 
 badframe:
@@ -627,13 +629,15 @@ badframe:
 }
 #endif /* CONFIG_TRAD_SIGNALS */
 
-asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
+asmlinkage void sys_rt_sigreturn(void)
 {
        struct rt_sigframe __user *frame;
+       struct pt_regs *regs;
        sigset_t set;
        int sig;
 
-       frame = (struct rt_sigframe __user *) regs.regs[29];
+       regs = current_pt_regs();
+       frame = (struct rt_sigframe __user *)regs->regs[29];
        if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
                goto badframe;
        if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
@@ -641,7 +645,7 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
 
        set_current_blocked(&set);
 
-       sig = restore_sigcontext(&regs, &frame->rs_uc.uc_mcontext);
+       sig = restore_sigcontext(regs, &frame->rs_uc.uc_mcontext);
        if (sig < 0)
                goto badframe;
        else if (sig)
@@ -656,8 +660,8 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
        __asm__ __volatile__(
                "move\t$29, %0\n\t"
                "j\tsyscall_exit"
-               :/* no outputs */
-               :"r" (&regs));
+               : /* no outputs */
+               : "r" (regs));
        /* Unreached */
 
 badframe:
index b672cebb4a1a507144cfc85964e4b39ac5ee70fa..8f65aaf9206d1ba88ab0f68e580eb176aacd173e 100644 (file)
@@ -64,13 +64,15 @@ struct rt_sigframe_n32 {
        struct ucontextn32 rs_uc;
 };
 
-asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
+asmlinkage void sysn32_rt_sigreturn(void)
 {
        struct rt_sigframe_n32 __user *frame;
+       struct pt_regs *regs;
        sigset_t set;
        int sig;
 
-       frame = (struct rt_sigframe_n32 __user *) regs.regs[29];
+       regs = current_pt_regs();
+       frame = (struct rt_sigframe_n32 __user *)regs->regs[29];
        if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
                goto badframe;
        if (__copy_conv_sigset_from_user(&set, &frame->rs_uc.uc_sigmask))
@@ -78,7 +80,7 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
 
        set_current_blocked(&set);
 
-       sig = restore_sigcontext(&regs, &frame->rs_uc.uc_mcontext);
+       sig = restore_sigcontext(regs, &frame->rs_uc.uc_mcontext);
        if (sig < 0)
                goto badframe;
        else if (sig)
@@ -93,8 +95,8 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
        __asm__ __volatile__(
                "move\t$29, %0\n\t"
                "j\tsyscall_exit"
-               :/* no outputs */
-               :"r" (&regs));
+               : /* no outputs */
+               : "r" (regs));
        /* Unreached */
 
 badframe:
index 2b3572fb5f1b9d7ccd308e931078fe31fb4b924a..b6e3ddef48a06f9a543a10edc3c96e5ce1116b2b 100644 (file)
@@ -151,13 +151,15 @@ static int setup_frame_32(void *sig_return, struct ksignal *ksig,
        return 0;
 }
 
-asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
+asmlinkage void sys32_rt_sigreturn(void)
 {
        struct rt_sigframe32 __user *frame;
+       struct pt_regs *regs;
        sigset_t set;
        int sig;
 
-       frame = (struct rt_sigframe32 __user *) regs.regs[29];
+       regs = current_pt_regs();
+       frame = (struct rt_sigframe32 __user *)regs->regs[29];
        if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
                goto badframe;
        if (__copy_conv_sigset_from_user(&set, &frame->rs_uc.uc_sigmask))
@@ -165,7 +167,7 @@ asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
 
        set_current_blocked(&set);
 
-       sig = restore_sigcontext32(&regs, &frame->rs_uc.uc_mcontext);
+       sig = restore_sigcontext32(regs, &frame->rs_uc.uc_mcontext);
        if (sig < 0)
                goto badframe;
        else if (sig)
@@ -180,8 +182,8 @@ asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
        __asm__ __volatile__(
                "move\t$29, %0\n\t"
                "j\tsyscall_exit"
-               :/* no outputs */
-               :"r" (&regs));
+               : /* no outputs */
+               : "r" (regs));
        /* Unreached */
 
 badframe:
@@ -251,13 +253,15 @@ struct mips_abi mips_abi_32 = {
 };
 
 
-asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
+asmlinkage void sys32_sigreturn(void)
 {
        struct sigframe32 __user *frame;
+       struct pt_regs *regs;
        sigset_t blocked;
        int sig;
 
-       frame = (struct sigframe32 __user *) regs.regs[29];
+       regs = current_pt_regs();
+       frame = (struct sigframe32 __user *)regs->regs[29];
        if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
                goto badframe;
        if (__copy_conv_sigset_from_user(&blocked, &frame->sf_mask))
@@ -265,7 +269,7 @@ asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
 
        set_current_blocked(&blocked);
 
-       sig = restore_sigcontext32(&regs, &frame->sf_sc);
+       sig = restore_sigcontext32(regs, &frame->sf_sc);
        if (sig < 0)
                goto badframe;
        else if (sig)
@@ -277,8 +281,8 @@ asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
        __asm__ __volatile__(
                "move\t$29, %0\n\t"
                "j\tsyscall_exit"
-               :/* no outputs */
-               :"r" (&regs));
+               : /* no outputs */
+               : "r" (regs));
        /* Unreached */
 
 badframe: