Module Name:    src
Committed By:   matt
Date:           Thu Aug 20 23:27:06 UTC 2009

Modified Files:
        src/sys/arch/mips/mips [matt-nb5-mips64]: locore.S

Log Message:
Make ABI agnostic (O32 code identical).


To generate a diff of this commit:
cvs rdiff -u -r1.167 -r1.167.38.1 src/sys/arch/mips/mips/locore.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/locore.S
diff -u src/sys/arch/mips/mips/locore.S:1.167 src/sys/arch/mips/mips/locore.S:1.167.38.1
--- src/sys/arch/mips/mips/locore.S:1.167	Wed Oct 17 19:55:38 2007
+++ src/sys/arch/mips/mips/locore.S	Thu Aug 20 23:27:06 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.S,v 1.167 2007/10/17 19:55:38 garbled Exp $	*/
+/*	$NetBSD: locore.S,v 1.167.38.1 2009/08/20 23:27:06 matt Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -84,23 +84,27 @@
 /*
  * Initialize stack and call machine startup.
  */
-	la	v1, start
+	PTR_LA	v1, start
 	slt	v0, v1, sp
 	bne	v0, zero, 1f
-	addu	v0, v1, -CALLFRAME_SIZ
-	subu	v0, v1, sp
+	PTR_ADDU v0, v1, -CALLFRAME_SIZ
+	PTR_SUBU v0, v1, sp
 	slt	v0, v0, 4096			# within 4KB of _start
 	beq	v0, zero, 2f
-	addu	v0, v1, -CALLFRAME_SIZ
+	PTR_ADDU v0, v1, -CALLFRAME_SIZ
 1:
 	move	sp, v0
 2:
 #ifdef __GP_SUPPORT__
-	la	gp, _C_LABEL(_gp)
+	PTR_LA	gp, _C_LABEL(_gp)
 #endif
 
 #ifdef NOFPU /* No FPU; avoid touching FPU registers */
+#ifdef _LP64
+	li	t0, MIPS_SR_KX
+#else
 	li	t0, 0				# Disable interrupts and
+#endif
 	mtc0	t0, MIPS_COP_0_STATUS		# the fp coprocessor
 	COP0_SYNC
 #ifdef HPCMIPS_L1CACHE_DISABLE
@@ -113,6 +117,9 @@
 #endif /* HPCMIPS_L1CACHE_DISABLE */
 #else
 	mfc0	t0, MIPS_COP_0_STATUS
+#ifdef _LP64
+	or	t0, MIPS_SR_KX			# turn on XKSEG and XKPHYS
+#endif
 	or	t0, MIPS_SR_COP_1_BIT		# Disable interrupts, and
 	mtc0	t0, MIPS_COP_0_STATUS		# enable the fp coprocessor
 	COP0_HAZARD_FPUENABLE
@@ -129,18 +136,18 @@
 #else
 	cfc1	t1, MIPS_FPU_ID			# read FPU ID register
 #endif
-	sw	t0, _C_LABEL(cpu_id)		# save PRID register
-	sw	t1, _C_LABEL(fpu_id)		# save FPU ID register
-	la	MIPS_CURLWP, _C_LABEL(lwp0)	# set curlwp, curcpu
-	la	t0, _C_LABEL(cpu_info_store)
-	sw	MIPS_CURLWP, CPU_INFO_CURLWP(t0)
-	sw	t0, L_CPU(MIPS_CURLWP) 
+	INT_S	t0, _C_LABEL(cpu_id)		# save PRID register
+	INT_S	t1, _C_LABEL(fpu_id)		# save FPU ID register
+	PTR_LA	MIPS_CURLWP, _C_LABEL(lwp0)	# set curlwp, curcpu
+	PTR_LA	t0, _C_LABEL(cpu_info_store)
+	PTR_S	MIPS_CURLWP, CPU_INFO_CURLWP(t0)
+	PTR_S	t0, L_CPU(MIPS_CURLWP) 
 	jal	_C_LABEL(mach_init)		# mach_init(a0, a1, a2, a3)
 	nop
 
-	lw	sp, _C_LABEL(proc0paddr)	# switch to proc0 stack
+	PTR_L	sp, _C_LABEL(proc0paddr)	# switch to proc0 stack
 	nop
