Add stack unwinding to critical ISRs.

Also adjust the formatting of serial prints..
This commit is contained in:
Curle 2020-11-09 18:41:34 +00:00
parent 9646eac29e
commit acfe8c2666
Signed by: TheCurle
GPG Key ID: 5942F13718443F79
4 changed files with 31 additions and 24 deletions

View File

@ -21,10 +21,10 @@ address_space_t KernelAddressSpace;
int Main(void) { int Main(void) {
KernelAddressSpace = (address_space_t) {0}; KernelAddressSpace = (address_space_t) {0};
SerialPrintf("\r\nBooting Chroma..\r\n"); SerialPrintf("\r\n[ boot] Booting Chroma..\r\n");
SerialPrintf("Kernel loaded at 0x%p, ends at 0x%p, is %d bytes long.\r\n", KernelAddr, KernelEnd, KernelEnd - KernelAddr); SerialPrintf("[ boot] Kernel loaded at 0x%p, ends at 0x%p, is %d bytes long.\r\n", KernelAddr, KernelEnd, KernelEnd - KernelAddr);
SerialPrintf("The bootloader has put the paging tables at 0x%p.\r\n", ReadControlRegister(3)); SerialPrintf("[ boot] The bootloader has put the paging tables at 0x%p.\r\n", ReadControlRegister(3));
//TraversePageTables(); //TraversePageTables();

View File

@ -97,7 +97,7 @@ void ISR_Common(INTERRUPT_FRAME* Frame, size_t Exception) {
FillScreen(0x0000FF00); FillScreen(0x0000FF00);
/* ExceptionStrings is an array of c-strings defined in kernel.h */ /* ExceptionStrings is an array of c-strings defined in kernel.h */
SerialPrintf("%s exception!\r\n", ExceptionStrings[Exception]); SerialPrintf("[ ISR] %s exception!\r\n", ExceptionStrings[Exception]);
//printf("%s exception!", ExceptionStrings[Exception]); //printf("%s exception!", ExceptionStrings[Exception]);
//panic(); //panic();
} }
@ -113,8 +113,8 @@ void ISR_Error_Common(INTERRUPT_FRAME* Frame, size_t ErrorCode, size_t Exception
FillScreen(0x0000FF00); FillScreen(0x0000FF00);
SerialPrintf("ISR Error %d raised, EC %d!\r\n", Exception, ErrorCode); SerialPrintf("[ ISR] ISR Error %d raised, EC %d!\r\n", Exception, ErrorCode);
SerialPrintf("%s exception!\r\n", ExceptionStrings[Exception]); SerialPrintf("[ ISR] %s exception!\r\n", ExceptionStrings[Exception]);
while(true) {} while(true) {}
//serialPrint(ExceptionStrings[Exception]); //serialPrint(ExceptionStrings[Exception]);
//serialPrintf(" Exception. Context given: %d\r\n", Frame->ErrorCode); //serialPrintf(" Exception. Context given: %d\r\n", Frame->ErrorCode);
@ -140,7 +140,7 @@ void IRQ_Common(INTERRUPT_FRAME* Frame, size_t Interrupt) {
Handler = IRQ_Handlers[Interrupt]; Handler = IRQ_Handlers[Interrupt];
// If there's something there, // If there's something there,
if(Handler) { if(Handler) {
SerialPrintf("IRQ %d raised!\r\n", Interrupt); SerialPrintf("[ IRQ] IRQ %d raised!\r\n", Interrupt);
// Call the handler. // Call the handler.
Handler(Frame); Handler(Frame);
} }
@ -150,6 +150,7 @@ void IRQ_Common(INTERRUPT_FRAME* Frame, size_t Interrupt) {
/* In either case, we tell the Master PIC it's been read to receive any IRQ. */ /* In either case, we tell the Master PIC it's been read to receive any IRQ. */
WritePort(0x20, 0x20, 1); WritePort(0x20, 0x20, 1);
} }
/* However, in order to actually be able to receive IRQs, we need to remap the PICs. */ /* However, in order to actually be able to receive IRQs, we need to remap the PICs. */
@ -302,13 +303,14 @@ __attribute__((interrupt)) void ISR6Handler(INTERRUPT_FRAME* Frame) {
__asm__ __volatile__("sti"); __asm__ __volatile__("sti");
SerialPrintf("Invalid Opcode!\n"); SerialPrintf("[FAULT] Invalid Opcode!\n");
size_t retAddr = 0; size_t retAddr = 0;
size_t opcodeAddr = Frame->rip; size_t opcodeAddr = Frame->rip;
__asm__ __volatile__("popq %%rax\n\t" "pushq %%rax": "=a" (retAddr) : :); __asm__ __volatile__("popq %%rax\n\t" "pushq %%rax": "=a" (retAddr) : :);
SerialPrintf("Opcode is at 0x%x, called from 0x%p\r\n", opcodeAddr, retAddr); SerialPrintf("[FAULT] Opcode is at 0x%x, called from 0x%p\r\n", opcodeAddr, retAddr);
StackTrace(15);
for(;;) {} for(;;) {}
} }
@ -331,12 +333,17 @@ __attribute__((interrupt)) void ISR12Handler(INTERRUPT_FRAME* Frame, size_t Erro
ISR_Error_Common(Frame, ErrorCode, 12); ISR_Error_Common(Frame, ErrorCode, 12);
} }
__attribute__((interrupt)) void ISR13Handler(INTERRUPT_FRAME* Frame, size_t ErrorCode) { __attribute__((interrupt)) void ISR13Handler(INTERRUPT_FRAME* Frame, size_t ErrorCode) {
SerialPrintf("\r\n\n[ GPF] 0x%p\r\n", Frame->rip);
StackTrace(6);
ISR_Error_Common(Frame, ErrorCode, 13); // General Protection ISR_Error_Common(Frame, ErrorCode, 13); // General Protection
} }
__attribute__((interrupt)) void ISR14Handler(INTERRUPT_FRAME* Frame, size_t ErrorCode) { __attribute__((interrupt)) void ISR14Handler(INTERRUPT_FRAME* Frame, size_t ErrorCode) {
__asm__ __volatile__("sti"); __asm__ __volatile__("sti");
SerialPrintf("Page fault! Caused by: [\r\n"); SerialPrintf("\r\n\n\n[FAULT] Page fault! Caused by {\r\n");
//size_t FaultAddr = ReadControlRegister(2); //size_t FaultAddr = ReadControlRegister(2);
uint8_t FaultPres = ErrorCode & 0x1; uint8_t FaultPres = ErrorCode & 0x1;
@ -345,14 +352,14 @@ __attribute__((interrupt)) void ISR14Handler(INTERRUPT_FRAME* Frame, size_t Erro
uint8_t FaultReserved = ErrorCode & 0x8; uint8_t FaultReserved = ErrorCode & 0x8;
uint8_t FaultInst = ErrorCode & 0x10; uint8_t FaultInst = ErrorCode & 0x10;
if(!FaultPres) SerialPrintf("Accessed a page that isn't present.\r\n"); if(!FaultPres) SerialPrintf("[FAULT] Accessed a page that isn't present.\r\n");
if(FaultRW || FaultUser) SerialPrintf("Accessed a Read-Only page.\r\n"); if(FaultRW || FaultUser) SerialPrintf("[FAULT] Accessed a Read-Only page.\r\n");
if(FaultReserved) SerialPrintf("Overwrote reserved bits.\r\n"); if(FaultReserved) SerialPrintf("[FAULT] Overwrote reserved bits.\r\n");
if(FaultInst) SerialPrintf("\"Instruction Fetch\""); if(FaultInst) SerialPrintf("[FAULT] \"Instruction Fetch\"");
SerialPrintf("];");
SerialPrintf("[FAULT] } at address\n[FAULT] 0x%p\r\n\n", ReadControlRegister(2));
StackTrace(15);
ISR_Error_Common(Frame, ErrorCode, 14); // Page Fault ISR_Error_Common(Frame, ErrorCode, 14); // Page Fault
} }
__attribute__((interrupt)) void ISR15Handler(INTERRUPT_FRAME* Frame) { __attribute__((interrupt)) void ISR15Handler(INTERRUPT_FRAME* Frame) {

View File

@ -31,9 +31,9 @@ void PCIEnumerate() {
uint8_t class_code, subclass_code; uint8_t class_code, subclass_code;
SerialPrintf("Started PCI Enumeration."); SerialPrintf("[ PCI] Started PCI Enumeration.");
SerialPrintf("\nPCI Scan result:\n"); SerialPrintf("\n[ PCI] PCI Scan result:\n[ PCI]");
do { do {
for (device = 0; device <= 31; device++) { for (device = 0; device <= 31; device++) {
for(function = 0; function <= 7; function++) { for(function = 0; function <= 7; function++) {
@ -56,8 +56,8 @@ void PCIEnumerate() {
* If this check is true, then nothing is logged and we continue for the next loop. * If this check is true, then nothing is logged and we continue for the next loop.
*/ */
if(vendor_id != 0xFFFF) { if(vendor_id != 0xFFFF) {
SerialPrintf("\n\t%x:%x:\n\t\tVendor: %x\n\t\tDevice: %x", bus, device, vendor_id, device_id); SerialPrintf("[ PCI]\n[ PCI]\t%x:%x:\n[ PCI]\t\tVendor: %x\n[ PCI]\t\tDevice: %x", bus, device, vendor_id, device_id);
SerialPrintf("\n\t\tClass: %s\n\t\tDevice Type: %s\n\t\tRevision: %d\n", PCIGetClassName(class_code), PCIGetDeviceName_Subclass(class_code, subclass_code, device_progif), device_revision); SerialPrintf("\n[ PCI]\t\tClass: %s\n[ PCI]\t\tDevice Type: %s\n[ PCI]\t\tRevision: %d\n", PCIGetClassName(class_code), PCIGetDeviceName_Subclass(class_code, subclass_code, device_progif), device_revision);
} }
/* If the PCI Device header tells us that this is not a multifunction device, /* If the PCI Device header tells us that this is not a multifunction device,

View File

@ -63,8 +63,8 @@ void InitPrint() {
PrintInfo.charsPerRow = bootldr.fb_width / (PrintInfo.charScale * PrintInfo.charWidth) - 5; PrintInfo.charsPerRow = bootldr.fb_width / (PrintInfo.charScale * PrintInfo.charWidth) - 5;
PrintInfo.rowsPerScrn = bootldr.fb_height / (PrintInfo.charScale * PrintInfo.charHeight); PrintInfo.rowsPerScrn = bootldr.fb_height / (PrintInfo.charScale * PrintInfo.charHeight);
SerialPrintf("A single character is %ux%u pixels.\r\n", PrintInfo.charScale * PrintInfo.charWidth, PrintInfo.charScale * PrintInfo.charHeight); SerialPrintf("[Print] A single character is %ux%u pixels.\r\n", PrintInfo.charScale * PrintInfo.charWidth, PrintInfo.charScale * PrintInfo.charHeight);
SerialPrintf("The screen is %ux%u, meaning you can fit %ux%u characters on screen.\r\n", bootldr.fb_width, bootldr.fb_height, PrintInfo.charsPerRow, PrintInfo.rowsPerScrn); SerialPrintf("[Print] The screen is %ux%u, meaning you can fit %ux%u characters on screen.\r\n", bootldr.fb_width, bootldr.fb_height, PrintInfo.charsPerRow, PrintInfo.rowsPerScrn);
} }