ptrace.h 4.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11
/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 1994, 95, 96, 97, 98, 99, 2000 by Ralf Baechle
 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
 */
#ifndef _ASM_PTRACE_H
#define _ASM_PTRACE_H

T
Thomas Bogendoerfer 已提交
12 13 14
#ifdef CONFIG_64BIT
#define __ARCH_WANT_COMPAT_SYS_PTRACE
#endif
L
Linus Torvalds 已提交
15 16 17 18 19 20 21 22 23 24

/* 0 - 31 are integer registers, 32 - 63 are fp registers.  */
#define FPR_BASE	32
#define PC		64
#define CAUSE		65
#define BADVADDR	66
#define MMHI		67
#define MMLO		68
#define FPC_CSR		69
#define FPC_EIR		70
25 26
#define DSP_BASE	71		/* 3 more hi / lo register pairs */
#define DSP_CONTROL	77
27
#define ACX		78
L
Linus Torvalds 已提交
28 29 30 31 32 33

/*
 * This struct defines the way the registers are stored on the stack during a
 * system call/exception. As usual the registers k0/k1 aren't being saved.
 */
struct pt_regs {
34
#ifdef CONFIG_32BIT
L
Linus Torvalds 已提交
35 36 37 38 39 40 41 42 43 44
	/* Pad bytes for argument save space on the stack. */
	unsigned long pad0[6];
#endif

	/* Saved main processor registers. */
	unsigned long regs[32];

	/* Saved special registers. */
	unsigned long cp0_status;
	unsigned long hi;
45
	unsigned long lo;
46 47 48
#ifdef CONFIG_CPU_HAS_SMARTMIPS
	unsigned long acx;
#endif
L
Linus Torvalds 已提交
49 50 51
	unsigned long cp0_badvaddr;
	unsigned long cp0_cause;
	unsigned long cp0_epc;
52 53 54
#ifdef CONFIG_MIPS_MT_SMTC
	unsigned long cp0_tcstatus;
#endif /* CONFIG_MIPS_MT_SMTC */
55
} __attribute__ ((aligned (8)));
L
Linus Torvalds 已提交
56 57

/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
58 59 60 61
#define PTRACE_GETREGS		12
#define PTRACE_SETREGS		13
#define PTRACE_GETFPREGS		14
#define PTRACE_SETFPREGS		15
L
Linus Torvalds 已提交
62 63 64 65 66 67 68 69
/* #define PTRACE_GETFPXREGS		18 */
/* #define PTRACE_SETFPXREGS		19 */

#define PTRACE_OLDSETOPTIONS	21

#define PTRACE_GET_THREAD_AREA	25
#define PTRACE_SET_THREAD_AREA	26

70 71 72 73 74 75 76
/* Calls to trace a 64bit program from a 32bit program.  */
#define PTRACE_PEEKTEXT_3264	0xc0
#define PTRACE_PEEKDATA_3264	0xc1
#define PTRACE_POKETEXT_3264	0xc2
#define PTRACE_POKEDATA_3264	0xc3
#define PTRACE_GET_THREAD_AREA_3264	0xc4

77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
/* Read and write watchpoint registers.  */
enum pt_watch_style {
	pt_watch_style_mips32,
	pt_watch_style_mips64
};
struct mips32_watch_regs {
	uint32_t watchlo[8];
	/* Lower 16 bits of watchhi. */
	uint16_t watchhi[8];
	/* Valid mask and I R W bits.
	 * bit 0 -- 1 if W bit is usable.
	 * bit 1 -- 1 if R bit is usable.
	 * bit 2 -- 1 if I bit is usable.
	 * bits 3 - 11 -- Valid watchhi mask bits.
	 */
	uint16_t watch_masks[8];
	/* The number of valid watch register pairs.  */
	uint32_t num_valid;
} __attribute__((aligned(8)));

struct mips64_watch_regs {
	uint64_t watchlo[8];
	uint16_t watchhi[8];
	uint16_t watch_masks[8];
	uint32_t num_valid;
} __attribute__((aligned(8)));

struct pt_watch_regs {
	enum pt_watch_style style;
	union {
		struct mips32_watch_regs mips32;
		struct mips32_watch_regs mips64;
	};
};

#define PTRACE_GET_WATCH_REGS	0xd0
#define PTRACE_SET_WATCH_REGS	0xd1

L
Linus Torvalds 已提交
115 116
#ifdef __KERNEL__

117
#include <linux/compiler.h>
L
Linus Torvalds 已提交
118
#include <linux/linkage.h>
119
#include <asm/isadep.h>
L
Linus Torvalds 已提交
120

121 122
struct task_struct;

123 124 125 126 127 128
extern int ptrace_getregs(struct task_struct *child, __s64 __user *data);
extern int ptrace_setregs(struct task_struct *child, __s64 __user *data);

extern int ptrace_getfpregs(struct task_struct *child, __u32 __user *data);
extern int ptrace_setfpregs(struct task_struct *child, __u32 __user *data);

129 130 131 132 133
extern int ptrace_get_watch_regs(struct task_struct *child,
	struct pt_watch_regs __user *addr);
extern int ptrace_set_watch_regs(struct task_struct *child,
	struct pt_watch_regs __user *addr);

L
Linus Torvalds 已提交
134 135 136 137 138 139 140 141 142 143
/*
 * Does the process account for user or for system time?
 */
#define user_mode(regs) (((regs)->cp0_status & KU_MASK) == KU_USER)

#define instruction_pointer(regs) ((regs)->cp0_epc)
#define profile_pc(regs) instruction_pointer(regs)

extern asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit);

R
Ralf Baechle 已提交
144
extern NORET_TYPE void die(const char *, const struct pt_regs *) ATTRIB_NORET;
145

R
Ralf Baechle 已提交
146
static inline void die_if_kernel(const char *str, const struct pt_regs *regs)
147 148 149 150 151
{
	if (unlikely(!user_mode(regs)))
		die(str, regs);
}

L
Linus Torvalds 已提交
152 153 154
#endif

#endif /* _ASM_PTRACE_H */