diff --git a/OVMFbin/OVMF_VARS-pure-efi.fd b/OVMFbin/OVMF_VARS-pure-efi.fd index 43d67d5..9bf4b9b 100644 Binary files a/OVMFbin/OVMF_VARS-pure-efi.fd and b/OVMFbin/OVMF_VARS-pure-efi.fd differ diff --git a/kernel/bin/CustomOS.img b/kernel/bin/CustomOS.img index 420c522..1e056f2 100644 Binary files a/kernel/bin/CustomOS.img and b/kernel/bin/CustomOS.img differ diff --git a/kernel/bin/kernel.elf b/kernel/bin/kernel.elf index 0b569f6..e778908 100755 Binary files a/kernel/bin/kernel.elf and b/kernel/bin/kernel.elf differ diff --git a/kernel/lib/BasicRenderer.o b/kernel/lib/BasicRenderer.o index d94fbe7..b5815d4 100644 Binary files a/kernel/lib/BasicRenderer.o and b/kernel/lib/BasicRenderer.o differ diff --git a/kernel/lib/interrupts/interrupts.o b/kernel/lib/interrupts/interrupts.o index 91ac737..8d51695 100644 Binary files a/kernel/lib/interrupts/interrupts.o and b/kernel/lib/interrupts/interrupts.o differ diff --git a/kernel/lib/kernel.o b/kernel/lib/kernel.o index baebd3a..398d0c2 100644 Binary files a/kernel/lib/kernel.o and b/kernel/lib/kernel.o differ diff --git a/kernel/lib/kernelUtil.o b/kernel/lib/kernelUtil.o index 19d2fbc..2bf1569 100644 Binary files a/kernel/lib/kernelUtil.o and b/kernel/lib/kernelUtil.o differ diff --git a/kernel/lib/panic.o b/kernel/lib/panic.o new file mode 100644 index 0000000..4da2650 Binary files /dev/null and b/kernel/lib/panic.o differ diff --git a/kernel/src/BasicRenderer.cpp b/kernel/src/BasicRenderer.cpp index 166de8c..0f6810c 100644 --- a/kernel/src/BasicRenderer.cpp +++ b/kernel/src/BasicRenderer.cpp @@ -40,4 +40,23 @@ void BasicRenderer::Print(const char* str) { chr++; } +} + +void BasicRenderer::Clear(uint32_t colour) { + uint64_t fbBase = (uint64_t)targetFramebuffer->BaseAddress; + uint64_t bytesPerScanline = targetFramebuffer->PixelsPerScanline * 4; + uint64_t fbHeight = targetFramebuffer->Height; + uint64_t fbSize = targetFramebuffer->BufferSize; + + for (int verticalScanline = 0; verticalScanline < fbHeight; verticalScanline ++){ + uint64_t pixPtrBase = fbBase + (bytesPerScanline * verticalScanline); + for (uint32_t* pixPtr = (uint32_t*)pixPtrBase; pixPtr < (uint32_t*)(pixPtrBase + bytesPerScanline); pixPtr ++){ + *pixPtr = colour; + } + } +} + +void BasicRenderer::Next() { + cursorPosition.x = 0; + cursorPosition.y += 16; } \ No newline at end of file diff --git a/kernel/src/BasicRenderer.h b/kernel/src/BasicRenderer.h index b72b81c..877dc2a 100644 --- a/kernel/src/BasicRenderer.h +++ b/kernel/src/BasicRenderer.h @@ -2,6 +2,7 @@ #include "math.h" #include "Framebuffer.h" #include "PSF1Font.h" +#include class BasicRenderer { public: @@ -12,6 +13,8 @@ class BasicRenderer { unsigned int Colour; void Print(const char* str); void PutChar(char chr, unsigned int xOff, unsigned int yOff); + void Clear(uint32_t colour); + void Next(); }; extern BasicRenderer* GlobalRenderer; \ No newline at end of file diff --git a/kernel/src/interrupts/interrupts.cpp b/kernel/src/interrupts/interrupts.cpp index 65fb1f3..ead8eb9 100644 --- a/kernel/src/interrupts/interrupts.cpp +++ b/kernel/src/interrupts/interrupts.cpp @@ -1,6 +1,17 @@ #include "interrupts.h" +#include "../panic.h" __attribute__((interrupt)) void PageFault_Handler(struct interrupt_frame* frame) { - GlobalRenderer->Print("Page fault caught!"); + Panic("Page Fault"); + while (true); +} + +__attribute__((interrupt)) void DoubleFault_Handler(struct interrupt_frame* frame) { + Panic("Double Fault"); + while (true); +} + +__attribute__((interrupt)) void GPFault_Handler(struct interrupt_frame* frame) { + Panic("General Protection Fault"); while (true); } \ No newline at end of file diff --git a/kernel/src/interrupts/interrupts.h b/kernel/src/interrupts/interrupts.h index 1dec6f8..c14ef68 100644 --- a/kernel/src/interrupts/interrupts.h +++ b/kernel/src/interrupts/interrupts.h @@ -3,4 +3,6 @@ struct interrupt_frame; -__attribute__((interrupt)) void PageFault_Handler(struct interrupt_frame* frame); \ No newline at end of file +__attribute__((interrupt)) void PageFault_Handler(struct interrupt_frame* frame); +__attribute__((interrupt)) void DoubleFault_Handler(struct interrupt_frame* frame); +__attribute__((interrupt)) void GPFault_Handler(struct interrupt_frame* frame); \ No newline at end of file diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index 9f84b84..b0c76ba 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -4,8 +4,11 @@ extern "C" void _start(BootInfo* bootInfo) { KernelInfo kernelInfo = InitializeKernel(bootInfo); PageTableManager* pageTableManager = kernelInfo.pageTableManager; + GlobalRenderer->Clear(0xFF191919); GlobalRenderer->Print("Kernel initialized successfully!"); - GlobalRenderer->cursorPosition = {0, GlobalRenderer->cursorPosition.y + 18}; + GlobalRenderer->Next(); + + asm("int $0x0e"); // make sure we never return from our OS while (true); diff --git a/kernel/src/kernelUtil.cpp b/kernel/src/kernelUtil.cpp index 9a030cf..6de702c 100644 --- a/kernel/src/kernelUtil.cpp +++ b/kernel/src/kernelUtil.cpp @@ -54,6 +54,16 @@ void PrepareInterrupts() { int_PageFault->type_attr = IDT_TA_InterruptGate; int_PageFault->selector = 0x08; // kernel code segment + IDTDescEntry* int_DoubleFault = (IDTDescEntry*)(idtr.Offset + 0x8 * sizeof(IDTDescEntry)); + int_DoubleFault->SetOffset((uint64_t)DoubleFault_Handler); + int_DoubleFault->type_attr = IDT_TA_InterruptGate; + int_DoubleFault->selector = 0x08; // kernel code segment + + IDTDescEntry* int_GPFault = (IDTDescEntry*)(idtr.Offset + 0xD * sizeof(IDTDescEntry)); + int_GPFault->SetOffset((uint64_t)GPFault_Handler); + int_GPFault->type_attr = IDT_TA_InterruptGate; + int_GPFault->selector = 0x08; // kernel code segment + // load idt asm("lidt %0" : : "m" (idtr)); } diff --git a/kernel/src/panic.cpp b/kernel/src/panic.cpp new file mode 100644 index 0000000..bbd1da9 --- /dev/null +++ b/kernel/src/panic.cpp @@ -0,0 +1,10 @@ +#include "panic.h" +#include "BasicRenderer.h" + +void Panic(const char* panicMessage) { + GlobalRenderer->Clear(0xFF000000); + GlobalRenderer->Colour = 0xFFFF0000; + GlobalRenderer->cursorPosition = {0,0}; + GlobalRenderer->Print("PANIC!!! "); + GlobalRenderer->Print(panicMessage); +} \ No newline at end of file diff --git a/kernel/src/panic.h b/kernel/src/panic.h new file mode 100644 index 0000000..84714df --- /dev/null +++ b/kernel/src/panic.h @@ -0,0 +1,3 @@ +#pragma once + +void Panic(const char* panicMessage); \ No newline at end of file