* [PATCH 2/5] x86: signal: intrroduce get_sigframe() and replace get_sigstack()
2009-02-27 18:27 [PATCH 1/5] x86: signal: add __user annotation Hiroshi Shimamoto
@ 2009-02-27 18:28 ` Hiroshi Shimamoto
2009-02-27 18:29 ` [PATCH 3/5] x86: signal: use 16 bytes boundary for rt_sigframe Hiroshi Shimamoto
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Hiroshi Shimamoto @ 2009-02-27 18:28 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin; +Cc: linux-kernel
From: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
Impact: cleanup
Introduce get_sigframe() like 32-bit to replace get_sigstack().
Move the i387 stuff into get_sigframe().
Signed-off-by: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
---
arch/x86/kernel/signal.c | 32 +++++++++++++++++++-------------
1 files changed, 19 insertions(+), 13 deletions(-)
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index d6883b7..5ed4533 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -392,10 +392,13 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
* Determine which stack to use..
*/
static void __user *
-get_stack(struct k_sigaction *ka, unsigned long sp, unsigned long size)
+get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size,
+ void __user **fpstate)
{
- /* Default to using normal stack - redzone*/
- sp -= 128;
+ 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) {
@@ -403,7 +406,18 @@ get_stack(struct k_sigaction *ka, unsigned long sp, unsigned long size)
sp = current->sas_ss_sp + current->sas_ss_size;
}
- return (void __user *)round_down(sp - size, 64);
+ 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;
+ }
+
+ sp -= frame_size;
+ return (void __user *)round_down(sp, 64) - 8;
}
static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
@@ -414,15 +428,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
int err = 0;
struct task_struct *me = current;
- if (used_math()) {
- fp = get_stack(ka, regs->sp, sig_xstate_size);
- frame = (void __user *)round_down(
- (unsigned long)fp - sizeof(struct rt_sigframe), 16) - 8;
-
- if (save_i387_xstate(fp) < 0)
- return -EFAULT;
- } else
- frame = get_stack(ka, regs->sp, sizeof(struct rt_sigframe)) - 8;
+ frame = get_sigframe(ka, regs, sizeof(struct rt_sigframe), &fp);
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
return -EFAULT;
--
1.6.1.2
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 3/5] x86: signal: use 16 bytes boundary for rt_sigframe
2009-02-27 18:27 [PATCH 1/5] x86: signal: add __user annotation Hiroshi Shimamoto
2009-02-27 18:28 ` [PATCH 2/5] x86: signal: intrroduce get_sigframe() and replace get_sigstack() Hiroshi Shimamoto
@ 2009-02-27 18:29 ` Hiroshi Shimamoto
2009-02-27 18:29 ` [PATCH 4/5] x86: signal: unify get_sigframe() Hiroshi Shimamoto
2009-02-27 18:30 ` [PATCH 5/5] x86: signal: introduce helper align_sigframe() Hiroshi Shimamoto
3 siblings, 0 replies; 5+ messages in thread
From: Hiroshi Shimamoto @ 2009-02-27 18:29 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin; +Cc: linux-kernel
From: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
Impact: cleanup
Supporting xsave/xrestore introduces 64 bytes boundary for save_i387_xstate().
16 bytes boundary is OK for rt_sigframe.
Signed-off-by: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
---
arch/x86/kernel/signal.c | 6 ++----
1 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index 5ed4533..951aa60 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -409,15 +409,13 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_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;
}
sp -= frame_size;
- return (void __user *)round_down(sp, 64) - 8;
+ return (void __user *)round_down(sp, 16) - 8;
}
static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
--
1.6.1.2
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 4/5] x86: signal: unify get_sigframe()
2009-02-27 18:27 [PATCH 1/5] x86: signal: add __user annotation Hiroshi Shimamoto
2009-02-27 18:28 ` [PATCH 2/5] x86: signal: intrroduce get_sigframe() and replace get_sigstack() Hiroshi Shimamoto
2009-02-27 18:29 ` [PATCH 3/5] x86: signal: use 16 bytes boundary for rt_sigframe Hiroshi Shimamoto
@ 2009-02-27 18:29 ` Hiroshi Shimamoto
2009-02-27 18:30 ` [PATCH 5/5] x86: signal: introduce helper align_sigframe() Hiroshi Shimamoto
3 siblings, 0 replies; 5+ messages in thread
From: Hiroshi Shimamoto @ 2009-02-27 18:29 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin; +Cc: linux-kernel
From: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
Impact: cleanup
Unify get_sigframe().
Signed-off-by: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
---
arch/x86/kernel/signal.c | 97 +++++++++++++++++++--------------------------
1 files changed, 41 insertions(+), 56 deletions(-)
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index 951aa60..83212e3 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -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..
@@ -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.
@@ -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)
@@ -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)
{
--
1.6.1.2
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 5/5] x86: signal: introduce helper align_sigframe()
2009-02-27 18:27 [PATCH 1/5] x86: signal: add __user annotation Hiroshi Shimamoto
` (2 preceding siblings ...)
2009-02-27 18:29 ` [PATCH 4/5] x86: signal: unify get_sigframe() Hiroshi Shimamoto
@ 2009-02-27 18:30 ` Hiroshi Shimamoto
3 siblings, 0 replies; 5+ messages in thread
From: Hiroshi Shimamoto @ 2009-02-27 18:30 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin; +Cc: linux-kernel
From: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
Impact: cleanup
Introduce helper align_sigframe() to align stack pointer for signal frame.
Signed-off-by: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
---
arch/x86/kernel/signal.c | 27 +++++++++++++++------------
1 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index 83212e3..ceeb466 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -191,6 +191,20 @@ setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate,
/*
* Determine which stack to use..
*/
+static unsigned long align_sigframe(unsigned long sp)
+{
+#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 sp;
+}
+
static inline void __user *
get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size,
void __user **fpstate)
@@ -236,18 +250,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size,
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;
+ return (void __user *)align_sigframe(sp - frame_size);
}
#ifdef CONFIG_X86_32
--
1.6.1.2
^ permalink raw reply related [flat|nested] 5+ messages in thread