-	addu	sp, sp, USPACE - FRAME_SIZ - CALLFRAME_SIZ
+	PTR_ADDU sp, USPACE - FRAME_SIZ - CALLFRAME_SIZ
 	jal	_C_LABEL(main)			# main(void)
 	nop
 	PANIC("main() returned")		# main never returns
@@ -163,7 +170,7 @@
  */
 	beq	a0, zero, 1f
 	nop
-	lw	a2, L_ADDR(a0)			# a2 = l->l_addr
+	PTR_L	a2, L_ADDR(a0)			# a2 = l->l_addr
 	mfc0	t0, MIPS_COP_0_STATUS
 	REG_PROLOGUE
 	REG_S	s0, U_PCB_CONTEXT+SF_REG_S0(a2)
@@ -179,51 +186,51 @@
 	REG_S	ra, U_PCB_CONTEXT+SF_REG_RA(a2)
 	REG_S	t0, U_PCB_CONTEXT+SF_REG_SR(a2)
 #ifdef IPL_ICU_MASK
-	lw	t0, _C_LABEL(md_imask)
-	sw	t0, U_PCB_PPL(a2)
+	INT_L	t0, _C_LABEL(md_imask)
+	INT_S	t0, U_PCB_PPL(a2)
 #endif
 	REG_EPILOGUE
 1:
 	move	s6, a0				# s6 = old lwp
 	move	MIPS_CURLWP, a1			# s7 = new lwp
-	subu	sp, sp, CALLFRAME_SIZ
-	sw	ra, CALLFRAME_RA(sp)
+	PTR_SUBU sp, CALLFRAME_SIZ
+	REG_S	ra, CALLFRAME_RA(sp)
 	.mask	0x80000000, -4
 /*
  * Switch to new context.
  */
-	lw	t2, _C_LABEL(mips_locoresw) + MIPSX_CPU_SWITCH_RESUME
+	PTR_L	t2, _C_LABEL(mips_locoresw) + MIPSX_CPU_SWITCH_RESUME
 	move	a0, MIPS_CURLWP
 	jal	ra, t2
 	nop
-	sw	MIPS_CURLWP, CPUVAR(CURLWP)
+	PTR_S	MIPS_CURLWP, CPUVAR(CURLWP)
 
 	/* Check for restartable atomic sequences (RAS) */
-	lw	t1, L_PROC(MIPS_CURLWP)
-	lw	a0, L_ADDR(MIPS_CURLWP)
-	lw	v1, P_RASLIST(t1)
-	addu	t0, a0, USPACE - FRAME_SIZ
+	PTR_L	t1, L_PROC(MIPS_CURLWP)
+	PTR_L	a0, L_ADDR(MIPS_CURLWP)
+	PTR_L	v1, P_RASLIST(t1)
+	PTR_ADDU t0, a0, USPACE - FRAME_SIZ
 	beq	v1, zero, 1f
 	nop
 	move	a0, t1
 	jal	_C_LABEL(ras_lookup)
-	lw	a1, FRAME_EPC(t0)
-	lw	a0, L_ADDR(MIPS_CURLWP)
+	PTR_L	a1, FRAME_EPC(t0)
+	PTR_L	a0, L_ADDR(MIPS_CURLWP)
 	li	v1, -1
 	beq	v1, v0, 1f
-	addu	t0, a0, USPACE - FRAME_SIZ
-	sw	v0, FRAME_EPC(t0)
+	PTR_ADDU t0, a0, USPACE - FRAME_SIZ
+	PTR_S	v0, FRAME_EPC(t0)
 1:
 	/* New context is now active */
 #ifdef IPL_ICU_MASK
 	# restore ICU state
-	lw	a0, L_ADDR(MIPS_CURLWP)
-	lw	t0, U_PCB_PPL(a0)
-	sw	t0, _C_LABEL(md_imask)
+	PTR_L	a0, L_ADDR(MIPS_CURLWP)
+	INT_L	t0, U_PCB_PPL(a0)
+	INT_S	t0, _C_LABEL(md_imask)
 	jal	_C_LABEL(md_imask_update)
 	nop
 #endif /* IPL_ICU_MASK */
