summaryrefslogtreecommitdiff
path: root/src/kernel/mm/pmm.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/mm/pmm.cc')
-rw-r--r--src/kernel/mm/pmm.cc14
1 files changed, 13 insertions, 1 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;