From 2bb795551ab6709b1d079dd77659131d8f24f42a Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Thu, 15 Dec 2022 11:49:59 -0500 Subject: [PATCH 31/52] mips: Fix handling of TLB exceptions on odd large pages When loading the lo0 and lo1 TLB values, we were failing to mask the PDE pointer to get the base of the large page. As a result, a TLB miss on the odd side of a large page would cause us to enter the odd large page as lo0, and the next large page of physical memory as lo1. Fix the problem by masking off low bits in the PDE pointer before fetching the PA to load into the TLB. (These macros are getting a little messy and could use some deduplication.) --- sys/mips/mips/exception.S | 42 ++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/sys/mips/mips/exception.S b/sys/mips/mips/exception.S index a7dfe6b0c0c9..f7b1523a05dc 100644 --- a/sys/mips/mips/exception.S +++ b/sys/mips/mips/exception.S @@ -180,7 +180,9 @@ MipsDoTLBMiss: #ifdef MIPS64_NEW_PMAP -#define LOAD_SUPERPAGE_TLB(size, pagemask) \ +#define LOAD_SUPERPAGE_TLB(size, pagemask, pdeshift) \ + PTR_SRL k0, pdeshift + PTRSHIFT ;\ + PTR_SLL k0, pdeshift + PTRSHIFT ;\ PTR_L k1, 0(k0) ;\ CLEAR_PTE_SWBITS(k1) ;\ PTE_MTC0 k1, MIPS_COP_0_TLB_LO0 ;\ @@ -225,15 +227,15 @@ MipsDoTLBMiss: PANIC("unknown page size index") miss_super_2m: - LOAD_SUPERPAGE_TLB(1024 * 1024, TLBMASK_1M_PAGE) + LOAD_SUPERPAGE_TLB(1024 * 1024, TLBMASK_1M_PAGE, 0) miss_super_8m: - LOAD_SUPERPAGE_TLB(4 * 1024 * 1024, TLBMASK_4M_PAGE) + LOAD_SUPERPAGE_TLB(4 * 1024 * 1024, TLBMASK_4M_PAGE, 2) miss_super_32m: - LOAD_SUPERPAGE_TLB(16 * 1024 * 1024, TLBMASK_16M_PAGE) + LOAD_SUPERPAGE_TLB(16 * 1024 * 1024, TLBMASK_16M_PAGE, 4) miss_super_128m: - LOAD_SUPERPAGE_TLB(64 * 1024 * 1024, TLBMASK_64M_PAGE) + LOAD_SUPERPAGE_TLB(64 * 1024 * 1024, TLBMASK_64M_PAGE, 6) miss_super_512m: - LOAD_SUPERPAGE_TLB(256 * 1024 * 1024, TLBMASK_256M_PAGE) + LOAD_SUPERPAGE_TLB(256 * 1024 * 1024, TLBMASK_256M_PAGE, 8) #undef LOAD_SUPERPAGE_TLB not_superpage: @@ -1015,7 +1017,9 @@ LEAF_NOPROFILE(MipsTLBInvalidException) nop #ifdef MIPS64_NEW_PMAP -#define LOAD_SUPERPAGE_TLB(size, pagemask) \ +#define LOAD_SUPERPAGE_TLB(size, pagemask, pdeshift) \ + PTR_SRL k0, pdeshift + PTRSHIFT ;\ + PTR_SLL k0, pdeshift + PTRSHIFT ;\ PTR_L k1, 0(k0) ;\ andi k1, PTE_VR ;\ beqz k1, 3f ;\ @@ -1060,15 +1064,15 @@ LEAF_NOPROFILE(MipsTLBInvalidException) PANIC("unknown page size index") invalid_super_2m: - LOAD_SUPERPAGE_TLB(1024 * 1024, TLBMASK_1M_PAGE) + LOAD_SUPERPAGE_TLB(1024 * 1024, TLBMASK_1M_PAGE, 0) invalid_super_8m: - LOAD_SUPERPAGE_TLB(4 * 1024 * 1024, TLBMASK_4M_PAGE) + LOAD_SUPERPAGE_TLB(4 * 1024 * 1024, TLBMASK_4M_PAGE, 2) invalid_super_32m: - LOAD_SUPERPAGE_TLB(16 * 1024 * 1024, TLBMASK_16M_PAGE) + LOAD_SUPERPAGE_TLB(16 * 1024 * 1024, TLBMASK_16M_PAGE, 4) invalid_super_128m: - LOAD_SUPERPAGE_TLB(64 * 1024 * 1024, TLBMASK_64M_PAGE) + LOAD_SUPERPAGE_TLB(64 * 1024 * 1024, TLBMASK_64M_PAGE, 6) invalid_super_512m: - LOAD_SUPERPAGE_TLB(256 * 1024 * 1024, TLBMASK_256M_PAGE) + LOAD_SUPERPAGE_TLB(256 * 1024 * 1024, TLBMASK_256M_PAGE, 8) #undef LOAD_SUPERPAGE_TLB not_spg: @@ -1255,7 +1259,9 @@ LEAF_NOPROFILE(MipsTLBMissException) #ifdef MIPS64_NEW_PMAP -#define LOAD_SUPERPAGE_TLB(size, pagemask) \ +#define LOAD_SUPERPAGE_TLB(size, pagemask, pdeshift) \ + PTR_SRL k0, pdeshift + PTRSHIFT ;\ + PTR_SLL k0, pdeshift + PTRSHIFT ;\ PTR_L k1, 0(k0) ;\ CLEAR_PTE_SWBITS(k1) ;\ PTE_MTC0 k1, MIPS_COP_0_TLB_LO0 ;\ @@ -1300,15 +1306,15 @@ LEAF_NOPROFILE(MipsTLBMissException) PANIC("unknown page size index") miss_ksuper_2m: - LOAD_SUPERPAGE_TLB(1024 * 1024, TLBMASK_1M_PAGE) + LOAD_SUPERPAGE_TLB(1024 * 1024, TLBMASK_1M_PAGE, 0) miss_ksuper_8m: - LOAD_SUPERPAGE_TLB(4 * 1024 * 1024, TLBMASK_4M_PAGE) + LOAD_SUPERPAGE_TLB(4 * 1024 * 1024, TLBMASK_4M_PAGE, 2) miss_ksuper_32m: - LOAD_SUPERPAGE_TLB(16 * 1024 * 1024, TLBMASK_16M_PAGE) + LOAD_SUPERPAGE_TLB(16 * 1024 * 1024, TLBMASK_16M_PAGE, 4) miss_ksuper_128m: - LOAD_SUPERPAGE_TLB(64 * 1024 * 1024, TLBMASK_64M_PAGE) + LOAD_SUPERPAGE_TLB(64 * 1024 * 1024, TLBMASK_64M_PAGE, 6) miss_ksuper_512m: - LOAD_SUPERPAGE_TLB(256 * 1024 * 1024, TLBMASK_256M_PAGE) + LOAD_SUPERPAGE_TLB(256 * 1024 * 1024, TLBMASK_256M_PAGE, 8) #undef LOAD_SUPERPAGE_TLB not_kspg: -- 2.41.0