Module Name: src Committed By: matt Date: Fri Dec 2 00:01:38 UTC 2011
Modified Files: src/sys/arch/mips/conf [matt-nb5-mips64]: files.mips src/sys/arch/mips/include [matt-nb5-mips64]: mips3_pte.h mips_param.h vmparam.h src/sys/arch/mips/mips [matt-nb5-mips64]: genassym.cf mipsX_subr.S Log Message: Add support for 8KB pages. To generate a diff of this commit: cvs rdiff -u -r1.58.24.16 -r1.58.24.17 src/sys/arch/mips/conf/files.mips cvs rdiff -u -r1.23.38.6 -r1.23.38.7 src/sys/arch/mips/include/mips3_pte.h cvs rdiff -u -r1.23.78.6 -r1.23.78.7 src/sys/arch/mips/include/mips_param.h cvs rdiff -u -r1.41.28.21 -r1.41.28.22 src/sys/arch/mips/include/vmparam.h cvs rdiff -u -r1.44.12.28 -r1.44.12.29 src/sys/arch/mips/mips/genassym.cf cvs rdiff -u -r1.26.36.1.2.48 -r1.26.36.1.2.49 \ src/sys/arch/mips/mips/mipsX_subr.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/mips/conf/files.mips diff -u src/sys/arch/mips/conf/files.mips:1.58.24.16 src/sys/arch/mips/conf/files.mips:1.58.24.17 --- src/sys/arch/mips/conf/files.mips:1.58.24.16 Tue Nov 29 07:48:31 2011 +++ src/sys/arch/mips/conf/files.mips Fri Dec 2 00:01:37 2011 @@ -3,6 +3,8 @@ defflag opt_cputype.h NOFPU FPEMUL MIPS64_SB1 + ENABLE_MIPS_16KB_PAGE + ENABLE_MIPS_8KB_PAGE ENABLE_MIPS_KSEGX MIPS64_XLP MIPS64_XLR MIPS64_XLS # and the rest... Index: src/sys/arch/mips/include/mips3_pte.h diff -u src/sys/arch/mips/include/mips3_pte.h:1.23.38.6 src/sys/arch/mips/include/mips3_pte.h:1.23.38.7 --- src/sys/arch/mips/include/mips3_pte.h:1.23.38.6 Tue Jan 26 21:19:25 2010 +++ src/sys/arch/mips/include/mips3_pte.h Fri Dec 2 00:01:37 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: mips3_pte.h,v 1.23.38.6 2010/01/26 21:19:25 matt Exp $ */ +/* $NetBSD: mips3_pte.h,v 1.23.38.7 2011/12/02 00:01:37 matt Exp $ */ /* * Copyright (c) 1992, 1993 @@ -106,9 +106,19 @@ unsigned int pg_g:1, /* HW: ignore as #define MIPS3_PG_WIRED 0x80000000 /* SW */ #define MIPS3_PG_RO 0x40000000 /* SW */ +#ifdef ENABLE_MIPS_16KB_PAGE +#define MIPS3_PG_SVPN 0xffffc000 /* Software page no mask */ +#define MIPS3_PG_HVPN 0xffff8000 /* Hardware page no mask */ +#define MIPS3_PG_ODDPG 0x00004000 /* Odd even pte entry */ +#elif defined(ENABLE_MIPS_8KB_PAGE) +#define MIPS3_PG_SVPN 0xffffe000 /* Software page no mask */ +#define MIPS3_PG_HVPN 0xffffe000 /* Hardware page no mask */ +#define MIPS3_PG_NEXT 0x00000040 /* next PFN */ +#elif defined(ENABLE_MIPS_4KB_PAGE) || 1 #define MIPS3_PG_SVPN 0xfffff000 /* Software page no mask */ #define MIPS3_PG_HVPN 0xffffe000 /* Hardware page no mask */ #define MIPS3_PG_ODDPG 0x00001000 /* Odd even pte entry */ +#endif #define MIPS3_PG_ASID 0x000000ff /* Address space ID */ #define MIPS3_PG_G 0x00000001 /* Global; ignore ASID if in lo0 & lo1 */ #define MIPS3_PG_V 0x00000002 /* Valid */ @@ -189,7 +199,10 @@ unsigned int pg_g:1, /* HW: ignore as ((((pg_mask) | 0x00001fff) + 1) / 2) #define MIPS3_PG_SIZE_TO_MASK(pg_size) \ - ((((pg_size) * 2) - 1) & ~0x00001fff) + ((((pg_size) << (((pg_size) & 0x2aaaa) == 0)) - 1) & ~0x00001fff) + +CTASSERT(MIPS3_PG_SIZE_TO_MASK(4096) == MIPS3_PG_SIZE_4K); +CTASSERT(MIPS3_PG_SIZE_TO_MASK(8192) == MIPS3_PG_SIZE_4K); /* NEC Vr41xx uses different pagemask values. */ #define MIPS4100_PG_SIZE_1K 0x00000000 Index: src/sys/arch/mips/include/mips_param.h diff -u src/sys/arch/mips/include/mips_param.h:1.23.78.6 src/sys/arch/mips/include/mips_param.h:1.23.78.7 --- src/sys/arch/mips/include/mips_param.h:1.23.78.6 Mon Aug 16 18:01:13 2010 +++ src/sys/arch/mips/include/mips_param.h Fri Dec 2 00:01:37 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: mips_param.h,v 1.23.78.6 2010/08/16 18:01:13 matt Exp $ */ +/* $NetBSD: mips_param.h,v 1.23.78.7 2011/12/02 00:01:37 matt Exp $ */ #ifdef _KERNEL #include <machine/cpu.h> @@ -39,9 +39,16 @@ #define SSIZE 1 /* initial stack size/NBPG */ #define SINCR 1 /* increment of stack/NBPG */ +#if defined(ENABLE_MIPS_16KB_PAGE) || defined(ENABLE_MIPS_8KB_PAGE) +#define UPAGES 1 /* pages of u-area */ +#define USPACE (UPAGES*NBPG) /* size of u-area in bytes */ +#elif defined(ENABLE_MIPS_4KB_PAGE) || 1 #define UPAGES 2 /* pages of u-area */ #define USPACE (UPAGES*NBPG) /* size of u-area in bytes */ #define USPACE_ALIGN USPACE /* make sure it starts on a even VA */ +#else +#error ENABLE_MIPS_xKB_PAGE not defined +#endif #ifndef MSGBUFSIZE #define MSGBUFSIZE NBPG /* default message buffer size */ @@ -62,9 +69,15 @@ #define ALIGN(p) (((uintptr_t)(p) + ALIGNBYTES) & ~ALIGNBYTES) #define ALIGNED_POINTER(p,t) ((((uintptr_t)(p)) & (sizeof(t)-1)) == 0) -#define NBPG 4096 /* bytes/page */ -#define PGOFSET (NBPG-1) /* byte offset into page */ +#ifdef ENABLE_MIPS_16KB_PAGE +#define PGSHIFT 14 /* LOG2(NBPG) */ +#elif defined(ENABLE_MIPS_8KB_PAGE) +#define PGSHIFT 13 /* LOG2(NBPG) */ +#else #define PGSHIFT 12 /* LOG2(NBPG) */ +#endif +#define NBPG (1 << PGSHIFT) /* bytes/page */ +#define PGOFSET (NBPG-1) /* byte offset into page */ #define NPTEPG (NBPG/4) #define NBSEG (NBPG*NPTEPG) /* bytes/segment */ Index: src/sys/arch/mips/include/vmparam.h diff -u src/sys/arch/mips/include/vmparam.h:1.41.28.21 src/sys/arch/mips/include/vmparam.h:1.41.28.22 --- src/sys/arch/mips/include/vmparam.h:1.41.28.21 Tue Nov 29 07:48:31 2011 +++ src/sys/arch/mips/include/vmparam.h Fri Dec 2 00:01:37 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: vmparam.h,v 1.41.28.21 2011/11/29 07:48:31 matt Exp $ */ +/* $NetBSD: vmparam.h,v 1.41.28.22 2011/12/02 00:01:37 matt Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -42,6 +42,7 @@ #define _MIPS_VMPARAM_H_ #ifdef _KERNEL_OPT +#include "opt_cputype.h" #include "opt_multiprocessor.h" #endif @@ -50,10 +51,18 @@ */ /* - * We use a 4K page on MIPS systems. Override PAGE_* definitions - * to compile-time constants. + * We normally use a 4K page but may use 16K on MIPS systems. + * Override PAGE_* definitions to compile-time constants. */ +#ifdef ENABLE_MIPS_16KB_PAGE +#define PAGE_SHIFT 14 +#elif defined(ENABLE_MIPS_8KB_PAGE) +#define PAGE_SHIFT 13 +#elif defined(ENABLE_MIPS_4KB_PAGE) || 1 #define PAGE_SHIFT 12 +#else +#error ENABLE_MIPS_xKB_PAGE not defined +#endif #define PAGE_SIZE (1 << PAGE_SHIFT) #define PAGE_MASK (PAGE_SIZE - 1) Index: src/sys/arch/mips/mips/genassym.cf diff -u src/sys/arch/mips/mips/genassym.cf:1.44.12.28 src/sys/arch/mips/mips/genassym.cf:1.44.12.29 --- src/sys/arch/mips/mips/genassym.cf:1.44.12.28 Tue Nov 29 07:48:31 2011 +++ src/sys/arch/mips/mips/genassym.cf Fri Dec 2 00:01:37 2011 @@ -132,8 +132,7 @@ define VM_MIN_KERNEL_ADDRESS VM_MIN_KERN define VM_MAX_KERNEL_ADDRESS VM_MAX_KERNEL_ADDRESS ifdef ENABLE_MIPS_KSEGX define VM_KSEGX_ADDRESS VM_KSEGX_ADDRESS -define VM_KSEGX_SHIFT VM_KSEGX_SHIFT -define MIPS3_DEFAULT_PG_SHIFT MIPS3_DEFAULT_PG_SHIFT +define VM_KSEGX_SIZE VM_KSEGX_SIZE endif define SIGFPE SIGFPE @@ -151,7 +150,12 @@ define MIPS3_PG_V MIPS3_PG_V define MIPS3_PG_D MIPS3_PG_D define MIPS3_PG_HVPN MIPS3_PG_HVPN define MIPS3_PG_ASID MIPS3_PG_ASID +ifdef MIPS3_PG_NEXT +define MIPS3_PG_NEXT MIPS3_PG_NEXT +endif +ifdef MIPS3_PG_ODDPG define MIPS3_PG_ODDPG MIPS3_PG_ODDPG +endif define TF_SIZ sizeof(struct trapframe) define TF_REG_ZERO offsetof(struct trapframe, tf_regs[_R_ZERO]) Index: src/sys/arch/mips/mips/mipsX_subr.S diff -u src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.48 src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.49 --- src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.48 Thu Dec 1 03:50:08 2011 +++ src/sys/arch/mips/mips/mipsX_subr.S Fri Dec 2 00:01:37 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: mipsX_subr.S,v 1.26.36.1.2.48 2011/12/01 03:50:08 matt Exp $ */ +/* $NetBSD: mipsX_subr.S,v 1.26.36.1.2.49 2011/12/02 00:01:37 matt Exp $ */ /* * Copyright 2002 Wasabi Systems, Inc. @@ -367,16 +367,35 @@ MIPSX(tlb_miss_common): _MFC0 k0, MIPS_COP_0_BAD_VADDR #0a: k0=bad address (again) #if (MIPS32R2 + MIPS64R2 + MIPS64R2_RMIXL) > 0 beqz k1, MIPSX(nopagetable) #0b: ==0 -- no page table +#if (PGSHIFT & 1) == 0 _EXT k0, k0, PGSHIFT+1, PGSHIFT-3 #0c: k0=VA[13:21] _INS k1, k0, 3, PGSHIFT-3 #0d: k0=page table index #0d: k1=pte address #else + _EXT k0, k0, PGSHIFT, PGSHIFT-2 #0c: k0=VA[13:21] + _INS k1, k0, 2, PGSHIFT-2 #0d: k0=page table index + #0d: k1=pte address +#endif +#else beqz k1, MIPSX(nopagetable) #0b: ==0 -- no page table PTR_SRL k0, (PGSHIFT-2) #0c: k0=VPN (aka va>>10) +#if (PGSHIFT & 1) == 0 andi k0, (NBPG-8) #0d: k0=page table offset +#else + andi k0, (NBPG-4) #0d: k0=page table offset +#endif PTR_ADDU k1, k0 #0e: k1=pte address #endif -#if (MIPS64R2 + MIPS64R2_RMIXL) > 0 +#if PGSHIFT & 1 + INT_L k0, 0(k1) #0f: k0=lo0 pte +#if (MIPS32R2 + MIPS64R2 + MIPS64R2_RMIXL) > 0 + _EXT k0, k0, 0, WIRED_POS #11: chop top 2 bits +#else + _SLL k0, WIRED_SHIFT #11: chop top 2 bits (part 1a) + _SRL k0, WIRED_SHIFT #12: chop top 2 bits (part 1b) +#endif + INT_ADDU k1, k0, MIPS3_PG_NEXT #13: k1=lo1 pte +#elif (MIPS64R2 + MIPS64R2_RMIXL) > 0 REG_L k0, 0(k1) #0f: load PTEs _EXT k1, k0, 32*_QUAD_HIGHWORD, WIRED_POS #10: extract lo1 pte _EXT k0, k0, 32*_QUAD_LOWWORD, WIRED_POS #11: extract lo0 pte @@ -1597,11 +1616,14 @@ LEAF_NOPROFILE(MIPSX(kern_tlb_miss)) nop # - delay slot - #endif PTR_L k1, _C_LABEL(Sysmap) +#if (PGSHIFT & 1) == 0 PTR_SRL k0, 1 PTR_SLL k0, 3 # compute offset from index +#else + PTR_SLL k0, 2 # compute offset from index +#endif PTR_ADDU k1, k0 INT_L k0, 0(k1) # get PTE entry - INT_L k1, 4(k1) # get odd PTE entry #if (MIPS32R2 + MIPS64R2 + MIPS64R2_RMIXL) > 0 _EXT k0, k0, 0, WIRED_POS #else @@ -1609,12 +1631,17 @@ LEAF_NOPROFILE(MIPSX(kern_tlb_miss)) _SRL k0, k0, WIRED_SHIFT #endif _MTC0 k0, MIPS_COP_0_TLB_LO0 # load PTE entry +#if (PGSHIFT & 1) == 0 + INT_L k1, 4(k1) # get odd PTE entry #if (MIPS32R2 + MIPS64R2 + MIPS64R2_RMIXL) > 0 _EXT k1, k1, 0, WIRED_POS #else _SLL k1, k1, WIRED_SHIFT _SRL k1, k1, WIRED_SHIFT #endif +#else + INT_ADDU k1, k0, MIPS3_PG_NEXT # point to next page +#endif /* PGSHIFT & 1) == 0 */ _MTC0 k1, MIPS_COP_0_TLB_LO1 # load PTE entry COP0_SYNC tlbwr # write random TLB @@ -1695,12 +1722,14 @@ LEAF_NOPROFILE(MIPSX(tlb_invalid_excepti bltz k0, TLB_INVALID_EXCEPTION_EXIT # ASSERT(TLB entry exists) nop # - delay slot - +#if (PGSHIFT & 1) == 0 and k0, k1, 4 # check even/odd page #ifdef MIPS3 nop # required for QED 5230 #endif bnez k0, MIPSX(kern_tlbi_odd) nop +#endif /* (PGSHIFT & 1) == 0 */ INT_L k0, 0(k1) # get PTE entry #if (MIPS32R2 + MIPS64R2 + MIPS64R2_RMIXL) > 0 @@ -1710,6 +1739,10 @@ LEAF_NOPROFILE(MIPSX(tlb_invalid_excepti _SRL k0, k0, WIRED_SHIFT #endif _MTC0 k0, MIPS_COP_0_TLB_LO0 # load PTE entry +#if (PGSHIFT & 1) != 0 + INT_ADDU k0, MIPS3_PG_NEXT + _MTC0 k0, MIPS_COP_0_TLB_LO1 # load PTE entry +#endif COP0_SYNC and k0, k0, MIPS3_PG_V # check for valid entry #ifdef MIPS3 @@ -1718,6 +1751,7 @@ LEAF_NOPROFILE(MIPSX(tlb_invalid_excepti beqz k0, TLB_INVALID_EXCEPTION_EXIT # PTE invalid nop # - delay slot - +#if (PGSHIFT & 1) == 0 INT_L k0, 4(k1) # get odd PTE entry mfc0 k1, MIPS_COP_0_TLB_INDEX #if (MIPS32R2 + MIPS64R2 + MIPS64R2_RMIXL) > 0 @@ -1730,6 +1764,7 @@ LEAF_NOPROFILE(MIPSX(tlb_invalid_excepti or k1, k1, k0 _MTC0 k0, MIPS_COP_0_TLB_LO1 # load PTE entry COP0_SYNC +#endif /* (PGSHIFT & 1) == 0 */ tlbwi # write TLB COP0_SYNC #ifdef MIPS3 @@ -1742,6 +1777,7 @@ LEAF_NOPROFILE(MIPSX(tlb_invalid_excepti #endif eret +#if (PGSHIFT & 1) == 0 MIPSX(kern_tlbi_odd): INT_L k0, 0(k1) # get PTE entry #if (MIPS32R2 + MIPS64R2 + MIPS64R2_RMIXL) > 0 @@ -1782,6 +1818,7 @@ MIPSX(kern_tlbi_odd): INT_S zero, 0(k1) # clear lock #endif eret +#endif /* (PGSHIFT & 1) == 0 */ #if defined(MULTIPROCESSOR) && (MIPS64_RMIXL + MIPS64R2_RMIXL) > 0 /* @@ -1845,7 +1882,9 @@ LEAF(MIPSX(tlb_update_addr)) mfc0 v1, MIPS_COP_0_STATUS # Save the status register. mtc0 zero, MIPS_COP_0_STATUS # Disable interrupts COP0_SYNC +#if (PGSHIFT & 1) == 0 and t1, a0, MIPS3_PG_ODDPG # t1 = Even/Odd flag +#endif li v0, (MIPS3_PG_HVPN | MIPS3_PG_ASID) and a0, a0, v0 _MFC0 t0, MIPS_COP_0_TLB_HI # Save current PID @@ -1861,10 +1900,12 @@ LEAF(MIPSX(tlb_update_addr)) _SRL a1, a1, WIRED_SHIFT #endif mfc0 v0, MIPS_COP_0_TLB_INDEX # See what we got +#if (PGSHIFT & 1) == 0 bnez t1, 1f # Decide even odd nop +#endif # EVEN - bltz v0, 1f # index < 0 => !found + bltz v0, 4f # index < 0 => !found nop #ifdef MIPS3 nop # required for QED5230 @@ -1872,9 +1913,14 @@ LEAF(MIPSX(tlb_update_addr)) tlbr # update, read entry first COP0_SYNC _MTC0 a1, MIPS_COP_0_TLB_LO0 # init low reg0. +#if (PGSHIFT & 1) != 0 + INT_ADDU a1, MIPS3_PG_NEXT # point to next page + _MTC0 a1, MIPS_COP_0_TLB_LO1 # init low reg1. +#endif COP0_SYNC tlbwi # update slot found COP0_SYNC +#if (PGSHIFT & 1) == 0 b 4f nop 1: @@ -1890,6 +1936,7 @@ LEAF(MIPSX(tlb_update_addr)) COP0_SYNC tlbwi # update slot found COP0_SYNC +#endif /* (PGSHIFT & 1) == 0 */ 4: #ifdef MIPS3 nop # Make sure pipeline @@ -1972,7 +2019,7 @@ LEAF_NOPROFILE(MIPSX(tlb_invalidate_addr mfc0 v0, MIPS_COP_0_TLB_INDEX # see what we got bltz v0, 1f # index < 0 then skip li t1, MIPS_KSEG0_START # invalid address - PTR_SLL v0, PGSHIFT + 1 # PAGE_SHIFT + 1 + PTR_SLL v0, (PGSHIFT | 1) # PAGE_SHIFT | 1 PTR_ADDU t1, v0 _MTC0 t1, MIPS_COP_0_TLB_HI # make entryHi invalid _MTC0 zero, MIPS_COP_0_TLB_LO0 # zero out entryLo0 @@ -2014,7 +2061,7 @@ LEAF_NOPROFILE(MIPSX(tlb_invalidate_asid 1: mtc0 t1, MIPS_COP_0_TLB_INDEX # set index COP0_SYNC - sll ta0, t1, PGSHIFT + 1 # PAGE_SHIFT + 1 + sll ta0, t1, PGSHIFT | 1 # PAGE_SHIFT | 1 tlbr # obtain an entry COP0_SYNC _MFC0 a0, MIPS_COP_0_TLB_LO1 @@ -2071,7 +2118,7 @@ LEAF_NOPROFILE(MIPSX(tlb_invalidate_glob 1: mtc0 t1, MIPS_COP_0_TLB_INDEX # set index COP0_SYNC - sll ta0, t1, PGSHIFT + 1 # PAGE_SHIFT + 1 + sll ta0, t1, PGSHIFT | 1 # PAGE_SHIFT | 1 tlbr # obtain an entry COP0_SYNC _MFC0 a0, MIPS_COP_0_TLB_LO1 @@ -2124,7 +2171,7 @@ LEAF_NOPROFILE(MIPSX(tlb_invalidate_all) 1: mtc0 t1, MIPS_COP_0_TLB_INDEX # set TLBindex COP0_SYNC - sll ta0, t1, PGSHIFT + 1 # PAGE_SHIFT + 1 + sll ta0, t1, PGSHIFT | 1 # PAGE_SHIFT | 1 PTR_ADDU ta0, v0 _MTC0 ta0, MIPS_COP_0_TLB_HI # make entryHi invalid COP0_SYNC @@ -2222,13 +2269,17 @@ LEAF(MIPSX(tlb_enter)) .set noat _MFC0 ta0, MIPS_COP_0_TLB_HI # save EntryHi +#if (PGSHIFT & 1) == 0 and a3, a1, MIPS3_PG_ODDPG # select odd page bit xor a3, a1 # clear it. +#endif _MTC0 a3, MIPS_COP_0_TLB_HI # set the VA for tlbp COP0_SYNC +#if (PGSHIFT & 1) == 0 and t2, a2, MIPS3_PG_G # make prototype tlb_lo0 and t3, a2, MIPS3_PG_G # make prototype tlb_lo1 +#endif tlbp # is va in TLB? COP0_SYNC @@ -2237,11 +2288,13 @@ LEAF(MIPSX(tlb_enter)) bltz v0, 1f # nope nop +#if (PGSHIFT & 1) == 0 /* * Get the existing tlb_lo's because we need to replace one of them. */ mfc0 t2, MIPS_COP_0_TLB_LO0 # save for update mfc0 t3, MIPS_COP_0_TLB_LO1 # save for update +#endif /* * If it's already where we want, no reason to invalidate it. @@ -2250,9 +2303,9 @@ LEAF(MIPSX(tlb_enter)) nop /* - * Make an + * Clear the existing TLB entry for it. */ - sll t1, 1 + PGSHIFT # make a fake addr for the entry + sll t1, v0, (1 | PGSHIFT) # make a fake addr for the entry lui v1, %hi(MIPS_KSEG0_START) or t1, v1 _MTC0 t1, MIPS_COP_0_TLB_HI @@ -2273,6 +2326,7 @@ LEAF(MIPSX(tlb_enter)) COP0_SYNC 2: +#if (PGSHIFT & 1) == 0 and v1, a1, MIPS3_PG_ODDPG # odd or even page sll v1, 31 - PGSHIFT # move to MSB sra v1, 31 # v1 a mask (0/~0 = even/odd) @@ -2287,6 +2341,11 @@ LEAF(MIPSX(tlb_enter)) mtc0 t2, MIPS_COP_0_TLB_LO0 # set tlb_lo0 (even) mtc0 t3, MIPS_COP_0_TLB_LO1 # set tlb_lo1 (odd) +#else + mtc0 a2, MIPS_COP_0_TLB_LO0 # set tlb_lo1 (lower half) + INT_ADDU a2, MIPS3_PG_NEXT + mtc0 a2, MIPS_COP_0_TLB_LO1 # set tlb_lo1 (upper half) +#endif COP0_SYNC tlbwi # enter it into the TLB @@ -2404,9 +2463,13 @@ END(MIPSX(setfunc_trampoline)) * sure TBIS(it) in the case. */ LEAF_NOPROFILE(MIPSX(cpu_switch_resume)) -#if PAGE_SIZE < USPACE +#if PAGE_SIZE < USPACE || 1 INT_L a1, L_MD_UPTE_0(a0) # a1 = upte[0] +#if (PGSHIFT & 1) == 0 INT_L a2, L_MD_UPTE_1(a0) # a2 = upte[1] +#else + INT_ADDU a2, a1, MIPS3_PG_NEXT # a2 = page following upte[0] +#endif PTR_L v0, L_PCB(a0) # va = l->l_addr #if VM_MIN_KERNEL_ADDRESS == MIPS_KSEG2_START li t0, VM_MIN_KERNEL_ADDRESS # compute index @@ -2442,11 +2505,13 @@ LEAF_NOPROFILE(MIPSX(cpu_switch_resume)) nop #endif +#if (PGSHIFT & 1) == 0 and t0, v0, MIPS3_PG_ODDPG beqz t0, MIPSX(entry0) nop PANIC("USPACE sat on odd page boundary") +#endif MIPSX(entry0): _MFC0 t3, MIPS_COP_0_TLB_HI # save TLB_HI @@ -2459,7 +2524,7 @@ MIPSX(entry0): nop #endif bltz t0, MIPSX(entry0set) - sll t0, t0, PGSHIFT + 1 # PAGE_SHIFT + 1 + sll t0, t0, (PGSHIFT | 1) # (PAGE_SHIFT | 1) PTR_LA t0, MIPS_KSEG0_START(t0) _MTC0 t0, MIPS_COP_0_TLB_HI _MTC0 zero, MIPS_COP_0_TLB_LO0