Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -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;
+22 −1
Original line number Diff line number Diff line
/* $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;