#include #include #include #include #include #include #include #include #include #include #include #include #define PTR32(x) ((void *)((uintptr_t)(x))) static ml_cpu_block g_bootstrap_cpu = {0}; /* start and end of kernel image (physical addresses) */ extern char __pstart[], __pend[]; static void bootstrap_cpu_init(void) { ml_cpu_block_init(&g_bootstrap_cpu); ml_cpu_block_use(&g_bootstrap_cpu); } static void early_vm_init(void) { uintptr_t alloc_start = VM_KERNEL_VOFFSET; /* boot code mapped 2 GiB of memory from VM_KERNEL_VOFFSET */ uintptr_t alloc_end = VM_KERNEL_VOFFSET + 0x7fffffff; memblock_init(alloc_start, alloc_end, VM_KERNEL_VOFFSET); printk("memblock: allocating from [0x%llx-0x%llx]", alloc_start, alloc_end); memblock_reserve(0x00, (uintptr_t)__pend); printk("memblock: reserved bios+kernel at [0x%016llx-0x%016llx]", 0, (uintptr_t)__pend); } int ml_init(uintptr_t arg) { multiboot_info_t *mb = (multiboot_info_t *)arg; bootstrap_cpu_init(); vgacon_init(); print_kernel_banner(); early_vm_init(); e820_scan(PTR32(mb->mmap_addr), mb->mmap_length); pmap_bootstrap(); acpi_init(); vm_zone_descriptor_t vm_zones[] = { { .zd_id = VM_ZONE_DMA, .zd_node = 0, .zd_name = "dma", .zd_base = 0x00, .zd_limit = 0xffffff }, { .zd_id = VM_ZONE_NORMAL, .zd_node = 0, .zd_name = "normal", .zd_base = 0x1000000, .zd_limit = UINTPTR_MAX }, }; vm_bootstrap(vm_zones, sizeof vm_zones / sizeof vm_zones[0]); return 0; }