diff src/impl/vm_impl_private.cbc @ 205: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);
+}