Commit 90888816 authored by David S. Miller's avatar David S. Miller

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: default avatarDavid S. Miller <davem@davemloft.net>
parent 5526b7e4
...@@ -513,11 +513,10 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) ...@@ -513,11 +513,10 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
struct k_sigaction ka; struct k_sigaction ka;
sigset_t *oldset; sigset_t *oldset;
siginfo_t info; siginfo_t info;
int signr, tt; int signr;
tt = regs->magic & 0x1ff; if (pt_regs_is_syscall(regs)) {
if (tt == 0x110 || tt == 0x111 || tt == 0x16d) { pt_regs_clear_trap_type(regs);
regs->magic &= ~0x1ff;
cookie.restart_syscall = 1; cookie.restart_syscall = 1;
} else } else
cookie.restart_syscall = 0; cookie.restart_syscall = 0;
......
/* $Id: ptrace.h,v 1.14 2002/02/09 19:49:32 davem Exp $ */
#ifndef _SPARC64_PTRACE_H #ifndef _SPARC64_PTRACE_H
#define _SPARC64_PTRACE_H #define _SPARC64_PTRACE_H
...@@ -8,10 +7,15 @@ ...@@ -8,10 +7,15 @@
* stack during a system call and basically all traps. * 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 #define PT_REGS_MAGIC 0x57ac6c00
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <linux/types.h>
struct pt_regs { struct pt_regs {
unsigned long u_regs[16]; /* globals and ins */ unsigned long u_regs[16]; /* globals and ins */
unsigned long tstate; unsigned long tstate;
...@@ -33,6 +37,23 @@ struct pt_regs { ...@@ -33,6 +37,23 @@ struct pt_regs {
unsigned int magic; 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 { struct pt_regs32 {
unsigned int psr; unsigned int psr;
unsigned int pc; unsigned int pc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment