Mercurial > hg > CbC > CbC_xv6
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 } |