- if (!__vmm_map_internal(l1_index, l2_index, (uintptr_t)pa, tattr, true)) {
- return NULL;
- }
-
- cpu_invplg(va);
-
- return (void*)V_ADDR(l1_index, l2_index, PG_OFFSET(va));
-}
-
-void*
-vmm_alloc_page(void* vpn, pt_attr tattr)
-{
- void* pp = pmm_alloc_page();
- void* result = vmm_map_page(vpn, pp, tattr);
- if (!result) {
- pmm_free_page(pp);
- }
- return result;
-}
-
-int
-vmm_alloc_pages(void* va, size_t sz, pt_attr tattr)
-{
- assert((uintptr_t)va % PG_SIZE == 0) assert(sz % PG_SIZE == 0);
-
- void* va_ = va;
- for (size_t i = 0; i < (sz >> PG_SIZE_BITS); i++, va_ += PG_SIZE) {
- void* pp = pmm_alloc_page();
- uint32_t l1_index = L1_INDEX(va_);
- uint32_t l2_index = L2_INDEX(va_);
- if (!pp || !__vmm_map_internal(
- l1_index, l2_index, (uintptr_t)pp, tattr, false)) {
- // if one failed, release previous allocated pages.
- va_ = va;
- for (size_t j = 0; j < i; j++, va_ += PG_SIZE) {
- vmm_unmap_page(va_);
- }
-
- return false;
- }