Use CS register to detect kernel code vs. user code in case of an exception
This commit is contained in:
@ -217,12 +217,14 @@ void intr_handleintr(IntrStackFrame *frame) {
|
|||||||
kprintf("ERROR %s, 0x%lX\n", exceptions[frame->trapnum], frame->errnum);
|
kprintf("ERROR %s, 0x%lX\n", exceptions[frame->trapnum], frame->errnum);
|
||||||
intr_dumpframe(frame);
|
intr_dumpframe(frame);
|
||||||
backtrace((BackTraceFrame *)frame->regs.rbp);
|
backtrace((BackTraceFrame *)frame->regs.rbp);
|
||||||
if (hal_vmm_current_cr3() != KERNEL_CR3) {
|
if (frame->cs == UCODE) {
|
||||||
kprintf("killed pid %ld %s\n", PROCS.current->pid, PROCS.current->name);
|
kprintf("killed pid %ld %s\n", PROCS.current->pid, PROCS.current->name);
|
||||||
proc_killself();
|
proc_killself();
|
||||||
proc_sched((void *)frame);
|
proc_sched((void *)frame);
|
||||||
}
|
} else {
|
||||||
|
kprintf("Kernel error :(\n");
|
||||||
hal_hang();
|
hal_hang();
|
||||||
|
}
|
||||||
} else if (frame->trapnum >= 32 && frame->trapnum <= 47) {
|
} else if (frame->trapnum >= 32 && frame->trapnum <= 47) {
|
||||||
switch (frame->trapnum) {
|
switch (frame->trapnum) {
|
||||||
case INTR_IRQBASE+0:
|
case INTR_IRQBASE+0:
|
||||||
|
|||||||
Reference in New Issue
Block a user