--- /dev/null
+#ifndef HAL_MM_H
+#define HAL_MM_H
+
+#include <stdint.h>
+
+#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
--- /dev/null
+#ifndef HAL_USERMODE_H
+#define HAL_USERMODE_H
+
+#include <stdint.h>
+
+int hal_usermode_enter(uintptr_t user_eip, uintptr_t user_esp);
+
+#endif
--- /dev/null
+#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;
+}
--- /dev/null
+#include "hal/usermode.h"
+
+int hal_usermode_enter(uintptr_t user_eip, uintptr_t user_esp) {
+ (void)user_eip;
+ (void)user_esp;
+ return -1;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#include "hal/usermode.h"
+
+int hal_usermode_enter(uintptr_t user_eip, uintptr_t user_esp) {
+ (void)user_eip;
+ (void)user_esp;
+ return -1;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#include "hal/usermode.h"
+
+int hal_usermode_enter(uintptr_t user_eip, uintptr_t user_esp) {
+ (void)user_eip;
+ (void)user_esp;
+ return -1;
+}
--- /dev/null
+#include "hal/mm.h"
+
+#include "vmm.h"
+
+#include <stddef.h>
+
+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;
+}
--- /dev/null
+#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
+}
#include "shell.h"
#include "heap.h"
#include "timer.h"
-#include "multiboot2.h"
#include "initrd.h"
#include "fs.h"
#include "elf.h"
#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);
// 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__)
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");
+ }
}
}