#include #include #include #include #include #include #include "cpu.h" #include "serial.h" #include "kprint.h" #include "memory.h" static noreturn void hang(void); static void parse_efi_memmap(struct efi_memory_map_data *map) { struct memory_range *ranges = (struct memory_range *)map->data; int entries = map->size / map->descsize; for (int i = 0; i < entries; i++) { EFI_MEMORY_DESCRIPTOR *desc; desc = (EFI_MEMORY_DESCRIPTOR *)((char *)map->data + i * map->descsize); enum memory_range_type type; phys_addr_t base; size_t size; base = desc->PhysicalStart; size = desc->NumberOfPages * EFI_PAGE_SIZE; switch (desc->Type) { case EfiConventionalMemory: case EfiBootServicesData: case EfiBootServicesCode: case EfiLoaderData: case EfiLoaderCode: type = AVAILABLE_MEMORY; break; case SystemMemoryType: type = SYSTEM_MEMORY; break; default: type = RESERVED_MEMORY; } ranges[i].type = type; ranges[i].base = base; ranges[i].size = size; } memory_init(ranges, entries); } noreturn void kernel_entry(struct efi_boot_data *data) { (void)data; cpu_init(); serial_init(); kputs(" i'm in\r\n"); parse_efi_memmap(data->memory_map); for (int i = 0; i < 10; i++) { phys_addr_t page = page_alloc(); (void)page; page_free(page); } hang(); } static noreturn void hang(void) { __asm__ ("cli\n\t"); while (true) __asm__ ("hlt\n\t"); }