void * initializeKernelBinary() { char buffer[10]; ncPrint("[x64BareBones]"); ncNewline(); ncPrint("CPU Vendor:"); ncPrint(cpuVendor(buffer)); ncNewline(); ncPrint("[Loading modules]"); ncNewline(); void * moduleAddresses[] = { sampleCodeModuleAddress, sampleDataModuleAddress }; loadModules(&endOfKernelBinary, moduleAddresses); ncPrint("[Done]"); ncNewline(); ncNewline(); ncPrint("[Initializing kernel's binary]"); ncNewline(); clearBSS(&bss, &endOfKernel - &bss); ncPrint(" text: 0x"); ncPrintHex((uint64_t)&text); ncNewline(); ncPrint(" rodata: 0x"); ncPrintHex((uint64_t)&rodata); ncNewline(); ncPrint(" data: 0x"); ncPrintHex((uint64_t)&data); ncNewline(); ncPrint(" bss: 0x"); ncPrintHex((uint64_t)&bss); ncNewline(); ncPrint("[Done]"); ncNewline(); ncNewline(); return getStackBase(); }
static void loadModule(uint8_t ** module, void * targetModuleAddress) { uint32_t moduleSize = readUint32(module); ncPrint(" Will copy module at 0x"); ncPrintHex((uint64_t)*module); ncPrint(" to 0x"); ncPrintHex((uint64_t)targetModuleAddress); ncPrint(" ("); ncPrintDec(moduleSize); ncPrint(" bytes)"); memcpy(targetModuleAddress, *module, moduleSize); *module += moduleSize; ncPrint(" [Done]"); ncNewline(); }
int main() { setup_IDT_entry(0x20, 0x8,(uint64_t) &_irq00Handler, 0x8E); setup_IDT_entry(0x21, 0x8, (uint64_t)&_irq01Handler, 0x8E); setup_IDT_entry(0x80, 0x8,(uint64_t) &syscallHandler, 0x8E); picMasterMask(0xFC); picSlaveMask(0xFF); _sti(); ncPrint("[Kernel Main]"); ncNewline(); ncPrint(" Sample code module at 0x"); ncPrintHex((uint64_t)sampleCodeModuleAddress); ncNewline(); ncPrint(" Calling the sample code module returned: "); ncPrintHex(((EntryPoint)sampleCodeModuleAddress)()); ncNewline(); ncNewline(); ncPrint(" Sample data module at 0x"); ncPrintHex((uint64_t)sampleDataModuleAddress); ncNewline(); ncPrint(" Sample data module contents: "); ncPrint((char*)sampleDataModuleAddress); ncNewline(); ncPrint("[Finished]"); while(1); ncClear(); return 0; }