summaryrefslogtreecommitdiff
path: root/src/kernel/mm
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-04-14 22:47:15 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-04-14 22:47:15 +0800
commitac9741e12222e72bad3414bc6f588e70a3d130cc (patch)
tree6aace9f63a2ea54c7c3fd1e49e98ff81b638296f /src/kernel/mm
parent1e862099a13266da57ff7c6de11c1a11c42a8112 (diff)
downloadlume-ac9741e12222e72bad3414bc6f588e70a3d130cc.tar.gz
lume-ac9741e12222e72bad3414bc6f588e70a3d130cc.tar.xz
feat: implement FDT-based memory discovery and add comprehensive debug logging to exec syscalls
Diffstat (limited to 'src/kernel/mm')
-rw-r--r--src/kernel/mm/pmm.cc14
-rw-r--r--src/kernel/mm/vm.cc13
2 files changed, 23 insertions, 4 deletions
diff --git a/src/kernel/mm/pmm.cc b/src/kernel/mm/pmm.cc
index 2d0c44f..d3d99ba 100644
--- a/src/kernel/mm/pmm.cc
+++ b/src/kernel/mm/pmm.cc
@@ -6,6 +6,7 @@
#include "kernel/riscv.h"
#include "kernel/pmm.h"
#include "kernel/mm.h"
+#include "kernel/fdt.h"
// #include "kernel/spinlock.h"
#include "drivers/uart.h"
#include "lib/string.h"
@@ -13,6 +14,9 @@
extern "C" char kernel_end[];
extern uint64 g_dtb_addr;
+// Default memory size 128MB, will be overwritten by FDT
+uint64 g_phys_size = 128 * 1024 * 1024;
+
namespace PMM
{
// Global metadata array pointer
@@ -74,12 +78,20 @@ namespace PMM
void init()
{
+ // Use FDT memory size if available
+ if (g_devices.mem_size > 0)
+ {
+ g_phys_size = g_devices.mem_size;
+ }
+
pmm_lock.init("pmm");
uint64 kern_end_pa = PGROUNDUP((uint64)kernel_end);
total_pages = (PHYSTOP - KERNBASE) / PGSIZE;
- Drivers::uart_puts(ANSI_GREEN "[PMM] Total RAM size: 128MB\n" ANSI_RESET);
+ Drivers::uart_puts(ANSI_GREEN "[PMM] Total RAM size: ");
+ Drivers::uart_put_int(g_phys_size / (1024 * 1024));
+ Drivers::uart_puts(" MB\n" ANSI_RESET);
// Place the mem_map array
// mem_map is located immediately after kernel_end
mem_map = (struct Page*)kern_end_pa;
diff --git a/src/kernel/mm/vm.cc b/src/kernel/mm/vm.cc
index 47b80e9..be2f2f2 100644
--- a/src/kernel/mm/vm.cc
+++ b/src/kernel/mm/vm.cc
@@ -8,6 +8,7 @@
#include "common/types.h"
#include "lib/string.h"
#include "drivers/uart.h"
+#include "kernel/fdt.h"
extern "C"
{
@@ -421,9 +422,15 @@ namespace VM
{
kernel_pagetable = uvmcreate();
- kvmmap(0x10000000, 0x10000000, 0x10000, PTE_R | PTE_W);
- kvmmap(0x0c000000, 0x0c000000, 0x400000, PTE_R | PTE_W);
- kvmmap(0x02000000, 0x02000000, 0x10000, PTE_R | PTE_W); // CLINT
+ // 1. Map all device MMIO regions discovered by FDT
+ for (int i = 0; i < g_devices.mmio_count; i++)
+ {
+ uint64 base = g_devices.mmio_regions[i].base;
+ uint64 size = g_devices.mmio_regions[i].size;
+ kvmmap(base, base, size, PTE_R | PTE_W);
+ }
+
+ // 2. Map Kernel Memory (PHYSTOP is now dynamic based on FDT)
kvmmap(KERNBASE, KERNBASE, PHYSTOP - KERNBASE, PTE_R | PTE_W | PTE_X);
}