diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/main.c | 10 | ||||
| -rw-r--r-- | common/mem.c | 16 | ||||
| -rw-r--r-- | common/pmem.c | 6 |
3 files changed, 27 insertions, 5 deletions
diff --git a/common/main.c b/common/main.c index 5248d2a..9eb6414 100644 --- a/common/main.c +++ b/common/main.c @@ -23,11 +23,17 @@ * Sets up all kernel subsystems and jumps into \c init program, does not * return. * - * @param fdt Global FDT pointer. + * @param fdt Global FDT pointer in physical memory. + * @param ram_base RAM base. * @return Should not. */ -void __main main(void *fdt) +void __main main(void *fdt, uintptr_t ram_base) { + set_ram_base(ram_base); + + /* convert physical address to virtual address */ + fdt = __va(fdt); + /* dbg uses direct mapping at this point */ init_dbg(fdt); setup_dmap_dbg(); 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; +} diff --git a/common/pmem.c b/common/pmem.c index 16e6adf..22a1493 100644 --- a/common/pmem.c +++ b/common/pmem.c @@ -609,8 +609,8 @@ void init_pmem(void *fdt) stat_pmem_conf(fdt, &max_order, &base_bits, bits); init_mem(max_order, bits, base_bits); - pm_t ram_size = __get_ramtop(fdt) - RAM_BASE; - pm_t ram_base = (pm_t)__va(RAM_BASE); + pm_t ram_size = __get_ramtop(fdt) - get_ram_base(); + pm_t ram_base = (pm_t)__va(get_ram_base()); pm_t initrd_top = get_initrdtop(fdt); pm_t fdt_top = __get_fdttop(fdt); @@ -629,7 +629,7 @@ void init_pmem(void *fdt) /* mark init stack, this should be unmapped once we get to executing * processes */ - __mark_area_used((pm_t)__va(PM_STACK_BASE), (pm_t)__va(PM_STACK_TOP)); + __mark_area_used(VM_STACK_BASE, VM_STACK_TOP); /* mark kernel */ /* this could be made more explicit, I suppose. */ |
