43 lines
1.3 KiB
C

#include "../../lnxboot.h"
#include "../../gdb/gdb.h"
#include <config.h>
#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) {}
}