-void* vmm_alloc_page(void* vpn, pt_attr dattr, pt_attr tattr) {
- void* pp = pmm_alloc_page();
- void* result = vmm_map_page(vpn, pp, dattr, tattr);
- if (!result) {
- pmm_free_page(pp);
+int
+vmm_lookupat(ptr_t mnt, ptr_t va, v_mapping* mapping)
+{
+ u32_t l1_index = L1_INDEX(va);
+ u32_t l2_index = L2_INDEX(va);
+
+ x86_page_table* l1pt = (x86_page_table*)(mnt | 1023 << 12);
+ x86_pte_t l1pte = l1pt->entry[l1_index];
+
+ if (l1pte) {
+ x86_pte_t* l2pte =
+ &((x86_page_table*)(mnt | (l1_index << 12)))->entry[l2_index];
+
+ if (l2pte) {
+ mapping->flags = PG_ENTRY_FLAGS(*l2pte);
+ mapping->pa = PG_ENTRY_ADDR(*l2pte);
+ mapping->pn = mapping->pa >> PG_SIZE_BITS;
+ mapping->pte = l2pte;
+ mapping->va = va;
+ return 1;
+ }