MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / find_vaddr

Function find_vaddr

libcpu/mips/gs264/mmu.c:259–320  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

257}
258
259static size_t find_vaddr(rt_mmu_info *mmu_info, int pages)
260{
261 size_t l1_off, l2_off;
262 size_t *mmu_l1, *mmu_l2;
263 size_t find_off = 0;
264 size_t find_va = 0;
265 int n = 0;
266
267 if (!pages)
268 {
269 return 0;
270 }
271
272 if (!mmu_info)
273 {
274 return 0;
275 }
276
277 for (l1_off = mmu_info->vstart; l1_off <= mmu_info->vend; l1_off++)
278 {
279 mmu_l1 = (size_t*)mmu_info->vtable + l1_off;
280 if (*mmu_l1 & ARCH_MMU_USED_MASK)
281 {
282 mmu_l2 = (size_t *)((*mmu_l1 & ~ARCH_PAGE_TBL_MASK) - mmu_info->pv_off);
283 for (l2_off = 0; l2_off < (ARCH_SECTION_SIZE/ARCH_PAGE_SIZE); l2_off++)
284 {
285 if (*(mmu_l2 + l2_off) & ARCH_MMU_USED_MASK)
286 {
287 /* in use */
288 n = 0;
289 }
290 else
291 {
292 if (!n)
293 {
294 find_va = l1_off;
295 find_off = l2_off;
296 }
297 n++;
298 if (n >= pages)
299 {
300 return (find_va << ARCH_SECTION_SHIFT) + (find_off << ARCH_PAGE_SHIFT);
301 }
302 }
303 }
304 }
305 else
306 {
307 if (!n)
308 {
309 find_va = l1_off;
310 find_off = 0;
311 }
312 n += (ARCH_SECTION_SIZE/ARCH_PAGE_SIZE);
313 if (n >= pages)
314 {
315 return (find_va << ARCH_SECTION_SHIFT) + (find_off << ARCH_PAGE_SHIFT);
316 }

Callers 2

_rt_hw_mmu_mapFunction · 0.85
_rt_hw_mmu_map_autoFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected