diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-10-19 15:56:26 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-10-19 15:56:26 +0300 |
| commit | 59a374b0eed4313d1a67e2cdb673a295e79a6494 (patch) | |
| tree | a83157ac108c315f93536d4a3d8150b729bdcb1a /arch | |
| parent | 7237d673904d8568a2f9c290a0247c9d1a07c5d2 (diff) | |
| download | kmi-59a374b0eed4313d1a67e2cdb673a295e79a6494.tar.gz kmi-59a374b0eed4313d1a67e2cdb673a295e79a6494.zip | |
Initial virtual memory mapping functions
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/riscv/common/vmem.c | 43 | ||||
| -rw-r--r-- | arch/riscv/include/vmem.h | 6 |
2 files changed, 14 insertions, 35 deletions
diff --git a/arch/riscv/common/vmem.c b/arch/riscv/common/vmem.c index 207df34..7b2d66b 100644 --- a/arch/riscv/common/vmem.c +++ b/arch/riscv/common/vmem.c @@ -10,16 +10,16 @@ /* probably not actually this simple, right? */ void map_vmem(struct vm_branch_t *branch, - pm_t paddr, vm_t vaddr, - uint8_t flags, enum mm_order_t order) + pm_t paddr, vm_t vaddr, uint8_t flags, enum mm_order_t order) { enum mm_order_t top = __mm_max_order; - while(top != order){ + while (top != order) { size_t idx = pm_to_index(vaddr, top); - if(!branch->leaf[idx]){ + if (!branch->leaf[idx]) { pm_t new_leaf = alloc_page(MM_KPAGE, 0); - branch->leaf[idx] = (struct vm_branch_t *)to_pte(new_leaf, VM_V); + branch->leaf[idx] = + (struct vm_branch_t *)to_pte(new_leaf, VM_V); memset((void *)new_leaf, 0, sizeof(struct vm_branch_t)); } @@ -31,43 +31,16 @@ void map_vmem(struct vm_branch_t *branch, branch->leaf[idx] = (struct vm_branch_t *)to_pte(paddr, flags); } -void unmap_vmem(struct vm_branch_t *branch, - vm_t vaddr, enum mm_order_t order) +void unmap_vmem(struct vm_branch_t *branch, vm_t vaddr, enum mm_order_t order) { - while(order){ + while (order) { size_t idx = pm_to_index(vaddr, order); branch = (struct vm_branch_t *)pte_addr(branch->leaf[idx]); } size_t idx = pm_to_index(vaddr, order); - if(branch->leaf[idx]) + if (branch->leaf[idx]) free_page(order, pte_addr(branch->leaf[idx])); 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/include/vmem.h b/arch/riscv/include/vmem.h index ec2a3ba..d17aaf1 100644 --- a/arch/riscv/include/vmem.h +++ b/arch/riscv/include/vmem.h @@ -13,6 +13,12 @@ #define VM_A (1 << 6) #define VM_D (1 << 7) +enum mm_mode_t { + Sv48, + Sv39, + Sv32, +}; + typedef size_t vm_t; struct __packed vm_branch_t { struct vm_branch_t *leaf[512]; |
