#include "../../lnxboot.h" #include "../../gdb/gdb.h" #include #include "gzip.h" #include "elf.h" extern void* _CC_cckernel; extern void* _CC_ecckernel; /// C entry point for cckernel [[noreturn]] void ccmain(void* imgbase, struct boot_params* boot_params) { struct setup_info* setup_info = (struct setup_info*)((void*)boot_params + 0x1f1); // Fill the lcrash debug data block struct GdbDataBlock* GdbDataBlock = (struct GdbDataBlock*)0x100000; GdbDataBlock->BuildDirectory = LW_CONFIG_PROJECT_OUTPUT_DIR + (uptr)imgbase; GdbDataBlock->CCKernelLoaded = true; GdbDataBlock->CCKernelBase = imgbase; GdbDataBlock->KernelLoaded = false; GdbDataBlock->KernelBase = NULL; GdbDataBlock->Update++; // Determine the kernel load address char* kernel_load_addr = (char*)setup_info->code32_start; if (kernel_load_addr == 0) kernel_load_addr = (char*)0x101000; char* cckernel = imgbase + (uptr)&_CC_cckernel; //for (long i = 0; i < setup_info->payload_length; i++) { // kernel_load_addr[i] = cckernel[i]; //} // decompress the kernel uptr BinaryLength = GzipDecompress(cckernel, (u8*)&_CC_ecckernel - (u8*)&_CC_cckernel, kernel_load_addr); // start the kernel ElfExecute(kernel_load_addr, kernel_load_addr + BinaryLength + 0x1000 - BinaryLength % 0x1000, boot_params); // we fucked up while (1) {} }