static x86pte_t get_pte(hat_t *hat, htable_t *htable, uintptr_t addr) { x86pte_t buf; if (htable->ht_flags & HTABLE_COPIED) { uintptr_t ptr = (uintptr_t)hat->hat_copied_ptes; ptr += va2entry(htable, addr) << mmu.pte_size_shift; return (*(x86pte_t *)ptr); } paddr_t paddr = mmu_ptob((paddr_t)htable->ht_pfn); paddr += va2entry(htable, addr) << mmu.pte_size_shift; if ((mdb_pread(&buf, mmu.pte_size, paddr)) == mmu.pte_size) return (buf); return (0); }
static x86pte_t get_pte(hat_t *hat, htable_t *htable, uintptr_t addr) { x86pte_t buf; x86pte32_t *pte32 = (x86pte32_t *)&buf; size_t len; if (htable->ht_flags & HTABLE_VLP) { uintptr_t ptr = (uintptr_t)hat->hat_vlp_ptes; ptr += va2entry(htable, addr) << mmu.pte_size_shift; len = mdb_vread(&buf, mmu.pte_size, ptr); } else { paddr_t paddr = mmu_ptob((paddr_t)htable->ht_pfn); paddr += va2entry(htable, addr) << mmu.pte_size_shift; len = mdb_pread(&buf, mmu.pte_size, paddr); } if (len != mmu.pte_size) return (0); if (mmu.pte_size == sizeof (x86pte_t)) return (buf); return (*pte32); }