#include <kernel/graphics/vesa.h>
#include <kernel/gdt/gdt.h>
#include <kernel/interrupts/interrupts.h>
#include <kernel/io/io.h>
#include <kernel/timer/timer.h>
#include <kernel/memory/paging.h>
#include <kernel/input/input.h>
#include <kernel/acpi/acpi.h>
#include <kernel/lib/lib.h>
#include <kernel/syscall/syscall.h>
#include <kernel/pci/pci.h>
#include <kernel/net/network.h>
#include <kernel/tasks/task.h>
#include <kernel/fs/load.h>
#include <kernel/fs/elf.h>
#include <kernel/lib/stdio.h>

void kernel_main(uint32_t initial_stack)
{
	initial_esp = initial_stack;
	vga_log("Installing basic features of Melvix...");

	// Install features
	memory_init();
	gdt_install();
	init_serial();
	acpi_install();
	idt_install();
	isrs_install();
	irq_install();
	paging_install();

	load_binaries();
	set_optimal_resolution();

	// Install drivers
	cli();
	timer_install();
	mouse_install();
	keyboard_install();
	pci_remap();
	network_install();
	sti();

	// tasking_install();

	// Get hardware information
	// get_smbios();

	// Print total memory
	info("Total memory found: %dMiB", (memory_get_all() >> 10) + 1);

#ifdef INSTALL_MELVIX
#include <kernel/fs/install.h>
	serial_printf("Install flag given!");
	if ((*((uint8_t *)0x9000)) == 0xE0)
		install_melvix();
#endif

	loader_init();
	elf_init();
	exec_start((uint8_t *)userspace);

	//    syscalls_install();
	//    exec(userspace);

	panic("This should NOT happen!");

	// asm ("div %0" :: "r"(0)); // Exception testing x/0
}