Add basic trap handlers for illegal instruction and breakpoint
exceptions.
This commit is contained in:
parent
339289dbe8
commit
eccec115f8
@ -270,6 +270,17 @@ do_trap_supervisor(struct trapframe *frame)
|
||||
case EXCP_INSTR_ACCESS_FAULT:
|
||||
data_abort(frame, 0);
|
||||
break;
|
||||
case EXCP_INSTR_BREAKPOINT:
|
||||
#ifdef KDB
|
||||
kdb_trap(exception, 0, frame);
|
||||
#else
|
||||
dump_regs(frame);
|
||||
panic("No debugger in kernel.\n");
|
||||
#endif
|
||||
case EXCP_INSTR_ILLEGAL:
|
||||
dump_regs(frame);
|
||||
panic("Illegal instruction at %x\n", frame->tf_sepc);
|
||||
break;
|
||||
default:
|
||||
dump_regs(frame);
|
||||
panic("Unknown kernel exception %x badaddr %lx\n",
|
||||
@ -281,6 +292,10 @@ void
|
||||
do_trap_user(struct trapframe *frame)
|
||||
{
|
||||
uint64_t exception;
|
||||
struct thread *td;
|
||||
|
||||
td = curthread;
|
||||
td->td_frame = frame;
|
||||
|
||||
exception = (frame->tf_scause & EXCP_MASK);
|
||||
if (frame->tf_scause & EXCP_INTR) {
|
||||
@ -302,6 +317,14 @@ do_trap_user(struct trapframe *frame)
|
||||
frame->tf_sepc += 4; /* Next instruction */
|
||||
svc_handler(frame);
|
||||
break;
|
||||
case EXCP_INSTR_ILLEGAL:
|
||||
call_trapsignal(td, SIGILL, ILL_ILLTRP, (void *)frame->tf_sepc);
|
||||
userret(td, frame);
|
||||
break;
|
||||
case EXCP_INSTR_BREAKPOINT:
|
||||
call_trapsignal(td, SIGTRAP, TRAP_BRKPT, (void *)frame->tf_sepc);
|
||||
userret(td, frame);
|
||||
break;
|
||||
default:
|
||||
dump_regs(frame);
|
||||
panic("Unknown userland exception %x badaddr %lx\n",
|
||||
|
Loading…
x
Reference in New Issue
Block a user