-	lw	a0, L_ADDR(MIPS_CURLWP)
+	PTR_L	a0, L_ADDR(MIPS_CURLWP)
 	move	v0, s6				# Save return value
 	REG_PROLOGUE
 	REG_L	t0, U_PCB_CONTEXT+SF_REG_SR(a0)
@@ -390,7 +397,13 @@
 
 LEAF(_setsoftintr)
 	mfc0	v1, MIPS_COP_0_STATUS		# save status register
+#if 0
+	li	a3, ~MIPS_SR_INT_IE
+	and	a3, v1
+	mtc0	a3, MIPS_COP_0_STATUS		# disable interrupts (2 cycles)
+#else
 	mtc0	zero, MIPS_COP_0_STATUS		# disable interrupts (2 cycles)
+#endif
 	COP0_SYNC
 	nop
 	nop
@@ -407,7 +420,13 @@
 
 LEAF(_clrsoftintr)
 	mfc0	v1, MIPS_COP_0_STATUS		# save status register
+#if 0
+	li	a3, ~MIPS_SR_INT_IE
+	and	a3, v1
+	mtc0	a3, MIPS_COP_0_STATUS		# disable interrupts (2 cycles)
+#else
 	mtc0	zero, MIPS_COP_0_STATUS		# disable interrupts (2 cycles)
+#endif
 	COP0_SYNC
 	nop
 	nop
@@ -425,7 +444,12 @@
 LEAF(_splnone)
 	mtc0	zero, MIPS_COP_0_CAUSE		# clear SOFT_INT bits
 	COP0_SYNC
+#if 0
+	mfc0	v0, MIPS_COP_0_STATUS		# enable all sources
+	ori	v0, (MIPS_INT_MASK | MIPS_SR_INT_IE)
+#else
 	li	v0, (MIPS_INT_MASK | MIPS_SR_INT_IE)
+#endif
 	DYNAMIC_STATUS_MASK(v0,t0)		# machine dependent masking
 	mtc0	v0, MIPS_COP_0_STATUS		# enable all sources
 	COP0_SYNC
@@ -525,18 +549,18 @@
 NESTED(MachFPInterrupt, CALLFRAME_SIZ, ra)
 XNESTED(MachFPTrap)
 	.mask	0x80000000, -4
-	subu	sp, sp, CALLFRAME_SIZ
-	mfc0	t0, MIPS_COP_0_STATUS
-	sw	ra, CALLFRAME_RA(sp)
-	or	t0, t0, MIPS_SR_COP_1_BIT
-	mtc0	t0, MIPS_COP_0_STATUS
+	PTR_SUBU	sp, CALLFRAME_SIZ
+	mfc0		t0, MIPS_COP_0_STATUS
+	REG_S		ra, CALLFRAME_RA(sp)
+	or		t0, t0, MIPS_SR_COP_1_BIT
+	mtc0		t0, MIPS_COP_0_STATUS
 	COP0_HAZARD_FPUENABLE
 
-	cfc1	t0, MIPS_FPU_CSR	# stall til FP done
-	cfc1	t0, MIPS_FPU_CSR	# now get status
+	cfc1		t0, MIPS_FPU_CSR	# stall til FP done
+	cfc1		t0, MIPS_FPU_CSR	# now get status
 	nop
-	sll	t2, t0, (31 - 17)	# unimplemented operation?
-	bgez	t2, 3f			# no, normal trap
+	sll		t2, t0, (31 - 17)	# unimplemented operation?
+	bgez		t2, 3f			# no, normal trap
 	nop
 /*
  * We got an unimplemented operation trap so
@@ -547,45 +571,45 @@
  *
  * fetch the instruction and emulate the instruction.
  */
-	bgez	a1, 1f			# Check the branch delay bit.
+	bgez		a1, 1f			# Check the branch delay bit.
 	nop
 /*
  * The instruction is in the branch delay slot.
  */
-	b	2f
-	lw	a0, 4(a2)			# a0 = coproc instruction
+	b		2f
+	lw		a0, 4(a2)		# a0 = coproc instruction
 /*
  * This is not in the branch delay slot so calculate the resulting
  * PC (epc + 4) into v0 and continue to MachEmulateFP().
  */
 1:
