Add bootstrap source.
Made to manage holdover from Syncboot, but is half-finished because of an issue with the prior mentioned header file.
This commit is contained in:
parent
2bfe904014
commit
c9bd659f5c
98
kernel/bootstrap.c
Normal file
98
kernel/bootstrap.c
Normal file
|
@ -0,0 +1,98 @@
|
|||
/************************
|
||||
*** Team Kitty, 2019 ***
|
||||
*** Sync ***
|
||||
***********************/
|
||||
|
||||
/* This file contains all of the functions required to handle
|
||||
* the system handover from Syncboot.
|
||||
*/
|
||||
|
||||
#include <kernel.h>
|
||||
|
||||
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");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user