diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-10-11 23:18:47 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-10-11 23:18:47 +0300 |
| commit | 7237d673904d8568a2f9c290a0247c9d1a07c5d2 (patch) | |
| tree | 7deabe2dc64ddf05016eb3e3a4f22a7e252b5c35 /common/mem.c | |
| parent | ebd34a9ab3809167e16e4107c8e72d1d81faff9c (diff) | |
| download | kmi-7237d673904d8568a2f9c290a0247c9d1a07c5d2.tar.gz kmi-7237d673904d8568a2f9c290a0247c9d1a07c5d2.zip | |
Start designing vmem framework
Diffstat (limited to 'common/mem.c')
| -rw-r--r-- | common/mem.c | 77 |
1 files changed, 42 insertions, 35 deletions
diff --git a/common/mem.c b/common/mem.c index 420f6f4..445748c 100644 --- a/common/mem.c +++ b/common/mem.c @@ -1,40 +1,47 @@ #include <apos/types.h> #include <apos/mem.h> +#include <libfdt.h> -const size_t mm_shifts[10] = { - MM_O0_SHIFT, - MM_O1_SHIFT, - MM_O2_SHIFT, - MM_O3_SHIFT, - MM_O4_SHIFT, - MM_O6_SHIFT, - MM_O7_SHIFT, - MM_O8_SHIFT, - MM_O9_SHIFT, -}; +size_t __mm_shifts[10]; +size_t __mm_widths[10]; +size_t __mm_sizes[10]; +size_t __mm_page_shift; +size_t __mm_max_order; -const size_t mm_widths[10] = { - MM_O0_WIDTH, - MM_O1_WIDTH, - MM_O2_WIDTH, - MM_O3_WIDTH, - MM_O4_WIDTH, - MM_O5_WIDTH, - MM_O6_WIDTH, - MM_O7_WIDTH, - MM_O8_WIDTH, - MM_O9_WIDTH, -}; +void init_mem(size_t max_order, size_t widths[10], size_t page_shift) +{ + __mm_max_order = max_order; + __mm_page_shift = page_shift; -const size_t mm_sizes[10] = { - MM_O0_SIZE, - MM_O1_SIZE, - MM_O2_SIZE, - MM_O3_SIZE, - MM_O4_SIZE, - MM_O5_SIZE, - MM_O6_SIZE, - MM_O7_SIZE, - MM_O8_SIZE, - MM_O9_SIZE, -}; + __mm_shifts[0] = 0; + __mm_widths[0] = 1 << widths[0]; + __mm_sizes[0] = 1 << __mm_page_shift; + + for(size_t i = 0; i <= __mm_max_order; ++i){ + __mm_widths[i] = 1 << widths[i]; + __mm_shifts[i] = __mm_shifts[i - 1] + __mm_widths[i - 1]; + __mm_sizes[i] = 1 << __mm_shifts[i] << __mm_page_shift; + } +} + +enum mm_mode_t get_mmode(void *fdt) +{ + int mmu_offset = fdt_path_offset(fdt, "/cpus/cpu"); + const char *mmu = fdt_getprop(fdt, mmu_offset, "mmu-type", NULL); + + if(strncmp("riscv,sv48", mmu, 10) == 0) + return Sv48; + + if(strncmp("riscv,sv39", mmu, 10) == 0) + return Sv39; + + if(strncmp("riscv,sv32", mmu, 10) == 0) + return Sv32; + + /* fdt is missing mmu-type for some reason, but we can probably use + * these values as fallback */ + if(__riscv_xlen == 32) + return Sv32; + else + return Sv39; +} |
