/* If INSN is an instruction which writes it's PC location * into a destination register, fix that up. */ static void __kprobes retpc_fixup(struct pt_regs *regs, u32 insn, unsigned long real_pc) { unsigned long *slot = NULL; /* Simplest cast is call, which always uses %o7 */ if ((insn & 0xc0000000) == 0x40000000) { slot = ®s->u_regs[UREG_I7]; } /* Jmpl encodes the register inside of the opcode */ if ((insn & 0xc1f80000) == 0x81c00000) { unsigned long rd = ((insn >> 25) & 0x1f); if (rd <= 15) { slot = ®s->u_regs[rd]; } else { /* Hard case, it goes onto the stack. */ flushw_all(); rd -= 16; slot = (unsigned long *) (regs->u_regs[UREG_FP] + STACK_BIAS); slot += rd; } }
asmlinkage void kgdb_trap(struct pt_regs *regs) { unsigned long flags; if (user_mode(regs)) { do_hw_interrupt(regs, 0xfd); return; } flushw_all(); local_irq_save(flags); kgdb_handle_exception(0x172, SIGTRAP, 0, regs); local_irq_restore(flags); }