From: Tulio A M Mendes Date: Sat, 7 Feb 2026 16:08:30 +0000 (-0300) Subject: kernel: move initrd mapping and usermode entry behind HAL X-Git-Url: https://projects.tadryanom.me/?a=commitdiff_plain;h=fecb6a365f76025789402fd4714f712f595532cf;p=AdrOS.git kernel: move initrd mapping and usermode entry behind HAL --- diff --git a/include/hal/mm.h b/include/hal/mm.h new file mode 100644 index 0000000..7b89eff --- /dev/null +++ b/include/hal/mm.h @@ -0,0 +1,10 @@ +#ifndef HAL_MM_H +#define HAL_MM_H + +#include + +#define HAL_MM_MAP_RW (1u << 0) + +int hal_mm_map_physical_range(uintptr_t phys_start, uintptr_t phys_end, uint32_t flags, uintptr_t* out_virt); + +#endif diff --git a/include/hal/usermode.h b/include/hal/usermode.h new file mode 100644 index 0000000..6a8062c --- /dev/null +++ b/include/hal/usermode.h @@ -0,0 +1,8 @@ +#ifndef HAL_USERMODE_H +#define HAL_USERMODE_H + +#include + +int hal_usermode_enter(uintptr_t user_eip, uintptr_t user_esp); + +#endif diff --git a/src/hal/arm/mm.c b/src/hal/arm/mm.c new file mode 100644 index 0000000..a11e99a --- /dev/null +++ b/src/hal/arm/mm.c @@ -0,0 +1,9 @@ +#include "hal/mm.h" + +int hal_mm_map_physical_range(uintptr_t phys_start, uintptr_t phys_end, uint32_t flags, uintptr_t* out_virt) { + (void)phys_start; + (void)phys_end; + (void)flags; + (void)out_virt; + return -1; +} diff --git a/src/hal/arm/usermode.c b/src/hal/arm/usermode.c new file mode 100644 index 0000000..f58ba73 --- /dev/null +++ b/src/hal/arm/usermode.c @@ -0,0 +1,7 @@ +#include "hal/usermode.h" + +int hal_usermode_enter(uintptr_t user_eip, uintptr_t user_esp) { + (void)user_eip; + (void)user_esp; + return -1; +} diff --git a/src/hal/mips/mm.c b/src/hal/mips/mm.c new file mode 100644 index 0000000..a11e99a --- /dev/null +++ b/src/hal/mips/mm.c @@ -0,0 +1,9 @@ +#include "hal/mm.h" + +int hal_mm_map_physical_range(uintptr_t phys_start, uintptr_t phys_end, uint32_t flags, uintptr_t* out_virt) { + (void)phys_start; + (void)phys_end; + (void)flags; + (void)out_virt; + return -1; +} diff --git a/src/hal/mips/usermode.c b/src/hal/mips/usermode.c new file mode 100644 index 0000000..f58ba73 --- /dev/null +++ b/src/hal/mips/usermode.c @@ -0,0 +1,7 @@ +#include "hal/usermode.h" + +int hal_usermode_enter(uintptr_t user_eip, uintptr_t user_esp) { + (void)user_eip; + (void)user_esp; + return -1; +} diff --git a/src/hal/riscv/mm.c b/src/hal/riscv/mm.c new file mode 100644 index 0000000..a11e99a --- /dev/null +++ b/src/hal/riscv/mm.c @@ -0,0 +1,9 @@ +#include "hal/mm.h" + +int hal_mm_map_physical_range(uintptr_t phys_start, uintptr_t phys_end, uint32_t flags, uintptr_t* out_virt) { + (void)phys_start; + (void)phys_end; + (void)flags; + (void)out_virt; + return -1; +} diff --git a/src/hal/riscv/usermode.c b/src/hal/riscv/usermode.c new file mode 100644 index 0000000..f58ba73 --- /dev/null +++ b/src/hal/riscv/usermode.c @@ -0,0 +1,7 @@ +#include "hal/usermode.h" + +int hal_usermode_enter(uintptr_t user_eip, uintptr_t user_esp) { + (void)user_eip; + (void)user_esp; + return -1; +} diff --git a/src/hal/x86/mm.c b/src/hal/x86/mm.c new file mode 100644 index 0000000..e9be2ef --- /dev/null +++ b/src/hal/x86/mm.c @@ -0,0 +1,33 @@ +#include "hal/mm.h" + +#include "vmm.h" + +#include + +int hal_mm_map_physical_range(uintptr_t phys_start, uintptr_t phys_end, uint32_t flags, uintptr_t* out_virt) { + if (!out_virt) return -1; + + if (phys_end < phys_start) phys_end = phys_start; + + const uintptr_t virt_base = 0xE0000000U; + + uintptr_t phys_start_aligned = phys_start & ~(uintptr_t)0xFFF; + uintptr_t phys_end_aligned = (phys_end + 0xFFF) & ~(uintptr_t)0xFFF; + + uintptr_t size = phys_end_aligned - phys_start_aligned; + uintptr_t pages = size >> 12; + + uint32_t vmm_flags = VMM_FLAG_PRESENT; + if (flags & HAL_MM_MAP_RW) vmm_flags |= VMM_FLAG_RW; + + uintptr_t virt = virt_base; + uintptr_t phys = phys_start_aligned; + for (uintptr_t i = 0; i < pages; i++) { + vmm_map_page((uint64_t)phys, (uint64_t)virt, vmm_flags); + phys += 0x1000; + virt += 0x1000; + } + + *out_virt = virt_base + (phys_start - phys_start_aligned); + return 0; +} diff --git a/src/hal/x86/usermode.c b/src/hal/x86/usermode.c new file mode 100644 index 0000000..16219c8 --- /dev/null +++ b/src/hal/x86/usermode.c @@ -0,0 +1,15 @@ +#include "hal/usermode.h" + +#if defined(__i386__) +#include "arch/x86/usermode.h" +#endif + +int hal_usermode_enter(uintptr_t user_eip, uintptr_t user_esp) { +#if defined(__i386__) + x86_enter_usermode(user_eip, user_esp); +#else + (void)user_eip; + (void)user_esp; + return -1; +#endif +} diff --git a/src/kernel/main.c b/src/kernel/main.c index bab7a11..0ee7a41 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -11,7 +11,6 @@ #include "shell.h" #include "heap.h" #include "timer.h" -#include "multiboot2.h" #include "initrd.h" #include "fs.h" #include "elf.h" @@ -19,15 +18,11 @@ #include "kernel/boot_info.h" -#include "gdt.h" - #include "syscall.h" #include "hal/cpu.h" - -#if defined(__i386__) -#include "arch/x86/usermode.h" -#endif +#include "hal/mm.h" +#include "hal/usermode.h" #if defined(__i386__) extern void x86_usermode_test_start(void); @@ -100,26 +95,13 @@ void kernel_main(const struct boot_info* bi) { // 9. Load InitRD (if available) if (bi && bi->initrd_start) { - const uintptr_t initrd_virt_base = 0xE0000000U; - uintptr_t phys_start = (uintptr_t)bi->initrd_start & ~(uintptr_t)0xFFF; - uintptr_t phys_end = (uintptr_t)bi->initrd_end; - if (phys_end < (uintptr_t)bi->initrd_start) { - phys_end = (uintptr_t)bi->initrd_start; - } - phys_end = (phys_end + 0xFFF) & ~(uintptr_t)0xFFF; - - uintptr_t size = phys_end - phys_start; - uintptr_t pages = size >> 12; - uintptr_t virt = initrd_virt_base; - uintptr_t phys = phys_start; - for (uintptr_t i = 0; i < pages; i++) { - vmm_map_page((uint64_t)phys, (uint64_t)virt, VMM_FLAG_PRESENT | VMM_FLAG_RW); - phys += 0x1000; - virt += 0x1000; + uintptr_t initrd_virt = 0; + if (hal_mm_map_physical_range((uintptr_t)bi->initrd_start, (uintptr_t)bi->initrd_end, + HAL_MM_MAP_RW, &initrd_virt) == 0) { + fs_root = initrd_init((uint32_t)initrd_virt); + } else { + uart_print("[INITRD] Failed to map initrd physical range.\n"); } - - uintptr_t initrd_virt = initrd_virt_base + ((uintptr_t)bi->initrd_start - phys_start); - fs_root = initrd_init((uint32_t)initrd_virt); } #if defined(__i386__) @@ -136,7 +118,9 @@ void kernel_main(const struct boot_info* bi) { uart_print("\n"); hal_cpu_set_kernel_stack((uintptr_t)&ring0_trap_stack[sizeof(ring0_trap_stack)]); - x86_enter_usermode(entry, user_sp); + if (hal_usermode_enter(entry, user_sp) < 0) { + uart_print("[USER] usermode enter not supported on this architecture.\n"); + } } }