From 29eb629a1d157fcfc561c3de504104fecbe10977 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Fri, 27 Jan 2023 14:17:59 -0500 Subject: [PATCH 38/52] mips: Fix tlb_update()'s handling of superpages The calculation of "size" and "mask" was bogus for anything other than 4KB pages. Just hard-code a lookup table of pagemasks that we expect to find and use that to derive correct "size" and "mask" values. --- sys/mips/mips/tlb.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/sys/mips/mips/tlb.c b/sys/mips/mips/tlb.c index 7bad48a162c6..f0df25fddc79 100644 --- a/sys/mips/mips/tlb.c +++ b/sys/mips/mips/tlb.c @@ -315,9 +315,29 @@ tlb_update(struct pmap *pmap, vm_offset_t va, pt_entry_t pte) /* Compute the page mask and size. */ pagemask = TLBLO_PTE_TO_MASK(pte); - mask = (unsigned long)pagemask | PAGE_MASK; /* OR it with lower 12 bits */ - size = mask + 1; - + switch (pagemask) { + case TLBMASK_4K_PAGE: + size = PAGE_SIZE; + break; + case TLBMASK_1M_PAGE: + size = 1024 * 1024ul; + break; + case TLBMASK_4M_PAGE: + size = 4 * 1024 * 1024ul; + break; + case TLBMASK_16M_PAGE: + size = 16 * 1024 * 1024ul; + break; + case TLBMASK_64M_PAGE: + size = 64 * 1024 * 1024ul; + break; + case TLBMASK_256M_PAGE: + size = 256 * 1024 * 1024ul; + break; + default: + panic("unknown pagemask %#x", pagemask); + } + mask = size - 1; va &= ~mask; pte &= ~TLBLO_SWBITS_MASK; -- 2.41.0