From 27ffa747f36aee9c1d5bbc61395a078238366070 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Thu, 11 May 2023 22:55:31 +0300 Subject: arbitrary load address and RAM base detection + Both kind of go hand in hand, made sense to do both at the same time. Some parts feel slightly hacky, the loader works by placing everything on the stack and avoiding global values. Still, seems to work? --- common/mem.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'common/mem.c') diff --git a/common/mem.c b/common/mem.c index 69ba4d6..e3f98e7 100644 --- a/common/mem.c +++ b/common/mem.c @@ -17,6 +17,12 @@ size_t __mm_sizes[10]; size_t __mm_page_shift; enum mm_order __mm_max_order; +/** + * RAM base address. Not sure if it should be provided through a macro + * like __mm_*. + */ +pm_t ram_base; + enum mm_order nearest_order(size_t size) { for (enum mm_order order = max_order(); order >= MM_MIN; --order) @@ -41,3 +47,13 @@ void init_mem(size_t max_order, size_t bits[10], size_t page_shift) __mm_sizes[i] = 1UL << __mm_shifts[i]; } } + +void set_ram_base(uintptr_t base) +{ + ram_base = base; +} + +uintptr_t get_ram_base() +{ + return ram_base; +} -- cgit v1.3