7 #include <linux/kernel.h>
8 #include <linux/sched.h>
11 #include <linux/errno.h>
12 #include <linux/ptrace.h>
15 #include <linux/signal.h>
18 #include <asm/uaccess.h>
19 #include <asm/pgtable.h>
33 #define DBG(fac,args) {if ((fac) & DEBUG) printk args;}
38 #define BREAKINST 0x00000080
74 (PAGE_SIZE*2 - sizeof(struct pt_regs) + offsetof(struct pt_regs, reg))
77 (PAGE_SIZE*2 - sizeof(struct pt_regs) - sizeof(struct switch_stack) \
78 + offsetof(struct switch_stack, reg))
80 static int regoff[] = {
100 static unsigned long zero;
105 static unsigned long *
112 }
else if (regno == 65) {
114 }
else if (regno == 31 || regno > 65) {
127 get_reg(
struct task_struct * task,
unsigned long regno)
131 unsigned long fpcr = *get_reg_addr(task, regno);
134 swcr = swcr_update_status(swcr, fpcr);
137 return *get_reg_addr(task, regno);
144 put_reg(
struct task_struct *task,
unsigned long regno,
unsigned long data)
152 *get_reg_addr(task, regno) =
data;
157 read_int(
struct task_struct *task,
unsigned long addr,
int * data)
160 return (copied ==
sizeof(
int)) ? 0 : -
EIO;
167 return (copied ==
sizeof(
int)) ? 0 : -
EIO;
176 int displ,
i,
res, reg_b, nsaved = 0;
180 pc = get_reg(child,
REG_PC);
181 res = read_int(child, pc, (
int *) &insn);
185 op_code = insn >> 26;
186 if (op_code >= 0x30) {
195 displ = ((
s32)(insn << 11)) >> 9;
201 }
else if (op_code == 0x1a) {
202 reg_b = (insn >> 16) & 0x1f;
211 for (i = 0; i < nsaved; ++
i) {
240 printk(
"ptrace_cancel_bpt: bogus nsaved: %d!\n", nsaved);
244 for (i = 0; i < nsaved; ++
i) {
248 return (nsaved != 0);
273 unsigned long addr,
unsigned long data)
285 if (copied !=
sizeof(tmp))
295 ret = get_reg(child, addr);
296 DBG(
DBG_MEM, (
"peek $%lu->%#lx\n", addr, ret));
306 DBG(
DBG_MEM, (
"poke $%lu<-%#lx\n", addr, data));
307 ret = put_reg(child, addr, data);
318 unsigned long ret = 0;