Mercurial > hg > Members > menikon > CbC_xv6
diff src/impl/vm_impl_private.cbc @ 214:2ecf1e09e981
allocuvm_loop and return
author | tobaru |
---|---|
date | Fri, 24 Jan 2020 14:45:38 +0900 |
parents | f4effd36aefc |
children | 291d4e9304a1 |
line wrap: on
line diff
--- a/src/impl/vm_impl_private.cbc Thu Jan 23 21:24:30 2020 +0900 +++ b/src/impl/vm_impl_private.cbc Fri Jan 24 14:45:38 2020 +0900 @@ -131,3 +131,27 @@ memset(r, 0, PT_SZ); goto next((char*)r); } + +__code allocuvm_check_newszvm_impl(struct vm_impl* vm_impl, pde_t* pgdir, uint oldsz, uint newsz, __code next(int ret, ...)){ + if (newsz >= UADDR_SZ) { + goto next(0, ...); + } + + if (newsz < oldsz) { + ret = newsz; + goto next(ret); + } + + uint a = align_up(oldsz, PTE_SZ); + + goto allocuvm_loopvm_impl(vm_impl, pgdir, oldsz, newsz, a, next(...)); +} + +__code allocuvm_loopvm_impl(struct vm_impl* vm_impl, pde_t* pgdir, uint oldsz, uint newsz, uint a, __code next(...)) { + + if (a < newsz) { + goto allocuvm_loopvm_impl(vm_impl, pgdir, oldsz, newsz, a + PTE_SZ, next(...)); + } + + goto next(newsz); +}