diff --git a/kernel/bootstrap.c b/kernel/bootstrap.c new file mode 100644 index 0000000..1cdb81e --- /dev/null +++ b/kernel/bootstrap.c @@ -0,0 +1,98 @@ +/************************ + *** Team Kitty, 2019 *** + *** Sync *** + ***********************/ + +/* This file contains all of the functions required to handle + * the system handover from Syncboot. + */ + +#include + +static void UpdateSegments(void); +static void InstallInterrupt(size_t ISR, size_t Function); +static void InstallTrap(size_t ISR, size_t Function); + + + +/* Main system handover from UEFI. + * Prepares the processor, the screen, and memory. */ +void PrepareSystem(FILELOADER_PARAMS* FLOP) { + Memory_Info.MemoryMap = FLOP->MemoryMap; + Memory_Info.MemoryMapSize = FLOP->MemoryMap_Size; + Memory_Info.MemoryMapDescriptorSize = FLOP->MemoryMapDescriptorSize; + Memory_Info.MemoryMapDescriptorVersion = FLOP->MemoryMapDescriptorVersion; + + if(SetIdentityMap(FLOP->RTServices) == NULL) { + Memory_Info.MemoryMap = FLOP->MemoryMap; + } + + SetupPrinting(FLOP->GPU_Info->GPUs[0]); + /* All print functions are now available. */ + + PrepareAVX(); + + + + /* Bit 5 of CR0 is Numeric Error, which enables + * the internal x87 Floating Point Math error + * reporting. */ + size_t CR0 = ReadControlRegister(0); + // Mask CR0 to only see bit 5 + if( !(CR0 & (1 << 5))) { + // Preserve CR0, but set bit 5. + size_t TempReg = CR0 ^ (1 << 5); + // Write it back + WriteControlRegister(0, TempReg); + + // Double check. Some processors can be tricky. + TempReg = ReadControlRegister(CR0); + if(TempReg == CR0) + printf("Error setting CR0.NE\r\n"); + + } + + /* Bit 10 of CR4 is OSXMMEXCPT, which enables + * SSE instructions. */ + size_t CR4 = ReadControlRegister(4); + // Mask CR4 to only see bit 10 + if( !(CR4 & (1 << 10))) { + // Preserve CR4, but set bit 10. + size_t TempReg = CR4 ^ (1 << 10); + // Write it back + WriteControlRegister(4, TempReg); + + // Double check. Some processors can be tricky. + TempReg = ReadControlRegister(4); + if(TempReg == CR4) + printf("Error setting CR4.OSXMMEXCPT\r\n"); + } + + // Set up memory management + InstallGDT(); + InstallIDT(); + InstallMemoryMap(); + InstallPaging(); + + // Clean up UEFI's mess + ReclaimEfiBootServicesMemory(); + ReclaimEfiLoaderCodeMemory(); + + // Let Intel ME take over power management + PreparePowerManagement(); + +} + +/* A temporary system for keeping track of system performance. */ + +size_t ClockTick() { + + // We will be reading a register, so we need to split it up. + size_t RegHigh = 0, RegLow = 0; + + __asm__ __volatile__("rdtscp" : "=a" (RegLow), "=d" (RegHigh) : : "%rcx"); + +} + + +