x86: signal: move macros out from restore_sigcontext()
PATCH 1/2 x86: signal: move macros out from restore_sigcontext()
From: Hiroshi Shimamoto <[email protected]>
move macros, COPY, COPY_SEG*, GET_SEG, out from restore_sigcontext().x86_64: introduce COPY_SEG_STRICT for cs.
--- arch/x86/kernel/signal_32.c | 38 +++++++++++++++++++++----------------- arch/x86/kernel/signal_64.c | 18 +++++++++++------- 2 files changed, 32 insertions(+), 24 deletions(-)
arch/x86/kernel/signal_32.c +21 -17
@@ -113,6 +113,27 @@ asmlinkage int sys_sigaltstack(unsigned long bx)return do_sigaltstack (uss, uoss, regs->sp); } +#define COPY (x) { \ + err |= __get_user(regs->x, &sc->x); \ +} + +#define COPY_SEG (seg) { \ + unsigned short tmp; \ + err |= __get_user(tmp, &sc->seg); \ + regs->seg = tmp; \ +} + +#define COPY_SEG_STRICT (seg) { \ + unsigned short tmp; \ + err |= __get_user(tmp, &sc->seg); \ + regs->seg = tmp | 3; \ +} + +#define GET_SEG (seg) { \ + unsigned short tmp; \ + err |= __get_user(tmp, &sc->seg); \ + loadsegment(seg, tmp); \ +}/* * Do a signal return; undo the signal stack.
@@ -126,23 +147,6 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,/* Always make any pending restarted system calls return -EINTR */ current_thread_info ()->restart_block.fn = do_no_restart_syscall; -#define COPY (x) err |= __get_user(regs->x, &sc->x) - -#define COPY_SEG (seg) \ - { unsigned short tmp; \ - err |= __get_user(tmp, &sc->seg); \ - regs->seg = tmp; } - -#define COPY_SEG_STRICT (seg) \ - { unsigned short tmp; \ - err |= __get_user(tmp, &sc->seg); \ - regs->seg = tmp|3; } - -#define GET_SEG (seg) \ - { unsigned short tmp; \ - err |= __get_user(tmp, &sc->seg); \ - loadsegment(seg, tmp); } -GET_SEG (gs);COPY_SEG (fs);COPY_SEG (es);
arch/x86/kernel/signal_64.c +11 -7
@@ -52,6 +52,16 @@ sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,return do_sigaltstack (uss, uoss, regs->sp); } +#define COPY (x) { \ + err |= __get_user(regs->x, &sc->x); \ +} + +#define COPY_SEG_STRICT (seg) { \ + unsigned short tmp; \ + err |= __get_user(tmp, &sc->seg); \ + regs->seg = tmp | 3; \ +} +/* * Do a signal return; undo the signal stack. */
@@ -64,8 +74,6 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,/* Always make any pending restarted system calls return -EINTR */ current_thread_info ()->restart_block.fn = do_no_restart_syscall; -#define COPY (x) (err |= __get_user(regs->x, &sc->x)) -COPY (di);COPY (si);COPY (bp);COPY (sp);COPY (bx);COPY (dx);COPY (cx);COPY (ip);COPY (r8);
@@ -80,11 +88,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,/* Kernel saves and restores only the CS segment register on signals, * which is the bare minimum needed to allow mixed 32/64-bit code. * App's signal handler can save/restore other segments if needed. */ - { -unsigned cs; - err |=__get_user (cs, &sc->cs); - regs->cs = cs |3 ;/* Force into user mode */ - } +COPY_SEG_STRICT (cs); {unsigned int tmpflags;
PATCH 2/2 x86: signal: remove indent in restore_sigcontext()
From: Hiroshi Shimamoto <[email protected]>
remove braces and indent for flags and fpstate in restore_sigcontext().
--- arch/x86/kernel/signal_32.c | 21 +++++++-------------- arch/x86/kernel/signal_64.c | 19 +++++++------------ 2 files changed, 14 insertions(+), 26 deletions(-)
arch/x86/kernel/signal_32.c +7 -14
@@ -142,6 +142,8 @@ static int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, unsigned long *pax) { + void __user *buf; +unsigned int tmpflags;unsigned int err =0 ;/* Always make any pending restarted system calls return -EINTR */
@@ -156,21 +158,12 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,COPY_SEG_STRICT (cs);COPY_SEG_STRICT (ss); - { -unsigned int tmpflags; + err |=__get_user (tmpflags, &sc->flags); + regs->flags = (regs->flags & ~FIX_EFLAGS ) | (tmpflags &FIX_EFLAGS ); + regs->orig_ax =-1 ;/* disable syscall checks */ - err |=__get_user (tmpflags, &sc->flags); - regs->flags = (regs->flags & ~FIX_EFLAGS ) | - (tmpflags &FIX_EFLAGS ); - regs->orig_ax =-1 ;/* disable syscall checks */ - } - - { -void __user *buf; - - err |=__get_user (buf, &sc->fpstate); - err |=restore_i387_xstate (buf); - } + err |=__get_user (buf, &sc->fpstate); + err |=restore_i387_xstate (buf); err |=__get_user (*pax, &sc->ax);return err;
arch/x86/kernel/signal_64.c +7 -12
@@ -69,6 +69,8 @@ static int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, unsigned long *pax) { + void __user *buf; +unsigned int tmpflags;unsigned int err =0 ;/* Always make any pending restarted system calls return -EINTR */
@@ -90,19 +92,12 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,* App's signal handler can save/restore other segments if needed. */ COPY_SEG_STRICT (cs); - { -unsigned int tmpflags; - err |=__get_user (tmpflags, &sc->flags); - regs->flags = (regs->flags & ~FIX_EFLAGS ) | (tmpflags &FIX_EFLAGS ); - regs->orig_ax =-1 ;/* disable syscall checks */ - } - - { -void __user *buf; + err |=__get_user (tmpflags, &sc->flags); + regs->flags = (regs->flags & ~FIX_EFLAGS ) | (tmpflags &FIX_EFLAGS ); + regs->orig_ax =-1 ;/* disable syscall checks */ - err |=__get_user (buf, &sc->fpstate); - err |=restore_i387_xstate (buf); - } + err |=__get_user (buf, &sc->fpstate); + err |=restore_i387_xstate (buf); err |=__get_user (*pax, &sc->ax);return err;
Ingo Molnar
AppliedRe: [PATCH 2/2] x86: signal: remove indent in restore_sigcontext()
Quoted 9 lines · Hiroshi Shimamoto
From: Hiroshi Shimamoto <[email protected]>
remove braces and indent for flags and fpstate in
restore_sigcontext().Signed-off-by Hiroshi Shimamoto <[email protected]>--- arch/x86/kernel/signal_32.c | 21 +++++++-------------- arch/x86/kernel/signal_64.c | 19 +++++++------------ 2 files changed, 14 insertions(+), 26 deletions(-)
applied to tip/x86/signal, thanks!
Ingo
Ingo Molnar
AppliedQuoted 10 lines · Hiroshi Shimamoto
From: Hiroshi Shimamoto <[email protected]>
move macros, COPY, COPY_SEG*,
GET_SEG, out fromrestore_sigcontext().x86_64: introduceCOPY_SEG_STRICTfor cs.Signed-off-by Hiroshi Shimamoto <[email protected]>--- arch/x86/kernel/signal_32.c | 38 +++++++++++++++++++++----------------- arch/x86/kernel/signal_64.c | 18 +++++++++++------- 2 files changed, 32 insertions(+), 24 deletions(-)
applied to tip/x86/signal, thanks Hiroshi!
Ingo