summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2008-04-27 23:52:51 +0200
committerDavid S. Miller <davem@davemloft.net>2008-04-27 23:52:51 +0200
commit90888816ba1bf1c4eff1e7e4220c1afc802f0fd3 (patch)
tree365fd47ce0d18d04e86a83e98ac037bce5e99057
parentsparc: Remove old style signal frame support. (diff)
downloadlinux-90888816ba1bf1c4eff1e7e4220c1afc802f0fd3.tar.xz
linux-90888816ba1bf1c4eff1e7e4220c1afc802f0fd3.zip
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.c7
-rw-r--r--include/asm-sparc64/ptrace.h23
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)
struct k_sigaction ka;
sigset_t *oldset;
siginfo_t info;
- int signr, tt;
+ int signr;
- tt = regs->magic & 0x1ff;
- if (tt == 0x110 || tt == 0x111 || tt == 0x16d) {
- regs->magic &= ~0x1ff;
+ if (pt_regs_is_syscall(regs)) {
+ pt_regs_clear_trap_type(regs);
cookie.restart_syscall = 1;
} else
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 @@
-/* $Id: ptrace.h,v 1.14 2002/02/09 19:49:32 davem Exp $ */
#ifndef _SPARC64_PTRACE_H
#define _SPARC64_PTRACE_H
@@ -8,10 +7,15 @@
* stack during a system call and basically all traps.
*/
+/* This magic value must have the low 9 bits clear,
+ * as that is where we encode the %tt value, see below.
+ */
#define PT_REGS_MAGIC 0x57ac6c00
#ifndef __ASSEMBLY__
+#include <linux/types.h>
+
struct pt_regs {
unsigned long u_regs[16]; /* globals and ins */
unsigned long tstate;
@@ -33,6 +37,23 @@ struct pt_regs {
unsigned int magic;
};
+static inline int pt_regs_trap_type(struct pt_regs *regs)
+{
+ return regs->magic & 0x1ff;
+}
+
+static inline int pt_regs_clear_trap_type(struct pt_regs *regs)
+{
+ return regs->magic &= ~0x1ff;
+}
+
+static inline bool pt_regs_is_syscall(struct pt_regs *regs)
+{
+ int tt = pt_regs_trap_type(regs);
+
+ return (tt == 0x110 || tt == 0x111 || tt == 0x16d);
+}
+
struct pt_regs32 {
unsigned int psr;
unsigned int pc;