#include "../../lnxboot.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);

	char* kernel_load_addr = (char*)setup_info->code32_start;
	if (kernel_load_addr == 0) kernel_load_addr = (char*)0x100000;	

	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);

	// we fucked up
	while (1) {}
}