Loading arch/x86/kernel/signal.c +41 −56 Original line number Diff line number Diff line Loading @@ -187,28 +187,6 @@ setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, /* * Set up a signal frame. */ #ifdef CONFIG_X86_32 static const struct { u16 poplmovl; u32 val; u16 int80; } __attribute__((packed)) retcode = { 0xb858, /* popl %eax; movl $..., %eax */ __NR_sigreturn, 0x80cd, /* int $0x80 */ }; static const struct { u8 movl; u32 val; u16 int80; u8 pad; } __attribute__((packed)) rt_retcode = { 0xb8, /* movl $..., %eax */ __NR_rt_sigreturn, 0x80cd, /* int $0x80 */ 0 }; /* * Determine which stack to use.. Loading @@ -217,10 +195,13 @@ static inline void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, void __user **fpstate) { unsigned long sp; /* Default to using normal stack */ sp = regs->sp; unsigned long sp = regs->sp; #ifdef CONFIG_X86_64 /* redzone */ sp -= 128; #endif /* CONFIG_X86_64 */ /* * If we are on the alternate signal stack and would overflow it, don't. Loading @@ -234,30 +215,64 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, if (sas_ss_flags(sp) == 0) sp = current->sas_ss_sp + current->sas_ss_size; } else { #ifdef CONFIG_X86_32 /* This is the legacy signal stack switching. */ if ((regs->ss & 0xffff) != __USER_DS && !(ka->sa.sa_flags & SA_RESTORER) && ka->sa.sa_restorer) sp = (unsigned long) ka->sa.sa_restorer; #endif /* CONFIG_X86_32 */ } if (used_math()) { sp = sp - sig_xstate_size; sp -= sig_xstate_size; #ifdef CONFIG_X86_32 *fpstate = (void __user *) sp; #else /* !CONFIG_X86_32 */ *fpstate = (void __user *)round_down(sp, 64); #endif /* CONFIG_X86_32 */ if (save_i387_xstate(*fpstate) < 0) return (void __user *)-1L; } sp -= frame_size; #ifdef CONFIG_X86_32 /* * Align the stack pointer according to the i386 ABI, * i.e. so that on function entry ((sp + 4) & 15) == 0. */ sp = ((sp + 4) & -16ul) - 4; #else /* !CONFIG_X86_32 */ sp = round_down(sp, 16) - 8; #endif return (void __user *) sp; } #ifdef CONFIG_X86_32 static const struct { u16 poplmovl; u32 val; u16 int80; } __attribute__((packed)) retcode = { 0xb858, /* popl %eax; movl $..., %eax */ __NR_sigreturn, 0x80cd, /* int $0x80 */ }; static const struct { u8 movl; u32 val; u16 int80; u8 pad; } __attribute__((packed)) rt_retcode = { 0xb8, /* movl $..., %eax */ __NR_rt_sigreturn, 0x80cd, /* int $0x80 */ 0 }; static int __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs) Loading Loading @@ -388,36 +403,6 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, return 0; } #else /* !CONFIG_X86_32 */ /* * Determine which stack to use.. */ static void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, void __user **fpstate) { unsigned long sp; /* Default to using normal stack - redzone */ sp = regs->sp - 128; /* This is the X/Open sanctioned signal stack switching. */ if (ka->sa.sa_flags & SA_ONSTACK) { if (sas_ss_flags(sp) == 0) sp = current->sas_ss_sp + current->sas_ss_size; } if (used_math()) { sp -= sig_xstate_size; *fpstate = (void __user *)round_down(sp, 64); if (save_i387_xstate(*fpstate) < 0) return (void __user *) -1L; } sp -= frame_size; return (void __user *)round_down(sp, 16) - 8; } static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct pt_regs *regs) { Loading Loading
arch/x86/kernel/signal.c +41 −56 Original line number Diff line number Diff line Loading @@ -187,28 +187,6 @@ setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, /* * Set up a signal frame. */ #ifdef CONFIG_X86_32 static const struct { u16 poplmovl; u32 val; u16 int80; } __attribute__((packed)) retcode = { 0xb858, /* popl %eax; movl $..., %eax */ __NR_sigreturn, 0x80cd, /* int $0x80 */ }; static const struct { u8 movl; u32 val; u16 int80; u8 pad; } __attribute__((packed)) rt_retcode = { 0xb8, /* movl $..., %eax */ __NR_rt_sigreturn, 0x80cd, /* int $0x80 */ 0 }; /* * Determine which stack to use.. Loading @@ -217,10 +195,13 @@ static inline void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, void __user **fpstate) { unsigned long sp; /* Default to using normal stack */ sp = regs->sp; unsigned long sp = regs->sp; #ifdef CONFIG_X86_64 /* redzone */ sp -= 128; #endif /* CONFIG_X86_64 */ /* * If we are on the alternate signal stack and would overflow it, don't. Loading @@ -234,30 +215,64 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, if (sas_ss_flags(sp) == 0) sp = current->sas_ss_sp + current->sas_ss_size; } else { #ifdef CONFIG_X86_32 /* This is the legacy signal stack switching. */ if ((regs->ss & 0xffff) != __USER_DS && !(ka->sa.sa_flags & SA_RESTORER) && ka->sa.sa_restorer) sp = (unsigned long) ka->sa.sa_restorer; #endif /* CONFIG_X86_32 */ } if (used_math()) { sp = sp - sig_xstate_size; sp -= sig_xstate_size; #ifdef CONFIG_X86_32 *fpstate = (void __user *) sp; #else /* !CONFIG_X86_32 */ *fpstate = (void __user *)round_down(sp, 64); #endif /* CONFIG_X86_32 */ if (save_i387_xstate(*fpstate) < 0) return (void __user *)-1L; } sp -= frame_size; #ifdef CONFIG_X86_32 /* * Align the stack pointer according to the i386 ABI, * i.e. so that on function entry ((sp + 4) & 15) == 0. */ sp = ((sp + 4) & -16ul) - 4; #else /* !CONFIG_X86_32 */ sp = round_down(sp, 16) - 8; #endif return (void __user *) sp; } #ifdef CONFIG_X86_32 static const struct { u16 poplmovl; u32 val; u16 int80; } __attribute__((packed)) retcode = { 0xb858, /* popl %eax; movl $..., %eax */ __NR_sigreturn, 0x80cd, /* int $0x80 */ }; static const struct { u8 movl; u32 val; u16 int80; u8 pad; } __attribute__((packed)) rt_retcode = { 0xb8, /* movl $..., %eax */ __NR_rt_sigreturn, 0x80cd, /* int $0x80 */ 0 }; static int __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs) Loading Loading @@ -388,36 +403,6 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, return 0; } #else /* !CONFIG_X86_32 */ /* * Determine which stack to use.. */ static void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, void __user **fpstate) { unsigned long sp; /* Default to using normal stack - redzone */ sp = regs->sp - 128; /* This is the X/Open sanctioned signal stack switching. */ if (ka->sa.sa_flags & SA_ONSTACK) { if (sas_ss_flags(sp) == 0) sp = current->sas_ss_sp + current->sas_ss_size; } if (used_math()) { sp -= sig_xstate_size; *fpstate = (void __user *)round_down(sp, 64); if (save_i387_xstate(*fpstate) < 0) return (void __user *) -1L; } sp -= frame_size; return (void __user *)round_down(sp, 16) - 8; } static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, struct pt_regs *regs) { Loading