/* * This file contains the entrance point for the Kernel proper. The code here * is called by the bootloader when it finishes. The kmain routine is * responsible for setting up memory and starting the processes running. */ #include #include #include #include #include "multiboot.h" #include "desc.h" #include "acpi/acpi.h" extern char _bss[], _end[]; /* Per-CPU Setup */ void cpu_load(void) { /* Initialise SSE */ asm volatile( "mov %cr0, %eax;" "andl $0xfffffffb, %eax;" "orl $0x2, %eax;" "mov %eax, %cr0;" "mov %cr4, %eax;" "orl $0x600, %eax;" "mov %eax, %cr4;" ); /* Initialise CR4.PGE */ asm volatile( "mov %cr4, %eax;" "orl $0x10, %eax;" "mov %eax, %cr4;" ); /* Tables */ cpu_load_idt(); cpu_load_gdt(); } /* Kernel main function */ _Noreturn void kmain(uint32_t esp, struct MultibootInfo *mbinfo) { void *ebda = (void *) (*((uint16_t *) 0x040E) << 4); memset(_bss, 0, _end - _bss); /* Setup frame allocator */ init_frames(mbinfo->mmapLen, (void *) mbinfo->mmapAddr); /* Processor startup */ init_idt(); init_pic(); cpu_load(); init_acpi(ebda); /* Initialise paging */ init_paging(); panic("End of kernel!"); }