diff options
author | David S. Miller <davem@davemloft.net> | 2008-04-27 17:52:51 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-04-27 17:52:51 -0400 |
commit | 90888816ba1bf1c4eff1e7e4220c1afc802f0fd3 (patch) | |
tree | 365fd47ce0d18d04e86a83e98ac037bce5e99057 | |
parent | 5526b7e4513c66bc1c91f661dcd518d5199f8934 (diff) |
sparc64: Clean up handling of pt_regs trap type encoding.
If we use this from more than one place, it's better to
have helpers instead of twiddling magic constants all
over.
Add pt_regs_trap_type(), pt_regs_clear_trap_type(), and
pt_regs_is_syscall().
Use them in do_signal().
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | arch/sparc64/kernel/signal.c | 7 | ||||
-rw-r--r-- | include/asm-sparc64/ptrace.h | 23 |
2 files changed, 25 insertions, 5 deletions
diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c index 314f51aefa0f..f2d88d8f7a42 100644 --- a/arch/sparc64/kernel/signal.c +++ b/arch/sparc64/kernel/signal.c | |||
@@ -513,11 +513,10 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
513 | struct k_sigaction ka; | 513 | struct k_sigaction ka; |
514 | sigset_t *oldset; | 514 | sigset_t *oldset; |
515 | siginfo_t info; | 515 | siginfo_t info; |
516 | int signr, tt; | 516 | int signr; |
517 | 517 | ||
518 | tt = regs->magic & 0x1ff; | 518 | if (pt_regs_is_syscall(regs)) { |
519 | if (tt == 0x110 || tt == 0x111 || tt == 0x16d) { | 519 | pt_regs_clear_trap_type(regs); |
520 | regs->magic &= ~0x1ff; | ||
521 | cookie.restart_syscall = 1; | 520 | cookie.restart_syscall = 1; |
522 | } else | 521 | } else |
523 | cookie.restart_syscall = 0; | 522 | cookie.restart_syscall = 0; |
diff --git a/include/asm-sparc64/ptrace.h b/include/asm-sparc64/ptrace.h index b4b951d570bb..714b81956f32 100644 --- a/include/asm-sparc64/ptrace.h +++ b/include/asm-sparc64/ptrace.h | |||
@@ -1,4 +1,3 @@ | |||
1 | /* $Id: ptrace.h,v 1.14 2002/02/09 19:49:32 davem Exp $ */ | ||
2 | #ifndef _SPARC64_PTRACE_H | 1 | #ifndef _SPARC64_PTRACE_H |
3 | #define _SPARC64_PTRACE_H | 2 | #define _SPARC64_PTRACE_H |
4 | 3 | ||
@@ -8,10 +7,15 @@ | |||
8 | * stack during a system call and basically all traps. | 7 | * stack during a system call and basically all traps. |
9 | */ | 8 | */ |
10 | 9 | ||
10 | /* This magic value must have the low 9 bits clear, | ||
11 | * as that is where we encode the %tt value, see below. | ||
12 | */ | ||
11 | #define PT_REGS_MAGIC 0x57ac6c00 | 13 | #define PT_REGS_MAGIC 0x57ac6c00 |
12 | 14 | ||
13 | #ifndef __ASSEMBLY__ | 15 | #ifndef __ASSEMBLY__ |
14 | 16 | ||
17 | #include <linux/types.h> | ||
18 | |||
15 | struct pt_regs { | 19 | struct pt_regs { |
16 | unsigned long u_regs[16]; /* globals and ins */ | 20 | unsigned long u_regs[16]; /* globals and ins */ |
17 | unsigned long tstate; | 21 | unsigned long tstate; |
@@ -33,6 +37,23 @@ struct pt_regs { | |||
33 | unsigned int magic; | 37 | unsigned int magic; |
34 | }; | 38 | }; |
35 | 39 | ||
40 | static inline int pt_regs_trap_type(struct pt_regs *regs) | ||
41 | { | ||
42 | return regs->magic & 0x1ff; | ||
43 | } | ||
44 | |||
45 | static inline int pt_regs_clear_trap_type(struct pt_regs *regs) | ||
46 | { | ||
47 | return regs->magic &= ~0x1ff; | ||
48 | } | ||
49 | |||
50 | static inline bool pt_regs_is_syscall(struct pt_regs *regs) | ||
51 | { | ||
52 | int tt = pt_regs_trap_type(regs); | ||
53 | |||
54 | return (tt == 0x110 || tt == 0x111 || tt == 0x16d); | ||
55 | } | ||
56 | |||
36 | struct pt_regs32 { | 57 | struct pt_regs32 { |
37 | unsigned int psr; | 58 | unsigned int psr; |
38 | unsigned int pc; | 59 | unsigned int pc; |