arm64: Cleanup VMSAv8TranslationMap::FreeTable

Change-Id: Ib2cb0f728e4ca4b69096b21ae336d43c621a71e7
Reviewed-on: https://review.haiku-os.org/c/haiku/+/8421
Haiku-Format: Haiku-format Bot <[email protected]>
Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
Owen Anderson
2024-09-30 15:48:51 +00:00
committed by waddlesplash
parent df59dfec3b
commit 1c408b7298
2 changed files with 9 additions and 14 deletions
@@ -141,7 +141,7 @@ VMSAv8TranslationMap::~VMSAv8TranslationMap()
ASSERT(fRefcount == 0);
{
ThreadCPUPinner pinner(thread_get_current_thread());
FreeTable(fPageTable, 0, fInitialLevel, [](int level, uint64_t oldPte) {});
FreeTable(fPageTable, 0, fInitialLevel);
}
{
@@ -277,12 +277,11 @@ VMSAv8TranslationMap::TableFromPa(phys_addr_t pa)
}
template<typename EntryRemoved>
void
VMSAv8TranslationMap::FreeTable(phys_addr_t ptPa, uint64_t va, int level,
EntryRemoved &&entryRemoved)
VMSAv8TranslationMap::FreeTable(phys_addr_t ptPa, uint64_t va, int level)
{
ASSERT(level < 4);
InterruptsSpinLocker locker(sAsidLock);
int tableBits = fPageBits - 3;
uint64_t tableSize = 1UL << tableBits;
@@ -297,21 +296,18 @@ VMSAv8TranslationMap::FreeTable(phys_addr_t ptPa, uint64_t va, int level,
uint64_t oldPte = (uint64_t) atomic_get_and_set64((int64*) &pt[i], 0);
if (level < 3 && (oldPte & kPteTypeMask) == kPteTypeL012Table) {
FreeTable(oldPte & kPteAddrMask, nextVa, level + 1, entryRemoved);
FreeTable(oldPte & kPteAddrMask, nextVa, level + 1);
} else if ((oldPte & kPteTypeMask) != 0) {
uint64_t fullVa = (fIsKernel ? ~vaMask : 0) | nextVa;
asm("dsb ishst");
asm("tlbi vaae1is, %0" :: "r" ((fullVa >> 12) & kTLBIMask));
// Does it correctly flush block entries at level < 3? We don't use them anyway though.
// TODO: Flush only currently used ASID (using vae1is)
entryRemoved(level, oldPte);
// Use this rather than FlushVAIfAccessed so that we don't have to
// acquire sAsidLock for every entry.
flush_va_if_accessed(oldPte, nextVa, fASID);
}
nextVa += entrySize;
}
asm("dsb ish");
vm_page* page = vm_lookup_page(ptPa >> fPageBits);
DEBUG_PAGE_ACCESS_START(page);
vm_page_set_state(page, PAGE_STATE_FREE);
@@ -115,8 +115,7 @@ private:
static uint8_t MairIndex(uint8_t type);
bool ValidateVa(addr_t va);
uint64_t* TableFromPa(phys_addr_t pa);
template<typename EntryRemoved>
void FreeTable(phys_addr_t ptPa, uint64_t va, int level, EntryRemoved &&entryRemoved);
void FreeTable(phys_addr_t ptPa, uint64_t va, int level);
phys_addr_t GetOrMakeTable(phys_addr_t ptPa, int level, int index, vm_page_reservation* reservation);
template<typename UpdatePte>
void ProcessRange(phys_addr_t ptPa, int level, addr_t va, size_t size,