-	lw	a0, 0(a2)			# a0 = coproc instruction
+	lw		a0, 4(a2)		# a0 = coproc instruction
 2:
-	move	a2, a1
+	move		a2, a1
 
 /*
  * Check to see if the instruction to be emulated is a floating-point
  * instruction.
  */
-	srl	t0, a0, MIPS_OPCODE_SHIFT
-	beq	t0, MIPS_OPCODE_C1, 4f
+	srl		t0, a0, MIPS_OPCODE_SHIFT
+	beq		t0, MIPS_OPCODE_C1, 4f
 	nop
 
 /*
  * Send a floating point exception signal to the current LWP.
  */
-	li	t0, 0xFFFFFF00
-	and	a1, a1, t0
-	ori	a1, a1, T_RES_INST << MIPS_CR_EXC_CODE_SHIFT
+	li		t0, 0xFFFFFF00
+	and		a1, a1, t0
+	ori		a1, a1, T_RES_INST << MIPS_CR_EXC_CODE_SHIFT
 	REG_PROLOGUE
-	REG_S	a1, FRAME_CAUSE(a3)
+	REG_S		a1, FRAME_CAUSE(a3)
 	REG_EPILOGUE
 
-	move	a1, a0				# code = instruction
-	jal	_C_LABEL(mips_fpuillinst)
-	move	a0, MIPS_CURLWP			# get current LWP
+	move		a1, a0				# code = instruction
+	jal		_C_LABEL(mips_fpuillinst)
+	move		a0, MIPS_CURLWP			# get current LWP
 
-	b	FPReturn
+	b		FPReturn
 	nop
 
 /*
@@ -594,133 +618,93 @@
  */
 3:
 	REG_PROLOGUE
-	REG_S	a1, FRAME_CAUSE(a3)
+	REG_S		a1, FRAME_CAUSE(a3)
 	REG_EPILOGUE
 
-	and	a0, t0, ~MIPS_FPU_EXCEPTION_BITS
-	ctc1	a0, MIPS_FPU_CSR
+	and		a0, t0, ~MIPS_FPU_EXCEPTION_BITS
+	ctc1		a0, MIPS_FPU_CSR
 
-	move	a1, t0				# FPU status
-	jal	_C_LABEL(mips_fpuexcept)
-	move	a0, MIPS_CURLWP			# get current LWP
+	move		a1, t0			# FPU status
+	jal		_C_LABEL(mips_fpuexcept)
+	move		a0, MIPS_CURLWP		# get current LWP
 
-	b	FPReturn
+	b		FPReturn
 	nop
 
 /*
  * Finally, we can call MachEmulateFP() where a0 is the instruction to emulate.
  */
 4:
-	jal	_C_LABEL(MachEmulateFP)
-	move	a1, a3
+	jal		_C_LABEL(MachEmulateFP)
+	move		a1, a3
 
 /*
  * Turn off the floating point coprocessor and return.
  */
 FPReturn:
-	mfc0	t0, MIPS_COP_0_STATUS
-	lw	ra, CALLFRAME_RA(sp)
-	and	t0, t0, ~MIPS_SR_COP_1_BIT
-	mtc0	t0, MIPS_COP_0_STATUS
+	mfc0		t0, MIPS_COP_0_STATUS
+	REG_S		ra, CALLFRAME_RA(sp)
+	and		t0, t0, ~MIPS_SR_COP_1_BIT
+	mtc0		t0, MIPS_COP_0_STATUS
 	COP0_SYNC
-	j	ra
-	addu	sp, sp, CALLFRAME_SIZ
+	j		ra
+	PTR_ADDU	sp, CALLFRAME_SIZ
 END(MachFPInterrupt)
 #endif /* !defined(NOFPU) && !defined(SOFTFLOAT) */
 
 LEAF(mips_pagecopy)
-#if defined(__mips_n32) || defined(_LP64)
 	.set	push
+#if defined(__mips_n32) || defined(_LP64)
 	.set	mips3
-	li	a2, PAGE_SIZE >> 6
+#endif
+	li		a2, PAGE_SIZE / (8 * SZREG)
 
