forked from xamidev/pepperOS
Read RFLAGS register at panic
This commit is contained in:
@@ -11,6 +11,53 @@
|
|||||||
|
|
||||||
extern struct init_status init;
|
extern struct init_status init;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* reaf_rflags - provide easy reading of the RFLAGS register
|
||||||
|
* @rflags: RFLAGS register value
|
||||||
|
*/
|
||||||
|
void read_rflags(uint64_t rflags)
|
||||||
|
{
|
||||||
|
DEBUG("\x1b[38;5;226m%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\x1b[38;5;231m",
|
||||||
|
CHECK_BIT(rflags, 0) ? "CF " : "", /*carry flag*/
|
||||||
|
CHECK_BIT(rflags, 2) ? "PF " : "", /*parity flag*/
|
||||||
|
CHECK_BIT(rflags, 4) ? "AF " : "", /*auxiliary carry flag*/
|
||||||
|
CHECK_BIT(rflags, 6) ? "ZF " : "", /*zero flag*/
|
||||||
|
CHECK_BIT(rflags, 7) ? "SF " : "", /*sign flag*/
|
||||||
|
CHECK_BIT(rflags, 8) ? "TF " : "", /*trap flag*/
|
||||||
|
CHECK_BIT(rflags, 9) ? "IF " : "", /*interrupt enable flag*/
|
||||||
|
CHECK_BIT(rflags, 10) ? "DF " : "", /*direction flag*/
|
||||||
|
CHECK_BIT(rflags, 11) ? "OF " : "", /*overflow flag*/
|
||||||
|
(CHECK_BIT(rflags, 12) && CHECK_BIT(rflags, 13)) ? "IOPL3 " : "IOPL0 ", /*io privilege lvl*/
|
||||||
|
CHECK_BIT(rflags, 14) ? "NT " : "", /*nested task*/
|
||||||
|
CHECK_BIT(rflags, 16) ? "RF " : "", /*resume flag*/
|
||||||
|
CHECK_BIT(rflags, 17) ? "VM " : "", /*virtual 8086 mode*/
|
||||||
|
CHECK_BIT(rflags, 18) ? "AC " : "", /*alignment check/access control*/
|
||||||
|
CHECK_BIT(rflags, 19) ? "VIF " : "", /*virtual interrupt flag*/
|
||||||
|
CHECK_BIT(rflags, 20) ? "VIP " : "", /*virtual interrupt pending*/
|
||||||
|
CHECK_BIT(rflags, 21) ? "ID " : ""); /*id flag*/
|
||||||
|
|
||||||
|
if (init.terminal) {
|
||||||
|
printf("\x1b[38;5;226m%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\x1b[38;5;231m\r\n",
|
||||||
|
CHECK_BIT(rflags, 0) ? "CF " : "",
|
||||||
|
CHECK_BIT(rflags, 2) ? "PF " : "",
|
||||||
|
CHECK_BIT(rflags, 4) ? "AF " : "",
|
||||||
|
CHECK_BIT(rflags, 6) ? "ZF " : "",
|
||||||
|
CHECK_BIT(rflags, 7) ? "SF " : "",
|
||||||
|
CHECK_BIT(rflags, 8) ? "TF " : "",
|
||||||
|
CHECK_BIT(rflags, 9) ? "IF " : "",
|
||||||
|
CHECK_BIT(rflags, 10) ? "DF " : "",
|
||||||
|
CHECK_BIT(rflags, 11) ? "OF " : "",
|
||||||
|
(CHECK_BIT(rflags, 12) && CHECK_BIT(rflags, 13)) ? "IOPL3 " : "IOPL0 ",
|
||||||
|
CHECK_BIT(rflags, 14) ? "NT " : "",
|
||||||
|
CHECK_BIT(rflags, 16) ? "RF " : "",
|
||||||
|
CHECK_BIT(rflags, 17) ? "VM " : "",
|
||||||
|
CHECK_BIT(rflags, 18) ? "AC " : "",
|
||||||
|
CHECK_BIT(rflags, 19) ? "VIF " : "",
|
||||||
|
CHECK_BIT(rflags, 20) ? "VIP " : "",
|
||||||
|
CHECK_BIT(rflags, 21) ? "ID " : "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* panic - Kernel panic
|
* panic - Kernel panic
|
||||||
* @ctx: CPU context (optional)
|
* @ctx: CPU context (optional)
|
||||||
@@ -30,29 +77,31 @@ void panic(struct cpu_status_t* ctx, const char* str)
|
|||||||
fctprintf((void*)&skputc, 0, "\x1b[0m");
|
fctprintf((void*)&skputc, 0, "\x1b[0m");
|
||||||
skputc('\r');
|
skputc('\r');
|
||||||
skputc('\n');
|
skputc('\n');
|
||||||
DEBUG("\x1b[38;5;231m\x1b[48;5;196mend Kernel panic - halting...\x1b[0m");
|
DEBUG("\x1b[38;5;231m\x1b[48;5;196mend Kernel panic\x1b[0m");
|
||||||
|
|
||||||
if (init.terminal) {
|
if (init.terminal) {
|
||||||
printf("\r\n\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[48;5;232m Something went horribly wrong! (no cpu ctx)");
|
printf("\r\n\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[48;5;232m Something went horribly wrong! (no cpu ctx)");
|
||||||
printf("\r\n%s\r\n\x1b[38;5;231mend Kernel panic - halting...\x1b[0m", str);
|
printf("\r\n%s\r\n\x1b[38;5;231mend Kernel panic\x1b[0m", str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debug_stack_trace(100);
|
||||||
hcf();
|
hcf();
|
||||||
}
|
}
|
||||||
DEBUG("\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m at rip=%p\r\nSomething went horribly wrong! (%s) vect=0x%.2x errcode=0x%x\n\rrax=%p rbx=%p rcx=%p rdx=%p\n\rrsi=%p rdi=%p r8=%p r9=%p\n\rr10=%p r11=%p r12=%p r13=%p\n\rr14=%p r15=%p\n\n\rflags=%p\n\rHalting...\x1b[0m",
|
DEBUG("\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m at rip=%p\r\nSomething went horribly wrong! (%s) vect=0x%.2x errcode=0x%x\n\rrax=%p rbx=%p rcx=%p rdx=%p\n\rrsi=%p rdi=%p r8=%p r9=%p\n\rr10=%p r11=%p r12=%p r13=%p\n\rr14=%p r15=%p\n\n\rflags=%p\n\r\x1b[0m",
|
||||||
ctx->iret_rip,
|
ctx->iret_rip,
|
||||||
str,
|
str,
|
||||||
ctx->vector_number, ctx->error_code, ctx->rax, ctx->rbx, ctx->rcx, ctx->rdx, ctx->rsi, ctx->rdi,
|
ctx->vector_number, ctx->error_code, ctx->rax, ctx->rbx, ctx->rcx, ctx->rdx, ctx->rsi, ctx->rdi,
|
||||||
ctx->r8, ctx->r9, ctx->r10, ctx->r11, ctx->r12, ctx->r13, ctx->r14, ctx->r15, ctx->iret_flags);
|
ctx->r8, ctx->r9, ctx->r10, ctx->r11, ctx->r12, ctx->r13, ctx->r14, ctx->r15, ctx->iret_flags);
|
||||||
|
|
||||||
if (init.terminal) {
|
if (init.terminal) {
|
||||||
printf("\r\n\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[48;5;232mat rip=%p\r\nSomething went horribly wrong! (%s) vect=0x%.2x errcode=0x%x\n\rrax=%p rbx=%p rcx=%p rdx=%p\n\rrsi=%p rdi=%p r8=%p r9=%p\n\rr10=%p r11=%p r12=%p r13=%p\n\rr14=%p r15=%p\n\n\rflags=%p\n\rHalting...\x1b[0m",
|
printf("\r\n\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[48;5;232mat rip=%p\r\nSomething went horribly wrong! (%s) vect=0x%.2x errcode=0x%x\n\rrax=%p rbx=%p rcx=%p rdx=%p\n\rrsi=%p rdi=%p r8=%p r9=%p\n\rr10=%p r11=%p r12=%p r13=%p\n\rr14=%p r15=%p\n\n\rflags=%p ",
|
||||||
ctx->iret_rip,
|
ctx->iret_rip,
|
||||||
str,
|
str,
|
||||||
ctx->vector_number, ctx->error_code, ctx->rax, ctx->rbx, ctx->rcx, ctx->rdx, ctx->rsi, ctx->rdi,
|
ctx->vector_number, ctx->error_code, ctx->rax, ctx->rbx, ctx->rcx, ctx->rdx, ctx->rsi, ctx->rdi,
|
||||||
ctx->r8, ctx->r9, ctx->r10, ctx->r11, ctx->r12, ctx->r13, ctx->r14, ctx->r15, ctx->iret_flags);
|
ctx->r8, ctx->r9, ctx->r10, ctx->r11, ctx->r12, ctx->r13, ctx->r14, ctx->r15, ctx->iret_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
read_rflags(ctx->iret_flags);
|
||||||
debug_stack_trace(100);
|
debug_stack_trace(100);
|
||||||
|
|
||||||
hcf();
|
hcf();
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ void debug_stack_trace(unsigned int max_frames)
|
|||||||
rbp = next_rbp;
|
rbp = next_rbp;
|
||||||
}
|
}
|
||||||
if (init.terminal) {
|
if (init.terminal) {
|
||||||
printf("*** end stack trace ***\x1b[0m");
|
printf("*** end stack trace ***\r\nHalting system...\x1b[0m");
|
||||||
}
|
}
|
||||||
DEBUG("*** end stack trace ***");
|
DEBUG("*** end stack trace ***");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,6 +154,12 @@ static void gp_fault_handler(struct cpu_status_t* ctx)
|
|||||||
panic(ctx, "gp fault");
|
panic(ctx, "gp fault");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DEBUG
|
||||||
|
void kbdproc_main(void* arg)
|
||||||
|
{
|
||||||
|
printf("Key pressed/released.\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* interrupt_dispatch - Interrupt dispatcher
|
* interrupt_dispatch - Interrupt dispatcher
|
||||||
* @context: CPU context
|
* @context: CPU context
|
||||||
@@ -252,6 +258,7 @@ struct cpu_status_t* interrupt_dispatch(struct cpu_status_t* context)
|
|||||||
|
|
||||||
case 33: // Keyboard Interrupt
|
case 33: // Keyboard Interrupt
|
||||||
keyboard_handler();
|
keyboard_handler();
|
||||||
|
process_create("keyboard-initiated", kbdproc_main, NULL); // DEBUG
|
||||||
outb(0x20, 0x20);
|
outb(0x20, 0x20);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user