From 1c408b7298815e53176d1d6c89c87d5c76351afa Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Mon, 30 Sep 2024 07:48:05 +0000 Subject: [PATCH] arm64: Cleanup VMSAv8TranslationMap::FreeTable Change-Id: Ib2cb0f728e4ca4b69096b21ae336d43c621a71e7 Reviewed-on: https://review.haiku-os.org/c/haiku/+/8421 Haiku-Format: Haiku-format Bot Reviewed-by: waddlesplash --- .../arch/arm64/VMSAv8TranslationMap.cpp | 20 ++++++++----------- .../kernel/arch/arm64/VMSAv8TranslationMap.h | 3 +-- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/system/kernel/arch/arm64/VMSAv8TranslationMap.cpp b/src/system/kernel/arch/arm64/VMSAv8TranslationMap.cpp index f9d04c3224..33d92b4ae9 100644 --- a/src/system/kernel/arch/arm64/VMSAv8TranslationMap.cpp +++ b/src/system/kernel/arch/arm64/VMSAv8TranslationMap.cpp @@ -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 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); diff --git a/src/system/kernel/arch/arm64/VMSAv8TranslationMap.h b/src/system/kernel/arch/arm64/VMSAv8TranslationMap.h index c59c2bed78..851f5fbbca 100644 --- a/src/system/kernel/arch/arm64/VMSAv8TranslationMap.h +++ b/src/system/kernel/arch/arm64/VMSAv8TranslationMap.h @@ -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 - 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 void ProcessRange(phys_addr_t ptPa, int level, addr_t va, size_t size,