Module Name: src
Committed By: matt
Date: Tue Aug 16 06:55:12 UTC 2011
Modified Files:
src/sys/arch/mips/mips: bds_emul.S copy.S fp.S locore.S locore_mips3.S
mipsX_subr.S
Log Message:
Only jump through t9/ra (or k0) to help avoid hitting
the Loongson2 jump problem.
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/mips/mips/bds_emul.S
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/mips/mips/copy.S
cvs rdiff -u -r1.43 -r1.44 src/sys/arch/mips/mips/fp.S
cvs rdiff -u -r1.187 -r1.188 src/sys/arch/mips/mips/locore.S
cvs rdiff -u -r1.101 -r1.102 src/sys/arch/mips/mips/locore_mips3.S
cvs rdiff -u -r1.52 -r1.53 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/bds_emul.S
diff -u src/sys/arch/mips/mips/bds_emul.S:1.4 src/sys/arch/mips/mips/bds_emul.S:1.5
--- src/sys/arch/mips/mips/bds_emul.S:1.4 Sat Feb 26 11:27:59 2011
+++ src/sys/arch/mips/mips/bds_emul.S Tue Aug 16 06:55:11 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: bds_emul.S,v 1.4 2011/02/26 11:27:59 tsutsui Exp $ */
+/* $NetBSD: bds_emul.S,v 1.5 2011/08/16 06:55:11 matt Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -66,8 +66,8 @@
srl t0, a0, 26-PTR_SCALESHIFT
andi t0, 0x3F << PTR_SCALESHIFT
- PTR_L t0, bcemul_optbl(t0)
- j t0
+ PTR_L t9, bcemul_optbl(t0)
+ jr t9
.rdata
bcemul_optbl:
@@ -173,7 +173,7 @@
REG_PROLOGUE
REG_L v0, TF_REG_ZERO(t1) # load source
REG_EPILOGUE
- j ra # execute the instruction
+ jr ra # execute the instruction
bcemul_uimmed_prologue:
srl t1, a0, 21-REG_SCALESHIFT # rs (source)
@@ -186,7 +186,7 @@
REG_PROLOGUE
REG_L v0, TF_REG_ZERO(t1) # load source
REG_EPILOGUE
- j ra
+ jr ra
#ifndef __mips_o32
bcemul_daddi:
@@ -441,11 +441,12 @@
andi t0, a0, 0x3f # get special code
sll t1, t0, 3 # calculate index in specialop
sll t0, PTR_SCALESHIFT
- PTR_LA t9, bcemul_special_op(t1)
- PTR_L t0, bcemul_specialtbl(t0)
- j t0
+ PTR_LA t0, bcemul_special_op(t1)
+ PTR_L t9, bcemul_specialtbl(t0)
+ jr t9
bcemul_special_3op_prologue:
+ move t9, t0
srl t0, a0, 21-REG_SCALESHIFT # rs (source1)
srl t1, a0, 16-REG_SCALESHIFT # rt (source2)
srl t2, a0, 11-REG_SCALESHIFT # rd (dest)
@@ -459,9 +460,10 @@
REG_L v0, TF_REG_ZERO(t0) # load source1
REG_L v1, TF_REG_ZERO(t1) # load source2
REG_EPILOGUE
- j t9
+ jr t9
bcemul_special_2src_prologue:
+ move t9, t0
srl t0, a0, 21-REG_SCALESHIFT # rs (source1)
srl t1, a0, 16-REG_SCALESHIFT # rt (source2)
andi t0, REG_REGMASK
@@ -472,9 +474,10 @@
REG_L v0, TF_REG_ZERO(t0) # load source1
REG_L v1, TF_REG_ZERO(t1) # load source2
REG_EPILOGUE
- j t9
+ jr t9
bcemul_special_genshift:
+ move t9, t0
srl t1, a0, 16-REG_SCALESHIFT # rt (source)
srl t2, a0, 11-REG_SCALESHIFT # rd (dest)
srl v1, a0, 6 # sa
@@ -606,7 +609,7 @@
REG_L ra, CALLFRAME_RA(sp)
REG_L s0, CALLFRAME_S0(sp)
PTR_ADDU sp, CALLFRAME_SIZ
- j ra
+ jr ra
/*
* Send SIGILL, SIGFPE.
Index: src/sys/arch/mips/mips/copy.S
diff -u src/sys/arch/mips/mips/copy.S:1.14 src/sys/arch/mips/mips/copy.S:1.15
--- src/sys/arch/mips/mips/copy.S:1.14 Wed Jul 6 09:27:35 2011
+++ src/sys/arch/mips/mips/copy.S Tue Aug 16 06:55:11 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: copy.S,v 1.14 2011/07/06 09:27:35 matt Exp $ */
+/* $NetBSD: copy.S,v 1.15 2011/08/16 06:55:11 matt Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -499,9 +499,9 @@
PTR_S v0, PCB_ONFAULT(v1)
INT_S a1, 0(a0) # store word
PTR_S zero, PCB_ONFAULT(v1)
- PTR_L v1, _C_LABEL(mips_cache_ops) + MIPSX_FLUSHICACHE
+ PTR_L t9, _C_LABEL(mips_cache_ops) + MIPSX_FLUSHICACHE
move v0, zero
- j v1 # NOTE: must not clobber v0!
+ j t9 # NOTE: must not clobber v0!
li a1, 4 # size of word
END(ustore_uint32_isync)
Index: src/sys/arch/mips/mips/fp.S
diff -u src/sys/arch/mips/mips/fp.S:1.43 src/sys/arch/mips/mips/fp.S:1.44
--- src/sys/arch/mips/mips/fp.S:1.43 Sat Feb 26 15:41:32 2011
+++ src/sys/arch/mips/mips/fp.S Tue Aug 16 06:55:11 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: fp.S,v 1.43 2011/02/26 15:41:32 tsutsui Exp $ */
+/* $NetBSD: fp.S,v 1.44 2011/08/16 06:55:11 matt Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -151,29 +151,29 @@
single_op:
andi v0, a0, 0x3F # get FUNC field
sll v0, v0, PTR_SCALESHIFT
- PTR_L v0, func_single_tbl(v0)
- j v0
+ PTR_L t9, func_single_tbl(v0)
+ j t9
double_op:
andi v0, a0, 0x3F # get FUNC field
sll v0, v0, PTR_SCALESHIFT
- PTR_L v0, func_double_tbl(v0)
- j v0
+ PTR_L t9, func_double_tbl(v0)
+ j t9
single_fixed_op:
andi v0, a0, 0x3F # get FUNC field
sll v0, v0, PTR_SCALESHIFT
- PTR_L v0, func_single_fixed_tbl(v0)
- j v0
+ PTR_L t9, func_single_fixed_tbl(v0)
+ j t9
long_fixed_op:
andi v0, a0, 0x3F # get FUNC field
sll v0, v0, PTR_SCALESHIFT
- PTR_L v0, func_long_fixed_tbl(v0)
- j v0
+ PTR_L t9, func_long_fixed_tbl(v0)
+ j t9
#if (defined(__mips_n32) || defined(__mips_n64)) && 0
paired_single_op:
andi v0, a0, 0x3F # get FUNC field
sll v0, v0, PTR_SCALESHIFT
- PTR_L v0, func_paired_single_tbl(v0)
- j v0
+ PTR_L t9, func_paired_single_tbl(v0)
+ j t9
#else
#define paired_single_op ill
#endif
@@ -766,8 +766,8 @@
branchc1:
srl v0, a0, 16 - PTR_SCALESHIFT
andi v0, v0, 0x1f << PTR_SCALESHIFT
- PTR_L v0, branchc1_tbl(v0)
- j v0
+ PTR_L t9, branchc1_tbl(v0)
+ j t9
.rdata
branchc1_tbl:
Index: src/sys/arch/mips/mips/locore.S
diff -u src/sys/arch/mips/mips/locore.S:1.187 src/sys/arch/mips/mips/locore.S:1.188
--- src/sys/arch/mips/mips/locore.S:1.187 Wed Apr 6 13:30:33 2011
+++ src/sys/arch/mips/mips/locore.S Tue Aug 16 06:55:12 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.187 2011/04/06 13:30:33 tsutsui Exp $ */
+/* $NetBSD: locore.S,v 1.188 2011/08/16 06:55:12 matt Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -332,7 +332,7 @@
#if IPL_SCHED != IPL_HIGH
j _C_LABEL(splhigh_noprof)
#else
- j ra
+ jr ra
#endif
PTR_ADDU sp, CALLFRAME_SIZ
@@ -412,7 +412,7 @@
/*
* Almost everything (all except sp) is restored so we can return.
*/
- j ra
+ jr ra
PTR_ADDU sp, CALLFRAME_SIZ
END(softint_fast_dispatch)
#endif /* __HAVE_FAST_SOFTINTS */
@@ -435,7 +435,7 @@
li v0, 0 # load success
1:
PTR_S zero, PCB_ONFAULT(t0) # reset fault handler
- j ra # and return.
+ jr ra # and return.
nop
END(lwp_oncpu)
@@ -468,7 +468,7 @@
REG_S ra, PCB_CONTEXT+SF_REG_RA(a0)
REG_S v0, PCB_CONTEXT+SF_REG_SR(a0)
REG_EPILOGUE
- j ra
+ jr ra
move v0, zero
END(savectx)
@@ -497,7 +497,7 @@
REG_S ra, SF_REG_RA(a0)
REG_S v0, SF_REG_SR(a0)
REG_EPILOGUE
- j ra
+ jr ra
move v0, zero
END(setjmp)
@@ -523,7 +523,7 @@
REG_EPILOGUE
mtc0 v0, MIPS_COP_0_STATUS
COP0_SYNC
- j ra
+ jr ra
li v0, 1
END(longjmp)
#endif
@@ -538,7 +538,7 @@
*/
LEAF_NOPROFILE(mips_cp0_cause_read)
mfc0 v0, MIPS_COP_0_CAUSE
- j ra
+ jr ra
nop
END(mips_cp0_cause_read)
@@ -560,7 +560,7 @@
*/
LEAF(mips_cp0_status_read)
mfc0 v0, MIPS_COP_0_STATUS
- j ra
+ jr ra
nop
END(mips_cp0_status_read)
@@ -731,7 +731,7 @@
bgtz a2, 1b
PTR_ADDU a0, 8*SZREG
.set pop
- j ra
+ jr ra
nop
END(mips_pagecopy)
@@ -755,7 +755,7 @@
bgtz a1,1b
PTR_ADDU a0, 8*SZREG
.set pop
- j ra
+ jr ra
nop
END(mips_pagezero)
@@ -813,7 +813,7 @@
REG_L ra, XCALLFRAME_RA(sp)
PTR_ADDU sp, XCALLFRAME_SIZ
- j ra
+ jr ra
nop
#undef XCALLFRAME_RA
#undef XCALLFRAME_SIZ
Index: src/sys/arch/mips/mips/locore_mips3.S
diff -u src/sys/arch/mips/mips/locore_mips3.S:1.101 src/sys/arch/mips/mips/locore_mips3.S:1.102
--- src/sys/arch/mips/mips/locore_mips3.S:1.101 Sun Jul 31 15:39:29 2011
+++ src/sys/arch/mips/mips/locore_mips3.S Tue Aug 16 06:55:11 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: locore_mips3.S,v 1.101 2011/07/31 15:39:29 matt Exp $ */
+/* $NetBSD: locore_mips3.S,v 1.102 2011/08/16 06:55:11 matt Exp $ */
/*
* Copyright (c) 1997 Jonathan Stone (hereinafter referred to as the author)
@@ -158,7 +158,7 @@
XLEAF(mips64r2_wbflush)
nop
sync
- j ra
+ jr ra
nop
END(mips3_wbflush)
@@ -185,7 +185,7 @@
nop
nop
nop
- j ra
+ jr ra
nop
END(mips_wait_idle)
@@ -196,7 +196,7 @@
*/
LEAF(mips3_cp0_compare_read)
mfc0 v0, MIPS_COP_0_COMPARE
- j ra
+ jr ra
nop
END(mips3_cp0_compare_read)
@@ -217,7 +217,7 @@
*/
LEAF(mips3_cp0_config_read)
mfc0 v0, MIPS_COP_0_CONFIG
- j ra
+ jr ra
nop
END(mips3_cp0_config_read)
@@ -245,7 +245,7 @@
*/
LEAF(mipsNN_cp0_config1_read)
mfc0 v0, MIPS_COP_0_CONFIG, 1
- j ra
+ jr ra
nop
END(mipsNN_cp0_config1_read)
@@ -266,7 +266,7 @@
*/
LEAF(mipsNN_cp0_config2_read)
mfc0 v0, MIPS_COP_0_CONFIG, 2
- j ra
+ jr ra
nop
END(mipsNN_cp0_config2_read)
@@ -277,7 +277,7 @@
*/
LEAF(mipsNN_cp0_config3_read)
mfc0 v0, MIPS_COP_0_CONFIG, 3
- j ra
+ jr ra
nop
END(mipsNN_cp0_config3_read)
@@ -407,7 +407,7 @@
* Set the value of the CP0 USERLOCAL (TLB_CONTEXT, select 2) register.
*/
LEAF(mipsNN_cp0_hwrena_write)
- j ra
+ jr ra
mtc0 a0, MIPS_COP_0_HWRENA
END(mipsNN_cp0_hwrena_write)
@@ -416,7 +416,7 @@
* Set the value of the CP0 USERLOCAL (TLB_CONTEXT, select 2) register.
*/
LEAF(mipsNN_cp0_userlocal_write)
- j ra
+ jr ra
_MTC0 a0, MIPS_COP_0_TLB_CONTEXT, 2
END(mipsNN_cp0_userlocal_write)
#endif /* (MIPS32R2 + MIPS64R2) > 0 */
@@ -430,7 +430,7 @@
*/
LEAF(mips3_cp0_count_read)
mfc0 v0, MIPS_COP_0_COUNT
- j ra
+ jr ra
nop
END(mips3_cp0_count_read)
WEAK_ALIAS(cpu_counter32, mips3_cp0_count_read)
@@ -452,7 +452,7 @@
*/
LEAF(mips3_cp0_wired_read)
mfc0 v0, MIPS_COP_0_TLB_WIRED
- j ra
+ jr ra
nop
END(mips3_cp0_wired_read)
@@ -598,7 +598,7 @@
mtc0 t0, MIPS_COP_0_STATUS # Restore KX
COP0_SYNC
PTR_S zero, PCB_ONFAULT(v1)
- j ra
+ jr ra
move v0, zero # made it w/o errors
END(badaddr64)
@@ -606,7 +606,7 @@
mtc0 t0, MIPS_COP_0_STATUS # Restore KX
COP0_SYNC
PTR_S zero, PCB_ONFAULT(v1)
- j ra
+ jr ra
li v0, -1
END(baderr64)
@@ -638,7 +638,7 @@
srl v0, v0, 0
#endif
#endif /* __mips_o32 */
- j ra
+ jr ra
nop
END(mips3_cp0_tlb_entry_hi_probe)
@@ -666,7 +666,7 @@
srl v0, v0, 0
#endif
#endif /* __mips_o32 */
- j ra
+ jr ra
nop
END(mips3_cp0_tlb_entry_lo_probe)
Index: src/sys/arch/mips/mips/mipsX_subr.S
diff -u src/sys/arch/mips/mips/mipsX_subr.S:1.52 src/sys/arch/mips/mips/mipsX_subr.S:1.53
--- src/sys/arch/mips/mips/mipsX_subr.S:1.52 Tue Aug 2 05:13:21 2011
+++ src/sys/arch/mips/mips/mipsX_subr.S Tue Aug 16 06:55:12 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: mipsX_subr.S,v 1.52 2011/08/02 05:13:21 matt Exp $ */
+/* $NetBSD: mipsX_subr.S,v 1.53 2011/08/16 06:55:12 matt Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -334,6 +334,10 @@
*/
VECTOR(MIPSX(tlb_miss), unknown)
.set noat
+#ifdef MIPS3_LOONGSON2
+ li k0, MIPS_DIAG_BTB_CLEAR
+ mtc0 k0, MIPS_COP_0_DIAG
+#endif
_MFC0 k0, MIPS_COP_0_BAD_VADDR #00: k0=bad address
lui k1, %hi(CPUVAR(PMAP_SEG0TAB)) #01: k1=hi of seg0tab
bltz k0, MIPSX(kernelfault) #02: k0<0 -> 4f (kernel fault)
@@ -360,10 +364,12 @@
_SLL k1, WIRED_SHIFT #14: chop top 2 bits (part 2a)
_SRL k1, WIRED_SHIFT #15: chop top 2 bits (part 2b)
_MTC0 k1, MIPS_COP_0_TLB_LO1 #16: lo1 is loaded
+#ifndef MIPS3_LOONGSON2
sll $0, $0, 3 #17: standard nop (ehb)
#ifdef MIPS3
nop #18: extra nop for QED5230
#endif
+#endif
tlbwr #19: write to tlb
sll $0, $0, 3 #1a: standard nop (ehb)
#if (MIPS3 + MIPS64 + MIPS64R2) > 0
@@ -434,7 +440,7 @@
li k1, MIPS_KSEG1_START #04
or k0, k1 #05
lui k1, %hi(CPUVAR(CURLWP)) #06: k1=hi of curlwp
- j k0 #07
+ jr k0 #07
PTR_L k1, %lo(CPUVAR(CURLWP))(k1) #08: k1=lo of curlwp
_VECTOR_END(MIPSX(cache))
@@ -475,7 +481,7 @@
# we dont have to shift.
PTR_L k0, 0(k0) #09: get the function address
lui k1, %hi(CPUVAR(CURLWP)) #0a: k1=hi of curlwp
- j k0 #0b: jump to the function
+ jr k0 #0b: jump to the function
PTR_L k1, %lo(CPUVAR(CURLWP))(k1) #0c: k1=lo of curlwp
nop #0d
nop #0e
@@ -510,7 +516,7 @@
PTR_LA k0, MIPSX(kern_intr) #07: nope, kernel intr
1:
lui k1, %hi(CPUVAR(CURLWP)) #09: k1=hi of curlwp
- j k0 #0a: jump to the function
+ jr k0 #0a: jump to the function
PTR_L k1, %lo(CPUVAR(CURLWP))(k1) #0b: k1=lo of curlwp
.set at
_VECTOR_END(MIPSX(intr))
@@ -995,6 +1001,10 @@
/*
* Save a minimum of registers to see if this is rdhwr $3,$29
*/
+#ifdef MIPS3_LOONGSON2
+ li k0, MIPS_DIAG_BTB_CLEAR
+ mtc0 k0, MIPS_COP_0_DIAG
+#endif
/* K1 already has CURLWP */
PTR_L k0, L_PCB(k1) # XXXuvm_lwp_getuarea
PTR_ADDU k0, USPACE - TF_SIZ - CALLFRAME_SIZ
@@ -1091,13 +1101,13 @@
_MFC0 a3, MIPS_COP_0_EXC_PC # 4th arg is exception PC
REG_S t8, CALLFRAME_SIZ+TF_REG_T8(k0) # will be MIPS_CURLWP
REG_S t9, CALLFRAME_SIZ+TF_REG_T9(k0)
+ REG_S v0, CALLFRAME_SIZ+TF_REG_MULLO(k0)
+ REG_S v1, CALLFRAME_SIZ+TF_REG_MULHI(k0)
REG_S gp, CALLFRAME_SIZ+TF_REG_GP(k0)
REG_S sp, CALLFRAME_SIZ+TF_REG_SP(k0)
REG_S s8, CALLFRAME_SIZ+TF_REG_S8(k0)
REG_S ra, CALLFRAME_SIZ+TF_REG_RA(k0)
REG_S a0, CALLFRAME_SIZ+TF_REG_SR(k0)
- REG_S v0, CALLFRAME_SIZ+TF_REG_MULLO(k0)
- REG_S v1, CALLFRAME_SIZ+TF_REG_MULHI(k0)
REG_S a3, CALLFRAME_SIZ+TF_REG_EPC(k0)
#ifdef __GP_SUPPORT__
PTR_LA gp, _C_LABEL(_gp) # switch to kernel GP
@@ -1873,7 +1883,7 @@
PTR_S t3, TLBMASK_HI(a1)
INT_S ta0, TLBMASK_LO0(a1)
INT_S ta1, TLBMASK_LO1(a1)
- j ra
+ jr ra
INT_S t2, TLBMASK_MASK(a1)
END(MIPSX(tlb_read_indexed))
@@ -2299,6 +2309,10 @@
REG_L s6, CALLFRAME_SIZ+TF_REG_S6(sp) # $22
REG_L s7, CALLFRAME_SIZ+TF_REG_S7(sp) # $23
REG_L s8, CALLFRAME_SIZ+TF_REG_S8(sp) # $30
+#ifdef MIPS3_LOONGSON2
+ li t0, (MIPS_DIAG_BTB_CLEAR|MIPS_DIAG_ITLB_CLEAR)
+ mtc0 t0, MIPS_COP_0_DIAG
+#endif
MIPSX(user_intr_return):
#ifdef PARANOIA
PTR_L t0, L_CPU(MIPS_CURLWP)
@@ -2355,7 +2369,8 @@
# Call the routine specified by cpu_setfunc()
# and return directly to user_return
PTR_LA ra, MIPSX(user_return)
- jr s0
+ move t9, s0
+ jr t9
move a0, s1
END(MIPSX(setfunc_trampoline))
@@ -2437,7 +2452,7 @@
PTR_L v0, L_PRIVATE(a0) # get lwp private
_MTC0 v0, MIPS_COP_0_TLB_CONTEXT, 4 # make available for rdhwr
#endif
- j ra
+ jr ra
nop
END(MIPSX(cpu_switch_resume))
@@ -2604,7 +2619,7 @@
bgtz a1, 1b
addu a0, 64
- j ra
+ jr ra
nop
END(MIPSX(pagezero))
#endif /* USE_64BIT_INSTRUCTIONS */