aboutsummaryrefslogtreecommitdiff
path: root/src/mem.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2024-07-05 19:38:11 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2024-07-05 19:38:11 +0300
commite09edb5d54e39bd9509a1dc450df5ab320759f97 (patch)
tree78e050b0db87df3a3ddfbb6570d44513ac34e02a /src/mem.c
parent98f21e694a6b0964d6d08196cb6bfbc1c2ae2ff4 (diff)
downloadkmi-e09edb5d54e39bd9509a1dc450df5ab320759f97.tar.gz
kmi-e09edb5d54e39bd9509a1dc450df5ab320759f97.zip
allow booting with Qemu's -kernel flag directly
+ Took some fairly significant changes, for one the kernel is no longer relocated at the start of a boot, instead it sits wherever the user decides the kernel should sit. Similarly, the initial kernel stack and page table are stored within the binary, slightly bloating the size but making it much safer to boot since there's really no chance of us overwriting the fdt or initrd in memory.
Diffstat (limited to 'src/mem.c')
-rw-r--r--src/mem.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/mem.c b/src/mem.c
index e3f98e7..68d323f 100644
--- a/src/mem.c
+++ b/src/mem.c
@@ -22,6 +22,7 @@ enum mm_order __mm_max_order;
* like __mm_*.
*/
pm_t ram_base;
+size_t ram_size;
enum mm_order nearest_order(size_t size)
{
@@ -32,12 +33,17 @@ enum mm_order nearest_order(size_t size)
return MM_O0;
}
-void init_mem(size_t max_order, size_t bits[10], size_t page_shift)
+void init_mem(void *fdt)
{
+ size_t max_order = 0;
+ size_t base_bits = 0;
+ size_t bits[NUM_ORDERS] = { 0 };
+ stat_pmem_conf(fdt, &max_order, &base_bits, bits);
+
__mm_max_order = max_order;
- __mm_page_shift = page_shift;
+ __mm_page_shift = base_bits;
- __mm_shifts[0] = page_shift;
+ __mm_shifts[0] = __mm_page_shift;
__mm_widths[0] = 1 << bits[0];
__mm_sizes[0] = 1 << __mm_page_shift;
@@ -53,7 +59,17 @@ void set_ram_base(uintptr_t base)
ram_base = base;
}
+void set_ram_size(size_t size)
+{
+ ram_size = size;
+}
+
uintptr_t get_ram_base()
{
return ram_base;
}
+
+size_t get_ram_size()
+{
+ return ram_size;
+}