16 #include <asm/cacheflush.h>
17 #include <asm/traps.h>
20 #define OPCODE_BT(op) (((op) & 0xff00) == 0x8900)
21 #define OPCODE_BF(op) (((op) & 0xff00) == 0x8b00)
22 #define OPCODE_BTF_DISP(op) (((op) & 0x80) ? (((op) | 0xffffff80) << 1) : \
23 (((op) & 0x7f ) << 1))
24 #define OPCODE_BFS(op) (((op) & 0xff00) == 0x8f00)
25 #define OPCODE_BTS(op) (((op) & 0xff00) == 0x8d00)
26 #define OPCODE_BRA(op) (((op) & 0xf000) == 0xa000)
27 #define OPCODE_BRA_DISP(op) (((op) & 0x800) ? (((op) | 0xfffff800) << 1) : \
28 (((op) & 0x7ff) << 1))
29 #define OPCODE_BRAF(op) (((op) & 0xf0ff) == 0x0023)
30 #define OPCODE_BRAF_REG(op) (((op) & 0x0f00) >> 8)
31 #define OPCODE_BSR(op) (((op) & 0xf000) == 0xb000)
32 #define OPCODE_BSR_DISP(op) (((op) & 0x800) ? (((op) | 0xfffff800) << 1) : \
33 (((op) & 0x7ff) << 1))
34 #define OPCODE_BSRF(op) (((op) & 0xf0ff) == 0x0003)
35 #define OPCODE_BSRF_REG(op) (((op) >> 8) & 0xf)
36 #define OPCODE_JMP(op) (((op) & 0xf0ff) == 0x402b)
37 #define OPCODE_JMP_REG(op) (((op) >> 8) & 0xf)
38 #define OPCODE_JSR(op) (((op) & 0xf0ff) == 0x400b)
39 #define OPCODE_JSR_REG(op) (((op) >> 8) & 0xf)
40 #define OPCODE_RTS(op) ((op) == 0xb)
41 #define OPCODE_RTE(op) ((op) == 0x2b)
43 #define SR_T_BIT_MASK 0x1
44 #define STEP_OPCODE 0xc33d
47 static short *get_step_address(
struct pt_regs *linux_regs)
57 addr = linux_regs->
pc + 2;
65 addr = linux_regs->
pc + 4;
73 addr = linux_regs->
pc + 2;
81 addr = linux_regs->
pc + 4;
90 addr = linux_regs->
pc + 4
99 addr = linux_regs->
pc + 4
112 addr = linux_regs->
pr;
116 addr = linux_regs->
regs[15];
123 return (
short *)
addr;
135 static unsigned long stepped_address;
141 unsigned short *
addr = get_step_address(linux_regs);
143 stepped_address = (
int)addr;
155 static void undo_single_step(
struct pt_regs *linux_regs)
159 if (stepped_opcode != 0) {
198 if (dbg_reg_def[regno].
offset != -1)
200 dbg_reg_def[regno].
size);
210 if (dbg_reg_def[regno].
size != -1)
212 dbg_reg_def[regno].
size);
216 __asm__ __volatile__ (
"stc vbr, %0" :
"=r" (mem));
220 return dbg_reg_def[regno].name;
240 gdb_regs[reg] = thread_regs->
regs[reg];
242 gdb_regs[GDB_R15] = p->
thread.sp;
253 char *remcomInBuffer,
char *remcomOutBuffer,
260 undo_single_step(linux_regs);
262 switch (remcomInBuffer[0]) {
266 ptr = &remcomInBuffer[1];
273 if (remcomInBuffer[0] ==
's') {
314 static void kgdb_call_nmi_hook(
void *
ignored)
357 ret = __kgdb_notify(ptr, cmd);
364 .notifier_call = kgdb_notify,
384 #ifdef CONFIG_CPU_LITTLE_ENDIAN
385 .gdb_bpt_instr = { 0x3c, 0xc3 },
387 .gdb_bpt_instr = { 0xc3, 0x3c },