diff --git a/OVMFbin/OVMF_VARS-pure-efi.fd b/OVMFbin/OVMF_VARS-pure-efi.fd index 829b1b4..43d67d5 100644 Binary files a/OVMFbin/OVMF_VARS-pure-efi.fd and b/OVMFbin/OVMF_VARS-pure-efi.fd differ diff --git a/kernel/Makefile b/kernel/Makefile index ae40d4f..6ef303b 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -26,6 +26,11 @@ DIRS = $(wildcard $(SRCDIR)/*) kernel: $(OBJS) link +$(OBJDIR)/interrupts/interrupts.o: $(SRCDIR)/interrupts/interrupts.cpp + @ echo !==== COMPILING $^ + @ mkdir -p $(@D) + $(CC) -mno-red-zone -mgeneral-regs-only -ffreestanding -c $^ -o $@ + $(OBJDIR)/%.o: $(SRCDIR)/%.cpp @ echo !==== COMPILING $^ @ mkdir -p $(@D) diff --git a/kernel/bin/CustomOS.img b/kernel/bin/CustomOS.img index ef6e386..420c522 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 949fb6a..0b569f6 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 07584e0..d94fbe7 100644 Binary files a/kernel/lib/BasicRenderer.o and b/kernel/lib/BasicRenderer.o differ diff --git a/kernel/lib/interrupts/IDT.o b/kernel/lib/interrupts/IDT.o new file mode 100644 index 0000000..f8f3fba Binary files /dev/null and b/kernel/lib/interrupts/IDT.o differ diff --git a/kernel/lib/interrupts/interrupts.o b/kernel/lib/interrupts/interrupts.o new file mode 100644 index 0000000..91ac737 Binary files /dev/null and b/kernel/lib/interrupts/interrupts.o differ diff --git a/kernel/lib/kernel.o b/kernel/lib/kernel.o index 667557c..baebd3a 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 9750988..19d2fbc 100644 Binary files a/kernel/lib/kernelUtil.o and b/kernel/lib/kernelUtil.o differ diff --git a/kernel/src/BasicRenderer.cpp b/kernel/src/BasicRenderer.cpp index 0b31cbd..166de8c 100644 --- a/kernel/src/BasicRenderer.cpp +++ b/kernel/src/BasicRenderer.cpp @@ -1,5 +1,7 @@ #include "BasicRenderer.h" +BasicRenderer* GlobalRenderer; + BasicRenderer::BasicRenderer(Framebuffer* framebuffer, PSF1_FONT* psf1_Font) { targetFramebuffer = framebuffer; PSF1_Font = psf1_Font; diff --git a/kernel/src/BasicRenderer.h b/kernel/src/BasicRenderer.h index e2c8dd3..b72b81c 100644 --- a/kernel/src/BasicRenderer.h +++ b/kernel/src/BasicRenderer.h @@ -12,4 +12,6 @@ class BasicRenderer { unsigned int Colour; void Print(const char* str); void PutChar(char chr, unsigned int xOff, unsigned int yOff); -}; \ No newline at end of file +}; + +extern BasicRenderer* GlobalRenderer; \ No newline at end of file diff --git a/kernel/src/interrupts/IDT.cpp b/kernel/src/interrupts/IDT.cpp new file mode 100644 index 0000000..738c7b5 --- /dev/null +++ b/kernel/src/interrupts/IDT.cpp @@ -0,0 +1,15 @@ +#include "IDT.h" + +void IDTDescEntry::SetOffset(uint64_t offset) { + offset0 = (uint16_t)(offset & 0x000000000000ffff); // lower 16 bits -> offset0 + offset1 = (uint16_t)((offset & 0x00000000ffff0000) >> 16); // upper 16 bits -> offset1 + offset2 = (uint32_t)((offset & 0xffffffff00000000) >> 32); // upper 32 bits -> offset2 +} + +uint64_t IDTDescEntry::GetOffset() { + uint64_t offset = 0; + offset |= (uint64_t)offset0; + offset |= (uint64_t)offset1 << 16; + offset |= (uint64_t)offset2 << 32; + return offset; +} \ No newline at end of file diff --git a/kernel/src/interrupts/IDT.h b/kernel/src/interrupts/IDT.h new file mode 100644 index 0000000..52bf296 --- /dev/null +++ b/kernel/src/interrupts/IDT.h @@ -0,0 +1,24 @@ +#pragma once +#include + +#define IDT_TA_InterruptGate 0b10001110 +#define IDT_TA_CallGate 0b10001100 +#define IDT_TA_TrapGate 0b10001111 + +struct IDTDescEntry { + uint16_t offset0; // lower 16 bits of offset + uint16_t selector; // segment selector + uint8_t ist; // interrupt stack table offset + uint8_t type_attr; // interrupt gate, trap gate, etc... + uint16_t offset1; // upper 16 bits of offset + uint32_t offset2; // upper 32 bits of offset + uint32_t ignore; // unused + + void SetOffset(uint64_t offset); + uint64_t GetOffset(); +}; + +struct IDTR { + uint16_t Limit; + uint64_t Offset; +}__attribute__((packed)); \ No newline at end of file diff --git a/kernel/src/interrupts/interrupts.cpp b/kernel/src/interrupts/interrupts.cpp new file mode 100644 index 0000000..65fb1f3 --- /dev/null +++ b/kernel/src/interrupts/interrupts.cpp @@ -0,0 +1,6 @@ +#include "interrupts.h" + +__attribute__((interrupt)) void PageFault_Handler(struct interrupt_frame* frame) { + GlobalRenderer->Print("Page fault caught!"); + while (true); +} \ No newline at end of file diff --git a/kernel/src/interrupts/interrupts.h b/kernel/src/interrupts/interrupts.h new file mode 100644 index 0000000..1dec6f8 --- /dev/null +++ b/kernel/src/interrupts/interrupts.h @@ -0,0 +1,6 @@ +#pragma once +#include "../BasicRenderer.h" + +struct interrupt_frame; + +__attribute__((interrupt)) void PageFault_Handler(struct interrupt_frame* frame); \ No newline at end of file diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index 9e0ae7d..9f84b84 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -2,12 +2,11 @@ extern "C" void _start(BootInfo* bootInfo) { KernelInfo kernelInfo = InitializeKernel(bootInfo); - BasicRenderer newRenderer = BasicRenderer(bootInfo->framebuffer, bootInfo->psf1_Font); PageTableManager* pageTableManager = kernelInfo.pageTableManager; - newRenderer.Print("Kernel initialized successfully! (we didn't crash lol)"); - newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; - + GlobalRenderer->Print("Kernel initialized successfully!"); + GlobalRenderer->cursorPosition = {0, GlobalRenderer->cursorPosition.y + 18}; + // make sure we never return from our OS while (true); } \ No newline at end of file diff --git a/kernel/src/kernelUtil.cpp b/kernel/src/kernelUtil.cpp index 76727f7..9a030cf 100644 --- a/kernel/src/kernelUtil.cpp +++ b/kernel/src/kernelUtil.cpp @@ -6,6 +6,8 @@ extern "C" void __stack_chk_fail(void) { #include "kernelUtil.h" #include "gdt/gdt.h" +#include "interrupts/IDT.h" +#include "interrupts/interrupts.h" KernelInfo kernelInfo; PageTableManager pageTableManager = NULL; @@ -41,8 +43,25 @@ void PrepareMemory(BootInfo* bootInfo){ kernelInfo.pageTableManager = &pageTableManager; } +IDTR idtr; +void PrepareInterrupts() { + idtr.Limit = 0x0FFF; + idtr.Offset = (uint64_t)GlobalAllocator.RequestPage(); + memset((void*)idtr.Offset, 0, 0x1000); + IDTDescEntry* int_PageFault = (IDTDescEntry*)(idtr.Offset + 0xE * sizeof(IDTDescEntry)); + int_PageFault->SetOffset((uint64_t)PageFault_Handler); + int_PageFault->type_attr = IDT_TA_InterruptGate; + int_PageFault->selector = 0x08; // kernel code segment + + // load idt + asm("lidt %0" : : "m" (idtr)); +} + +BasicRenderer r = BasicRenderer(NULL, NULL); KernelInfo InitializeKernel(BootInfo* bootInfo){ + r = BasicRenderer(bootInfo->framebuffer, bootInfo->psf1_Font); + GlobalRenderer = &r; GDTDescriptor gdtDescriptor; gdtDescriptor.Size = sizeof(GDT) - 1; @@ -53,5 +72,7 @@ KernelInfo InitializeKernel(BootInfo* bootInfo){ memset(bootInfo->framebuffer->BaseAddress, 0, bootInfo->framebuffer->BufferSize); + PrepareInterrupts(); + return kernelInfo; } \ No newline at end of file