Files
mango/arch/x86_64/init.c

76 lines
1.8 KiB
C
Raw Normal View History

#include <socks/pmap.h>
#include <socks/types.h>
2023-02-05 10:50:13 +00:00
#include <arch/e820.h>
2023-02-04 19:19:48 +00:00
#include <socks/init.h>
2023-02-05 10:50:13 +00:00
#include <socks/memblock.h>
#include <socks/vm.h>
#include <socks/printk.h>
#include <socks/machine/cpu.h>
#include <arch/vgacon.h>
2023-02-09 19:09:07 +00:00
#include <arch/acpi.h>
2023-02-05 10:50:13 +00:00
#define PTR32(x) ((void *)((uintptr_t)(x)))
static ml_cpu_block g_bootstrap_cpu = {0};
2023-02-05 10:50:13 +00:00
/* 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);
}
2023-02-05 10:50:13 +00:00
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)
{
2023-02-05 10:50:13 +00:00
multiboot_info_t *mb = (multiboot_info_t *)arg;
2023-02-07 16:00:45 +00:00
bootstrap_cpu_init();
vgacon_init();
2023-02-04 19:19:48 +00:00
print_kernel_banner();
2023-02-08 20:24:40 +00:00
2023-02-05 10:50:13 +00:00
early_vm_init();
e820_scan(PTR32(mb->mmap_addr), mb->mmap_length);
pmap_bootstrap();
2023-02-09 19:09:07 +00:00
acpi_init();
2023-02-07 16:00:45 +00:00
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]);
/* test allocation */
vm_page_t *p = vm_page_alloc(VM_PAGE_16K, 0);
if (p) {
2023-02-08 20:24:40 +00:00
void *p_ptr = vm_page_get_vaddr(p);
2023-02-07 16:00:45 +00:00
2023-02-08 20:24:40 +00:00
printk("allocated 16K at %p", p_ptr);
} else {
printk("alloc failed");
}
2023-02-07 16:00:45 +00:00
return 0;
}