From f82c29b88bcaf1fd57b5b771f4dc7c09ab92da03 Mon Sep 17 00:00:00 2001 From: Axel Heider Date: Wed, 8 Nov 2023 22:28:41 +0100 Subject: [PATCH] create better helper functions --- src/arch/arm/32/kernel/vspace.c | 58 ++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/src/arch/arm/32/kernel/vspace.c b/src/arch/arm/32/kernel/vspace.c index 4f57027c0fb..cc22b421527 100644 --- a/src/arch/arm/32/kernel/vspace.c +++ b/src/arch/arm/32/kernel/vspace.c @@ -38,10 +38,23 @@ #define SECTIONS_PER_SUPER_SECTION BIT(ARMSuperSectionBits - ARMSectionBits) #define PAGES_PER_LARGE_PAGE BIT(ARMLargePageBits - ARMSmallPageBits) -/* helper stuff to avoid fencepost errors when - * getting the last byte of a PTE or PDE */ -#define LAST_BYTE_PTE(PTE,LENGTH) ((word_t)&(PTE)[(LENGTH)-1] + (BIT(PTE_SIZE_BITS)-1)) -#define LAST_BYTE_PDE(PDE,LENGTH) ((word_t)&(PDE)[(LENGTH)-1] + (BIT(PDE_SIZE_BITS)-1)) +static void clean_cache_pte_range(pte_range_t pte_range) +{ + pte_t *last = pte_range.base[pte_range.length - 1]; + + cleanCacheRange_PoU((uintptr_t)pte_range.base, + (uintptr_t)last + (sizeof(*last) - 1), + addrFromPPtr(pte_range.base)); +} + +static void clean_cache_pde_range(pde_range_t pde_range) +{ + pde_t *last = pde_range.base[pde_range.length - 1]; + + cleanCacheRange_PoU((uintptr_t)pde_range.base, + (uintptr_t)last + (sizeof(*last) - 1), + addrFromPPtr(pde_range.base)); +} #ifdef CONFIG_ARM_HYPERVISOR_SUPPORT /* Stage 2 */ @@ -1361,7 +1374,6 @@ void unmapPage(vm_page_size_t page_size, asid_t asid, vptr_t vptr, void *pptr) case ARMLargePage: { lookupPTSlot_ret_t lu_ret; - word_t i; lu_ret = lookupPTSlot(find_ret.pd, vptr); if (unlikely(lu_ret.status != EXCEPTION_NONE)) { @@ -1386,13 +1398,14 @@ void unmapPage(vm_page_size_t page_size, asid_t asid, vptr_t vptr, void *pptr) } #endif - for (i = 0; i < PAGES_PER_LARGE_PAGE; i++) { - lu_ret.ptSlot[i] = pte_pte_invalid_new(); + pte_range_t pte_range = { + .base = lu_ret.ptSlot, + .length = PAGES_PER_LARGE_PAGE } - cleanCacheRange_PoU((word_t)&lu_ret.ptSlot[0], - LAST_BYTE_PTE(lu_ret.ptSlot, PAGES_PER_LARGE_PAGE), - addrFromPPtr(&lu_ret.ptSlot[0])); - + for (int i = 0; i < pte_range.length; i++) { + pte_range.base[i] = pte_pte_invalid_new(); + } + clean_cache_pte_range(pte_range); break; } @@ -1423,7 +1436,6 @@ void unmapPage(vm_page_size_t page_size, asid_t asid, vptr_t vptr, void *pptr) case ARMSuperSection: { pde_t *pd; - word_t i; pd = lookupPDSlot(find_ret.pd, vptr); @@ -1441,11 +1453,16 @@ void unmapPage(vm_page_size_t page_size, asid_t asid, vptr_t vptr, void *pptr) return; } - for (i = 0; i < SECTIONS_PER_SUPER_SECTION; i++) { - pd[i] = pde_pde_invalid_new(0, 0); + pde_range_t pde_range = { + .base = pd, + .length = SECTIONS_PER_SUPER_SECTION } - cleanCacheRange_PoU((word_t)&pd[0], LAST_BYTE_PDE(pd, SECTIONS_PER_SUPER_SECTION), - addrFromPPtr(&pd[0])); + + for (int i = 0; i < pde_range.length; i++) { + pde_range.base[i] = pde_pde_invalid_new(0, 0); + } + + clean_cache_pde_range(pde_range); break; } @@ -1868,9 +1885,7 @@ static exception_t performPageInvocationMapPTE(asid_t asid, cap_t cap, cte_t *ct #endif pte_entries.base[i] = pte; } - cleanCacheRange_PoU((word_t)pte_entries.base, - LAST_BYTE_PTE(pte_entries.base, pte_entries.length), - addrFromPPtr(pte_entries.base)); + clean_cache_pte_range(pte_entries); if (unlikely(tlbflush_required)) { invalidateTLBByASID(asid); } @@ -1902,9 +1917,8 @@ static exception_t performPageInvocationMapPDE(asid_t asid, cap_t cap, cte_t *ct #endif pde_entries.base[i] = pde; } - cleanCacheRange_PoU((word_t)pde_entries.base, - LAST_BYTE_PDE(pde_entries.base, pde_entries.length), - addrFromPPtr(pde_entries.base)); + clean_cache_pde_range(pde_entries); + if (unlikely(tlbflush_required)) { invalidateTLBByASID(asid); }