// supposed to protect against stack smashing but we have no way to actually like // do anything when we detect it soooo... extern "C" void __stack_chk_fail(void) { return; } #include "kernelUtil.h" #include "gdt/gdt.h" #include "interrupts/IDT.h" #include "interrupts/interrupts.h" KernelInfo kernelInfo; PageTableManager pageTableManager = NULL; void PrepareMemory(BootInfo* bootInfo){ uint64_t mMapEntries = bootInfo->mMapSize / bootInfo->mMapDescriptorSize; GlobalAllocator = PageFrameAllocator(); GlobalAllocator.ReadEFIMemoryMap(bootInfo->mMap, bootInfo->mMapSize, bootInfo->mMapDescriptorSize); uint64_t kernelSize = (uint64_t)&_KernelEnd - (uint64_t)&_KernelStart; uint64_t kernelPages = (uint64_t)kernelSize / 4096 + 1; GlobalAllocator.LockPages(&_KernelStart, kernelPages); PageTable* PML4 = (PageTable*)GlobalAllocator.RequestPage(); memset(PML4, 0, 0x1000); pageTableManager = PageTableManager(PML4); for (uint64_t t = 0; t < GetMemorySize(bootInfo->mMap, mMapEntries, bootInfo->mMapDescriptorSize); t+= 0x1000){ pageTableManager.MapMemory((void*)t, (void*)t); } uint64_t fbBase = (uint64_t)bootInfo->framebuffer->BaseAddress; uint64_t fbSize = (uint64_t)bootInfo->framebuffer->BufferSize + 0x1000; GlobalAllocator.LockPages((void*)fbBase, fbSize/ 0x1000 + 1); for (uint64_t t = fbBase; t < fbBase + fbSize; t += 4096){ pageTableManager.MapMemory((void*)t, (void*)t); } asm ("mov %0, %%cr3" : : "r" (PML4)); 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; gdtDescriptor.Offset = (uint64_t)&DefaultGDT; LoadGDT(&gdtDescriptor); PrepareMemory(bootInfo); memset(bootInfo->framebuffer->BaseAddress, 0, bootInfo->framebuffer->BufferSize); PrepareInterrupts(); return kernelInfo; }