From 0de541b069b2c44d472192b5791e6affbc9b2168 Mon Sep 17 00:00:00 2001 From: Curle Date: Mon, 9 Nov 2020 18:41:34 +0000 Subject: [PATCH] Add stack unwinding to critical ISRs. Also adjust the formatting of serial prints.. --- chroma/kernel.c | 6 +++--- chroma/system/interrupts.c | 35 +++++++++++++++++++++-------------- chroma/system/pci.c | 10 +++++----- chroma/video/draw.c | 4 ++-- 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/chroma/kernel.c b/chroma/kernel.c index 2295469..6e279d4 100644 --- a/chroma/kernel.c +++ b/chroma/kernel.c @@ -21,10 +21,10 @@ address_space_t KernelAddressSpace; int Main(void) { KernelAddressSpace = (address_space_t) {0}; - SerialPrintf("\r\nBooting Chroma..\r\n"); - SerialPrintf("Kernel loaded at 0x%p, ends at 0x%p, is %d bytes long.\r\n", KernelAddr, KernelEnd, KernelEnd - KernelAddr); + SerialPrintf("\r\n[ boot] Booting Chroma..\r\n"); + 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(); diff --git a/chroma/system/interrupts.c b/chroma/system/interrupts.c index ea03bea..102354e 100644 --- a/chroma/system/interrupts.c +++ b/chroma/system/interrupts.c @@ -97,7 +97,7 @@ void ISR_Common(INTERRUPT_FRAME* Frame, size_t Exception) { FillScreen(0x0000FF00); /* 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]); //panic(); } @@ -113,8 +113,8 @@ void ISR_Error_Common(INTERRUPT_FRAME* Frame, size_t ErrorCode, size_t Exception FillScreen(0x0000FF00); - SerialPrintf("ISR Error %d raised, EC %d!\r\n", Exception, ErrorCode); - SerialPrintf("%s exception!\r\n", ExceptionStrings[Exception]); + SerialPrintf("[ ISR] ISR Error %d raised, EC %d!\r\n", Exception, ErrorCode); + SerialPrintf("[ ISR] %s exception!\r\n", ExceptionStrings[Exception]); while(true) {} //serialPrint(ExceptionStrings[Exception]); //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]; // If there's something there, if(Handler) { - SerialPrintf("IRQ %d raised!\r\n", Interrupt); + SerialPrintf("[ IRQ] IRQ %d raised!\r\n", Interrupt); // Call the handler. 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. */ WritePort(0x20, 0x20, 1); + } /* 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"); - SerialPrintf("Invalid Opcode!\n"); + SerialPrintf("[FAULT] Invalid Opcode!\n"); size_t retAddr = 0; size_t opcodeAddr = Frame->rip; __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(;;) {} } @@ -331,12 +333,17 @@ __attribute__((interrupt)) void ISR12Handler(INTERRUPT_FRAME* Frame, size_t Erro ISR_Error_Common(Frame, ErrorCode, 12); } __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 } __attribute__((interrupt)) void ISR14Handler(INTERRUPT_FRAME* Frame, size_t ErrorCode) { __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); 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 FaultInst = ErrorCode & 0x10; - if(!FaultPres) SerialPrintf("Accessed a page that isn't present.\r\n"); - if(FaultRW || FaultUser) SerialPrintf("Accessed a Read-Only page.\r\n"); - if(FaultReserved) SerialPrintf("Overwrote reserved bits.\r\n"); - if(FaultInst) SerialPrintf("\"Instruction Fetch\""); + if(!FaultPres) SerialPrintf("[FAULT] Accessed a page that isn't present.\r\n"); + if(FaultRW || FaultUser) SerialPrintf("[FAULT] Accessed a Read-Only page.\r\n"); + if(FaultReserved) SerialPrintf("[FAULT] Overwrote reserved bits.\r\n"); + 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 } __attribute__((interrupt)) void ISR15Handler(INTERRUPT_FRAME* Frame) { diff --git a/chroma/system/pci.c b/chroma/system/pci.c index 55413be..52cbd4c 100644 --- a/chroma/system/pci.c +++ b/chroma/system/pci.c @@ -31,9 +31,9 @@ void PCIEnumerate() { uint8_t class_code, subclass_code; - SerialPrintf("Started PCI Enumeration."); - - SerialPrintf("\nPCI Scan result:\n"); + SerialPrintf("[ PCI] Started PCI Enumeration."); + + SerialPrintf("\n[ PCI] PCI Scan result:\n[ PCI]"); do { for (device = 0; device <= 31; device++) { 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(vendor_id != 0xFFFF) { - SerialPrintf("\n\t%x:%x:\n\t\tVendor: %x\n\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("[ PCI]\n[ PCI]\t%x:%x:\n[ PCI]\t\tVendor: %x\n[ PCI]\t\tDevice: %x", bus, device, vendor_id, device_id); + 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, diff --git a/chroma/video/draw.c b/chroma/video/draw.c index 10e77ef..4ea38d6 100644 --- a/chroma/video/draw.c +++ b/chroma/video/draw.c @@ -63,8 +63,8 @@ void InitPrint() { PrintInfo.charsPerRow = bootldr.fb_width / (PrintInfo.charScale * PrintInfo.charWidth) - 5; 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("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] A single character is %ux%u pixels.\r\n", PrintInfo.charScale * PrintInfo.charWidth, PrintInfo.charScale * PrintInfo.charHeight); + 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); }