Skip to content

Commit

Permalink
create better helper functions
Browse files Browse the repository at this point in the history
  • Loading branch information
axel-h committed Nov 8, 2023
1 parent 7c5e970 commit f82c29b
Showing 1 changed file with 36 additions and 22 deletions.
58 changes: 36 additions & 22 deletions src/arch/arm/32/kernel/vspace.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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)) {
Expand All @@ -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;
}

Expand Down Expand Up @@ -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);

Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit f82c29b

Please sign in to comment.