-1:	ld	t0, 0(a1)
-	ld	ta0, 32(a1)
-	ld	t2, 16(a1)
-	ld	ta2, 48(a1)
-	subu	a2, 1
-	ld	t1, 8(a1)
-	ld	t3, 24(a1)
-	ld	ta1, 40(a1)
-	ld	ta3, 56(a1)
-
-	sd	t0, 0(a0)
-	sd	ta0, 32(a0)
-	sd	t2, 16(a0)
-	sd	ta2, 48(a0)
-	addu	a1, 64
-	sd	t1, 8(a0)
-	sd	t3, 24(a0)
-	sd	ta1, 40(a0)
-	sd	ta3, 56(a0)
-	bgtz	a2,1b
-	addu	a0, 64
+1:	REG_L		t0,  (0*SZREG)(a1)
+	REG_L		ta0, (4*SZREG)(a1)
+	PTR_SUBU	a2, 1
+	REG_L		t1,  (1*SZREG)(a1)
+	REG_L		t2,  (2*SZREG)(a1)
+	REG_L		t3,  (3*SZREG)(a1)
+	REG_L		ta1, (5*SZREG)(a1)
+	REG_L		ta2, (6*SZREG)(a1)
+	REG_L		ta3, (7*SZREG)(a1)
+
+	REG_S		t0,  (0*SZREG)(a0)
+	REG_S		ta0, (4*SZREG)(a0)
+	PTR_ADDU	a1, 8*SZREG
+	REG_S		t1,  (1*SZREG)(a0)
+	REG_S		t2,  (2*SZREG)(a0)
+	REG_S		t3,  (3*SZREG)(a0)
+	REG_S		ta1, (5*SZREG)(a0)
+	REG_S		ta2, (6*SZREG)(a0)
+	REG_S		ta3, (7*SZREG)(a0)
+	bgtz		a2, 1b
+	PTR_ADDU	a0, 8*SZREG
 	.set	pop
-#else
-	/* o32 */
-	li	a2, PAGE_SIZE >> 5
-
-1:	lw	t0, 0(a1)
-	lw	ta0, 16(a1)
-	subu	a2, 1
-	lw	t1, 4(a1)
-	lw	t2, 8(a1)
-	lw	t3, 12(a1)
-	lw	ta1, 20(a1)
-	lw	ta2, 24(a1)
-	lw	ta3, 28(a1)
-
-	sw	t0, 0(a0)
-	sw	ta0, 16(a0)
-	addu	a1, 32
-	sw	t1, 4(a0)
-	sw	t2, 8(a0)
-	sw	t3, 12(a0)
-	sw	ta1, 20(a0)
-	sw	ta2, 24(a0)
-	sw	ta3, 28(a0)
-	bgtz	a2,1b
-	addu	a0, 32
-#endif /* __mips_n32 || _LP64 */
 	j	ra
 	nop
 END(mips_pagecopy)
 
 LEAF(mips_pagezero)
 /* We can always safely store a 64-bit zero on MIPS3,4,64 */
-#if !defined(MIPS1) && !defined(MIPS32)
 	.set	push
+#if !defined(MIPS1) && !defined(MIPS32)
 	.set	mips3
-	li	a1, PAGE_SIZE >> 6
+#endif
+	li		a1, PAGE_SIZE / (8*SZREG)
 
-1:	sd	zero, 0(a0)			# try to miss cache first
-	sd	zero, 32(a0)
-	subu	a1, 1
-	sd	zero, 16(a0)
-	sd	zero, 48(a0)
-	sd	zero, 8(a0)			# fill in cache lines
-	sd	zero, 40(a0)
-	sd	zero, 24(a0)
-	sd	zero, 56(a0)
-	bgtz	a1,1b
-	addu	a0, 64
+1:	REG_S		zero, (0*SZREG)(a0)	# try to miss cache first
+	REG_S		zero, (4*SZREG)(a0)
+	subu		a1, 1
+	REG_S		zero, (1*SZREG)(a0)	# fill in cache lines
+	REG_S		zero, (2*SZREG)(a0)
+	REG_S		zero, (3*SZREG)(a0)
+	REG_S		zero, (5*SZREG)(a0)
+	REG_S		zero, (6*SZREG)(a0)
+	REG_S		zero, (7*SZREG)(a0)
+	bgtz		a1,1b
+	PTR_ADDU	a0, 8*SZREG
 	.set	pop
