comparison 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
comparison
equal deleted inserted replaced
204:f4effd36aefc 205:2ecf1e09e981
129 } 129 }
130 130
131 memset(r, 0, PT_SZ); 131 memset(r, 0, PT_SZ);
132 goto next((char*)r); 132 goto next((char*)r);
133 } 133 }
134
135 __code allocuvm_check_newszvm_impl(struct vm_impl* vm_impl, pde_t* pgdir, uint oldsz, uint newsz, __code next(int ret, ...)){
136 if (newsz >= UADDR_SZ) {
137 goto next(0, ...);
138 }
139
140 if (newsz < oldsz) {
141 ret = newsz;
142 goto next(ret);
143 }
144
145 uint a = align_up(oldsz, PTE_SZ);
146
147 goto allocuvm_loopvm_impl(vm_impl, pgdir, oldsz, newsz, a, next(...));
148 }
149
150 __code allocuvm_loopvm_impl(struct vm_impl* vm_impl, pde_t* pgdir, uint oldsz, uint newsz, uint a, __code next(...)) {
151
152 if (a < newsz) {
153 goto allocuvm_loopvm_impl(vm_impl, pgdir, oldsz, newsz, a + PTE_SZ, next(...));
154 }
155
156 goto next(newsz);
157 }