43 lines
1.3 KiB
C
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) {}
|
|
}
|