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>
This commit is contained in:
parent
5526b7e451
commit
90888816ba
|
@ -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;
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
/* $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 @@
|
||||||
* 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 {
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue