Add basic trap handlers for illegal instruction and breakpoint

exceptions.
This commit is contained in:
br 2016-02-22 14:54:50 +00:00
parent 339289dbe8
commit eccec115f8

View File

@ -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",