Module Name: src Committed By: matt Date: Mon Sep 7 22:32:52 UTC 2009
Modified Files: src/sys/arch/mips/mips [matt-nb5-mips64]: mipsX_subr.S Log Message: Make sure KX is set on LP64 kernels. Use VM_MIN_KERNEL_ADDRESS instead of MIPS_KSEG2_START. Deal with VM_MIN_KERNEL_ADDRESS being below KSEG0 in addition to being above it. To generate a diff of this commit: cvs rdiff -u -r1.26.36.1.2.6 -r1.26.36.1.2.7 \ 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.6 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.6 Sat Sep 5 03:25:07 2009 +++ src/sys/arch/mips/mips/mipsX_subr.S Mon Sep 7 22:32:52 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: mipsX_subr.S,v 1.26.36.1.2.6 2009/09/05 03:25:07 matt Exp $ */ +/* $NetBSD: mipsX_subr.S,v 1.26.36.1.2.7 2009/09/07 22:32:52 matt Exp $ */ /* * Copyright 2002 Wasabi Systems, Inc. @@ -134,6 +134,18 @@ #include "assym.h" +#ifdef _LP64 +#define RESET_EXCEPTION_LEVEL_DISABLE_INTERRUPTS(reg) \ + li reg, MIPS_SR_KX; mtc0 reg, MIPS_COP_0_STATUS +#define SET_EXCEPTION_LEVEL(reg) \ + li reg, MIPS_SR_EXL | MIPS_SR_KX; mtc0 reg, MIPS_COP_0_STATUS +#else +#define RESET_EXCEPTION_LEVEL_DISABLE_INTERRUPTS(reg) \ + mtc0 zero, MIPS_COP_0_STATUS +#define SET_EXCEPTION_LEVEL(reg) \ + li reg, MIPS_SR_EXL; mtc0 reg, MIPS_COP_0_STATUS +#endif + /* * XXX MIPS3_5900 is still "special" for much of this code. */ @@ -592,7 +604,7 @@ PTR_ADDU v0, sp, KERNFRAME_SIZ REG_S v0, KERNFRAME_SP(sp) #endif - mtc0 zero, MIPS_COP_0_STATUS # Set kernel no error level + RESET_EXCEPTION_LEVEL_DISABLE_INTERRUPTS(v0) COP0_SYNC nop nop @@ -603,7 +615,7 @@ /* * Restore registers and return from the exception. */ - mtc0 zero, MIPS_COP_0_STATUS # Make sure int disabled + RESET_EXCEPTION_LEVEL_DISABLE_INTERRUPTS(v0) COP0_SYNC nop # 3 nop delay nop @@ -771,13 +783,12 @@ * Restore user registers and return. * First disable interrupts and set exception level. */ - mtc0 zero, MIPS_COP_0_STATUS # disable interrupt + RESET_EXCEPTION_LEVEL_DISABLE_INTERRUPTS(v0) COP0_SYNC nop # 3 clock delay before nop # exceptions blocked nop # for R4X - li v0, MIPS_SR_EXL - mtc0 v0, MIPS_COP_0_STATUS # set exception level + SET_EXCEPTION_LEVEL(v0) # set exception level COP0_SYNC nop # 3 nop delay nop @@ -946,14 +957,13 @@ * Restore user registers and return. * First disable interrupts and set exception level. */ - mtc0 zero, MIPS_COP_0_STATUS # disable int + RESET_EXCEPTION_LEVEL_DISABLE_INTERRUPTS(v0) COP0_SYNC nop # 3 op delay nop nop - li v0, MIPS_SR_EXL - mtc0 v0, MIPS_COP_0_STATUS # set exception level + SET_EXCEPTION_LEVEL(v0) # set exception level COP0_SYNC nop # 3 op delay nop @@ -1122,7 +1132,7 @@ INT_S t0, TF_BASE+TF_PPL(sp) .set noat #endif - mtc0 zero, MIPS_COP_0_STATUS # Reset exl, trap possible. + RESET_EXCEPTION_LEVEL_DISABLE_INTERRUPTS(v0) COP0_SYNC PTR_L MIPS_CURLWP, CPUVAR(CURLWP) # XXX Atheros HAL jal _C_LABEL(cpu_intr) @@ -1130,7 +1140,7 @@ /* * Restore registers and return from the interrupt. */ - mtc0 zero, MIPS_COP_0_STATUS # Disable interrupt + RESET_EXCEPTION_LEVEL_DISABLE_INTERRUPTS(v0) COP0_SYNC nop nop @@ -1284,13 +1294,12 @@ * Restore registers and return from the interrupt. */ nop - mtc0 zero, MIPS_COP_0_STATUS + RESET_EXCEPTION_LEVEL_DISABLE_INTERRUPTS(v0) COP0_SYNC nop # 3 nop hazard nop nop - li v0, MIPS_SR_EXL - mtc0 v0, MIPS_COP_0_STATUS # set exception level bit. + SET_EXCEPTION_LEVEL(v0) # set exception level bit. COP0_SYNC nop # 3 nop hazard nop @@ -1323,7 +1332,11 @@ jal _C_LABEL(spllowersofthigh); nop #else +#ifdef _LP64 + li t0, MIPS_HARD_INT_MASK | MIPS_SR_INT_IE | MIPS_SR_KX +#else li t0, MIPS_HARD_INT_MASK | MIPS_SR_INT_IE +#endif DYNAMIC_STATUS_MASK(t0, t1) # machine dependent masking mtc0 t0, MIPS_COP_0_STATUS # enable interrupts (spl0) COP0_SYNC @@ -1333,13 +1346,12 @@ /* * Restore user registers and return. NOTE: interrupts are enabled. */ - mtc0 zero, MIPS_COP_0_STATUS + RESET_EXCEPTION_LEVEL_DISABLE_INTERRUPTS(v0) COP0_SYNC nop # 3 nop delay nop nop - li v0, MIPS_SR_EXL - mtc0 v0, MIPS_COP_0_STATUS # set exception level bit. + SET_EXCEPTION_LEVEL(v0) # set exception level bit. COP0_SYNC nop # 3 nop delay nop @@ -1665,7 +1677,7 @@ */ LEAF(MIPSX(TLBWriteIndexedVPS)) mfc0 v1, MIPS_COP_0_STATUS # Save the status register. - mtc0 zero, MIPS_COP_0_STATUS # Disable interrupts + RESET_EXCEPTION_LEVEL_DISABLE_INTERRUPTS(v0) COP0_SYNC nop lw a2, 8(a1) # fetch tlb->tlb_lo0 @@ -1979,13 +1991,12 @@ # .set noat 1: - mtc0 zero, MIPS_COP_0_STATUS # disable int + RESET_EXCEPTION_LEVEL_DISABLE_INTERRUPTS(v0) COP0_SYNC nop # 3 op delay nop nop - li a0, MIPS_SR_EXL # set exception level - mtc0 a0, MIPS_COP_0_STATUS + SET_EXCEPTION_LEVEL(v0) # set exception level COP0_SYNC nop nop @@ -2075,9 +2086,14 @@ 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, MIPS_KSEG2_START + li s0, VM_MIN_KERNEL_ADDRESS +#if VM_MIN_KERNEL_ADDRESS > MIPS_KSEG0_START blt v0, s0, resume nop +#else + blt s0, v0, resume + nop +#endif and s0, v0, MIPS3_PG_ODDPG beq s0, zero, entry0