-#else
-	/* o32 */
-	li	a1, PAGE_SIZE >> 5
-
-1:	sw	zero, 0(a0)
-	sw	zero, 16(a0)			# try to miss cache first
-	subu	a1, 1
-	sw	zero, 4(a0)
-	sw	zero, 8(a0)
-	sw	zero, 12(a0)
-	sw	zero, 20(a0)
-	sw	zero, 24(a0)
-	sw	zero, 28(a0)
-	bgtz	a1,1b
-	addu	a0, 32
-#endif /* __mips_n32 || _LP64 */
 	j	ra
 	nop
 END(mips_pagezero)
@@ -739,30 +723,50 @@
  * stacktrace() -- print a stack backtrace to the console.
  *	implicitly accesses caller's a0-a3.
  */
-NESTED(stacktrace, CALLFRAME_SIZ+24, ra)
+#if defined(__mips_o32) || defined(__mips_o64)
+#define	XCALLFRAME_SIZ		(CALLFRAME_SIZ + 6*SZREG)
+#define	XCALLFRAME_RA		(CALLFRAME_RA  + 4*SZREG)
+#endif
+#if defined(__mips_n32) || defined(__mips_n64)
+#define	XCALLFRAME_SIZ		(CALLFRAME_SIZ + 2*SZREG)
+#define	XCALLFRAME_RA		(CALLFRAME_RA  + 2*SZREG)
+#endif
+NESTED(stacktrace, XCALLFRAME_SIZ, ra)
 XNESTED(logstacktrace)
-	subu	sp, sp, CALLFRAME_SIZ+24	# four arg-passing slots
-
+	PTR_SUBU sp, XCALLFRAME_SIZ		# four arg-passing slots
 	move	t0, ra				# save caller's PC
-	addu	t1, sp, CALLFRAME_SIZ+24	# compute caller's SP
+	PTR_ADDU t1, sp, XCALLFRAME_SIZ		# save caller's SP
 	move	t2, s8				# non-virtual frame pointer
 
-	la	v0, _C_LABEL(printf)
-
-	sw	ra, 36(sp)			# save return address
+	PTR_LA	v0, _C_LABEL(printf)
 
+	REG_S	ra, XCALLFRAME_RA(sp)		# save return address
+#if defined(__mips_o32) || defined(__mips_o64)
 	/* a0-a3 are still caller's a0-a3, pass in-place as given. */
-	sw	t0, 16(sp)			# push caller's PC
-	sw	t1, 20(sp)			# push caller's SP
-	sw	t2, 24(sp)			# push caller's FP, in case
-	sw	zero, 28(sp)			# caller's RA on stack
+	REG_S	t0, 4*SZREG(sp)			# push caller's PC
+	REG_S	t1, 5*SZREG(sp)			# push caller's SP
+	REG_S	t2, 6*SZREG(sp)			# push caller's FP, in case
+	REG_S	zero, 7*SZREG(sp)		# caller's RA on stack
+	/* this uses the slot used for saving s0 in the callframe */
 	jal	_C_LABEL(stacktrace_subr)
-	sw	v0, 32(sp)			# push printf
+	 REG_S	v0, 8*SZREG(sp)			# push printf
+#endif
+#if defined(__mips_n32) || defined(__mips_n64)
+	move	a4, t0				# pass caller's PC
+	move	a5, t1				# pass caller's SP
+	move	a6, t2				# pass caller's FP, in case
+	move	a7, zero			# caller's RA on stack
+	/* this uses the slot used for saving s0 in the callframe */
+	jal	_C_LABEL(stacktrace_subr)
+	 REG_S	v0, 0(sp)			# push printf
+#endif
 
-	lw	ra, 36(sp)
-	addu	sp, sp, CALLFRAME_SIZ+24
+	REG_L	ra, XCALLFRAME_RA(sp)
+	PTR_ADDU sp, XCALLFRAME_SIZ
 	j	ra
 	nop
+#undef XCALLFRAME_RA
+#undef XCALLFRAME_SIZ
 END(stacktrace)
 #endif	/* DEBUG || DDB */
 #endif	/* DDB_TRACE */

Reply via email to