Module Name: src Committed By: matt Date: Tue Sep 8 00:51:14 UTC 2009
Modified Files: src/sys/arch/mips/mips [matt-nb5-mips64]: mipsX_subr.S Log Message: Teach cpu_switch_resume to deal with upages in XKSEG/KSEG0/XKSEG. (don't use s0, use t0) To generate a diff of this commit: cvs rdiff -u -r1.26.36.1.2.7 -r1.26.36.1.2.8 \ 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/mips/mipsX_subr.S diff -u src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.7 src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.8 --- src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.7 Mon Sep 7 22:32:52 2009 +++ src/sys/arch/mips/mips/mipsX_subr.S Tue Sep 8 00:51:14 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: mipsX_subr.S,v 1.26.36.1.2.7 2009/09/07 22:32:52 matt Exp $ */ +/* $NetBSD: mipsX_subr.S,v 1.26.36.1.2.8 2009/09/08 00:51:14 matt Exp $ */ /* * Copyright 2002 Wasabi Systems, Inc. @@ -357,7 +357,7 @@ eret #1b: return from exception 4: j _C_LABEL(MIPSX(TLBMissException)) #1c: kernel exception nop #1d: branch delay slot -5: j slowfault #1e: no page table present +5: j MIPSX(slowfault) #1e: no page table present nop #1f: branch delay slot .set at _VECTOR_END(MIPSX(TLBMiss)) @@ -410,7 +410,7 @@ eret #1b: return from exception 4: j _C_LABEL(MIPSX(TLBMissException)) #1c: kernel exception nop #1d: branch delay slot -5: j slowfault #1e: no page table present +5: j MIPSX(slowfault) #1e: no page table present nop #1f: branch delay slot .set at _VECTOR_END(MIPSX(XTLBMiss)) @@ -484,7 +484,7 @@ /*---------------------------------------------------------------------------- * - * slowfault -- + * MIPSX(slowfault) -- * * Alternate entry point into the mips3_UserGenException or * mips3_KernGenException, when the ULTB miss handler couldn't @@ -499,7 +499,7 @@ * We couldn't find a TLB entry. * Find out what mode we came from and call the appropriate handler. */ -slowfault: +MIPSX(slowfault): .set noat mfc0 k0, MIPS_COP_0_STATUS nop @@ -1456,7 +1456,12 @@ LEAF_NOPROFILE(MIPSX(TLBInvalidException)) .set noat _MFC0 k0, MIPS_COP_0_BAD_VADDR # get the fault address +#if VM_MIN_KERNEL_ADDRESS == MIPS_KSEG2_START li k1, VM_MIN_KERNEL_ADDRESS # compute index +#else + li k1, VM_MIN_KERNEL_ADDRESS>>32 # compute index + dsll32 k1, k1, 0 +#endif bgez k0, _C_LABEL(MIPSX(KernGenException)) # full trap processing PTR_SUBU k0, k0, k1 INT_L k1, _C_LABEL(Sysmapsize) # index within range? @@ -1558,7 +1563,12 @@ LEAF_NOPROFILE(MIPSX(TLBMissException)) .set noat _MFC0 k0, MIPS_COP_0_BAD_VADDR # get the fault address +#if VM_MIN_KERNEL_ADDRESS == MIPS_KSEG2_START li k1, VM_MIN_KERNEL_ADDRESS # compute index +#else + li k1, VM_MIN_KERNEL_ADDRESS>>32 # compute index + dsll32 k1, k1, 0 +#endif PTR_SUBU k0, k0, k1 INT_L k1, _C_LABEL(Sysmapsize) # index within range? PTR_SRL k0, k0, PGSHIFT @@ -1607,7 +1617,12 @@ PTR_SLL k0, k0, PGSHIFT _MTC0 a0, MIPS_COP_0_EXC_PC # return to panic COP0_SYNC - li k1, VM_MIN_KERNEL_ADDRESS +#if VM_MIN_KERNEL_ADDRESS == MIPS_KSEG2_START + li k1, VM_MIN_KERNEL_ADDRESS # compute index +#else + li k1, VM_MIN_KERNEL_ADDRESS>>32 # compute index + dsll32 k1, k1, 0 +#endif PTR_ADDU a3, k0, k1 #if defined(DDB) bltz sp, 1f # for ddb try to keep frame @@ -2086,18 +2101,23 @@ INT_L a1, L_MD_UPTE_0(a0) # a1 = upte[0] INT_L a2, L_MD_UPTE_1(a0) # a2 = upte[1] PTR_L v0, L_ADDR(a0) # va = l->l_addr - li s0, VM_MIN_KERNEL_ADDRESS -#if VM_MIN_KERNEL_ADDRESS > MIPS_KSEG0_START - blt v0, s0, resume - nop +#if VM_MIN_KERNEL_ADDRESS == MIPS_KSEG2_START + li t0, VM_MIN_KERNEL_ADDRESS # compute index + blt v0, t0, resume + nop #else - blt s0, v0, resume - nop + li t0, MIPS_KSEG0_START # above XKSEG? + blt t0, v0, resume + nop + li t0, VM_MIN_KERNEL_ADDRESS>>32 # below XKSEG? + dsll32 t0, t0, 0 + blt v0, t0, resume + nop #endif - and s0, v0, MIPS3_PG_ODDPG - beq s0, zero, entry0 - nop + and t0, v0, MIPS3_PG_ODDPG + beq t0, zero, entry0 + nop PANIC("USPACE sat on odd page boundary") @@ -2110,12 +2130,12 @@ COP0_SYNC nop nop - mfc0 s0, MIPS_COP_0_TLB_INDEX + mfc0 t0, MIPS_COP_0_TLB_INDEX nop - bltz s0, entry0set - sll s0, s0, PGSHIFT + 1 # PAGE_SHIFT + 1 - PTR_LA s0, MIPS_KSEG0_START(s0) - _MTC0 s0, MIPS_COP_0_TLB_HI + bltz t0, entry0set + sll t0, t0, PGSHIFT + 1 # PAGE_SHIFT + 1 + PTR_LA t0, MIPS_KSEG0_START(s0) + _MTC0 t0, MIPS_COP_0_TLB_HI COP0_SYNC _MTC0 zero, MIPS_COP_0_TLB_LO0 COP0_SYNC