# HG changeset patch # User tobaru # Date 1579767122 -32400 # Node ID 247aa9ee931cb76f588b36ffe0b8040fa40b6a50 # Parent 3cac4139b31d52528e0784ad16785ecd7e5813a7 loaduvm_loopvm_impl diff -r 3cac4139b31d -r 247aa9ee931c src/impl/vm_impl.h --- a/src/impl/vm_impl.h Thu Jan 23 15:43:36 2020 +0900 +++ b/src/impl/vm_impl.h Thu Jan 23 17:12:02 2020 +0900 @@ -7,6 +7,7 @@ char* addr; struct inode* ip; uint offset; + uint pa; __code loaduvm_ptesize_check(Type* vm_impl, __code next(...)); __code loaduvm_loop(Type* vm_impl, uint i, pte_t* pte, uint sz, __code next(...)); diff -r 3cac4139b31d -r 247aa9ee931c src/impl/vm_impl_private.cbc --- a/src/impl/vm_impl_private.cbc Thu Jan 23 15:43:36 2020 +0900 +++ b/src/impl/vm_impl_private.cbc Thu Jan 23 17:12:02 2020 +0900 @@ -1,12 +1,71 @@ #include "../../context.h" +#include "mmu.h" +#include "memlayout.h" #interface "vm_impl.h" -__code loaduvm_ptesize_checkvm_impl(struct vm_impl* vm_impl) { - - - goto vm_impl->next(); +/* +vm_impl* createvm_impl2(); +*/ + +__code loaduvm_ptesize_checkvm_impl(struct vm_impl* vm_impl, __code next(...)) { + + if ((uint) vm_impl->addr %PTE_SZ != 0) { + // goto panic + } + + goto loaduvm_loopvm_impl(vm_impl, next(...)); } -__code loaduvm_loopvm_impl(struct vm_impl* vm_impl) { - goto vm_impl->next(); +__code loaduvm_loopvm_impl(struct vm_impl* vm_impl, __code next(...)) { + + if (vm_impl->i < vm_impl->sz) { + goto loaduvm_check_pgdir(vm_impl, next(...)); + } + goto loaduvm_exit(vm_impl, next(...)); } +static pte_t* walkpgdir (pde_t *pgdir, const void *va, int alloc) +{ + pde_t *pde; + pte_t *pgtab; + + // pgdir points to the page directory, get the page direcotry entry (pde) + pde = &pgdir[PDE_IDX(va)]; + + if (*pde & PE_TYPES) { + pgtab = (pte_t*) p2v(PT_ADDR(*pde)); + + } else { + if (!alloc || (pgtab = (pte_t*) kpt_alloc()) == 0) { + return 0; + } + + // Make sure all those PTE_P bits are zero. + memset(pgtab, 0, PT_SZ); + + // The permissions here are overly generous, but they can + // be further restricted by the permissions in the page table + // entries, if necessary. + *pde = v2p(pgtab) | UPDE_TYPE; + } + + return &pgtab[PTE_IDX(va)]; +} + + +__code loaduvm_check_pgdir(struct vm_impl* vm_impl, __code next(...)) { + if ((vm_impl->pte = walkpgdir(vm_impl->pgdir, vm_impl->addr + vm_impl->i, 0)) == 0) { + // goto panic + } + vm_impl->pa = PTE_ADDR(*vm_impl->pte); + + goto loaduvm_check_PTE_SZ(vm_impl, next(...)); +} + +__code loaduvm_check_PTE_SZ(struct vm_impl* vm_impl, __code next(...)) { + goto loaduvm_exit(vm_impl, next(...)); +} + +__code loaduvm_exit(struct vm_impl* vm_impl, __code next(...)) { + + goto next(...); +}