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

Reply via email to