diff options
Diffstat (limited to 'arch/riscv')
| -rw-r--r-- | arch/riscv/common/vmem.c | 30 | ||||
| -rw-r--r-- | arch/riscv/config.h | 14 | ||||
| -rw-r--r-- | arch/riscv/include/csr.h | 7 | ||||
| -rw-r--r-- | arch/riscv/include/vmem.h | 8 | ||||
| -rw-r--r-- | arch/riscv/init/init.c | 55 | ||||
| -rw-r--r-- | arch/riscv/kernel/main.c | 4 |
6 files changed, 89 insertions, 29 deletions
diff --git a/arch/riscv/common/vmem.c b/arch/riscv/common/vmem.c index ef89ec3..207df34 100644 --- a/arch/riscv/common/vmem.c +++ b/arch/riscv/common/vmem.c @@ -1,7 +1,7 @@ #include <apos/string.h> #include <apos/pmem.h> +#include <apos/vmem.h> #include <pages.h> -#include <vmem.h> #define pte_ppn(pte) (((pm_t)(pte)) >> 10) #define pte_flags(pte) (((pm_t)(pte)) & 0xff) @@ -13,7 +13,7 @@ void map_vmem(struct vm_branch_t *branch, pm_t paddr, vm_t vaddr, uint8_t flags, enum mm_order_t order) { - enum mm_order_t top = MAX_ORDER; + enum mm_order_t top = __mm_max_order; while(top != order){ size_t idx = pm_to_index(vaddr, top); @@ -45,3 +45,29 @@ void unmap_vmem(struct vm_branch_t *branch, branch->leaf[idx] = 0; } + +vm_t map_vregion(struct vm_branch_t *branch, pm_t base, pm_t top, vm_t start, vm_t end) +{ + /* TODO: figure out how to find first suitable memory region */ + + /* find first free page, iterate forward until we either fit the whole + * physical region or hit a used page + * + * continue until we hit end? + */ +} + +void unmap_vregion(struct vm_branch_t *branch, pm_t base, pm_t top) +{ + /* TODO */ +} + +vm_t map_vsize(struct vm_branch_t *branch, size_t size) +{ + /* TODO */ +} + +void unmap_vsize(struct vm_branch_t *branch, size_t size) +{ + /* TODO */ +} diff --git a/arch/riscv/config.h b/arch/riscv/config.h index f223ee7..75c898f 100644 --- a/arch/riscv/config.h +++ b/arch/riscv/config.h @@ -1,12 +1,12 @@ #include <apos/sizes.h> + +/* --- START ARCH USER CONFIG VALUES --- */ +/* physical address to which the kernel will be loaded */ #define PM_KERN 0x83800000 +/* --- END ARCH USER CONFIG VALUES --- */ + +/* don't touch >:( */ + #define PM_STACK_BASE (PM_KERN + SZ_2M) #define PM_STACK_TOP (PM_STACK_BASE + SZ_2M - 2) #define VM_KERN (-SZ_1G) - -#define MAX_ORDER 3 -#define PAGE_SHIFT 12 -#define O0_WIDTH 9 -#define O1_WIDTH 9 -#define O2_WIDTH 9 -#define O3_WIDTH 9 diff --git a/arch/riscv/include/csr.h b/arch/riscv/include/csr.h index 5da0882..ab25bdd 100644 --- a/arch/riscv/include/csr.h +++ b/arch/riscv/include/csr.h @@ -1,8 +1,11 @@ #ifndef APOS_CSR_H #define APOS_CSR_H -#define SATP_MODE_39 0x8000000000000000 -#define SATP_MODE_48 0x9000000000000000 +#include <apos/utils.h> + +#define SATP_MODE_Sv32 0x80000000 +#define SATP_MODE_Sv39 0x8000000000000000 +#define SATP_MODE_Sv48 0x9000000000000000 #define CSR_SATP 0x180 diff --git a/arch/riscv/include/vmem.h b/arch/riscv/include/vmem.h index 0aad780..ec2a3ba 100644 --- a/arch/riscv/include/vmem.h +++ b/arch/riscv/include/vmem.h @@ -1,7 +1,6 @@ #ifndef APOS_RISCV_VMAP_H #define APOS_RISCV_VMAP_H -#include <apos/sizes.h> #include <apos/types.h> #include <apos/attrs.h> @@ -19,11 +18,4 @@ struct __packed vm_branch_t { struct vm_branch_t *leaf[512]; }; -void map_vmem(struct vm_branch_t *branch, - pm_t paddr, vm_t vaddr, - uint8_t flags, enum mm_order_t order); - -void unmap_vmem(struct vm_branch_t *branch, vm_t vaddr, enum mm_order_t order); - - #endif /* APOS_RISCV_VMAP_H */ diff --git a/arch/riscv/init/init.c b/arch/riscv/init/init.c index a64bdf5..48fa661 100644 --- a/arch/riscv/init/init.c +++ b/arch/riscv/init/init.c @@ -6,10 +6,10 @@ #include <apos/string.h> #include <apos/debug.h> #include <apos/pmem.h> +#include <apos/vmem.h> #include <apos/utils.h> #include <libfdt.h> #include <pages.h> -#include <vmem.h> #include <csr.h> struct pm_layout_t { @@ -125,8 +125,38 @@ static void mark_reserved_mem(void *fdt) mark_area_used(base, top); } +static void init_pmem(void *fdt) +{ + enum mm_mode_t mmode = get_mmode(fdt); + + size_t max_order = 0; + size_t order_width = 9; + switch(mmode){ + case Sv32: + max_order = 1; + order_width = 10; + break; + + case Sv39: + max_order = 2; + break; + + case Sv48: + max_order = 3; + break; + }; + + size_t widths[10] = {0}; + for(size_t i = 0; i <= max_order; ++i) + widths[i] = order_width; + + init_mem(max_order, widths, 12); +} + static void setup_pmem(void *fdt) { + init_pmem(fdt); + struct pm_layout_t pmem = get_memlayout(fdt); pm_t initrd_top = get_initrdtop(fdt); @@ -203,13 +233,21 @@ struct vm_branch_t *prepare_vmem() return branch; } -void start_vmem(struct vm_branch_t *branch) +void start_vmem(void *fdt, struct vm_branch_t *branch) { - /* assume Sv48 and ASID 0*/ - /* TODO: get ASID from CPU id - * TODO: more cores lol - */ - csr_write(CSR_SATP, SATP_MODE_48 | (((pm_t)(branch)) >> 12)); + /* TODO: get ASID from CPU id */ + + /* TODO: probably unnecessary optimisations but this could be cached? */ + enum mm_mode_t m = get_mmode(fdt); + + if(m == Sv32) + csr_write(CSR_SATP, SATP_MODE_Sv32 | pm_to_pnum((pm_t)(branch))); + else if (m == Sv39) + csr_write(CSR_SATP, SATP_MODE_Sv39 | pm_to_pnum((pm_t)(branch))); + else + csr_write(CSR_SATP, SATP_MODE_Sv48 | pm_to_pnum((pm_t)(branch))); + + /* Sv57 && Sv64 in the future? */ } struct init_data_t populate_initdata(void *fdt, struct vm_branch_t *branch) @@ -240,10 +278,9 @@ void init(void *fdt) dbg_fdt(fdt); setup_pmem(fdt); - struct vm_branch_t *branch = prepare_vmem(); struct init_data_t d = populate_initdata(fdt, branch); - start_vmem(branch); + start_vmem(fdt, branch); /* update_pmap(TODO: figure out where to place pmap in vmem); */ void (*main)(struct init_data_t) = (void (*)(struct init_data_t))VM_KERN; diff --git a/arch/riscv/kernel/main.c b/arch/riscv/kernel/main.c index 5566d63..c8eca26 100644 --- a/arch/riscv/kernel/main.c +++ b/arch/riscv/kernel/main.c @@ -1,5 +1,6 @@ #include <apos/debug.h> #include <apos/init.h> +#include <apos/vmem.h> void __main main(struct init_data_t d) { @@ -14,6 +15,7 @@ void __main main(struct init_data_t d) /* functionality that should be implemented: * figure out best continuous run of memory (pmap etc) - * arbitrary mapping and kernel mapping (memory) + * arbitrary user and kernel mapping (memory) + * vm to pm */ } |
