Module Name: src
Committed By: matt
Date: Thu Aug 20 22:32:19 UTC 2009
Modified Files:
src/sys/arch/mips/mips [matt-nb5-mips64]: copy.S
Log Message:
Make ABI agnostic. (Almost identical O32 code; uses a different stack slot
for a temporary).
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.5.38.1 src/sys/arch/mips/mips/copy.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/copy.S
diff -u src/sys/arch/mips/mips/copy.S:1.5 src/sys/arch/mips/mips/copy.S:1.5.38.1
--- src/sys/arch/mips/mips/copy.S:1.5 Wed Oct 17 19:55:37 2007
+++ src/sys/arch/mips/mips/copy.S Thu Aug 20 22:32:19 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: copy.S,v 1.5 2007/10/17 19:55:37 garbled Exp $ */
+/* $NetBSD: copy.S,v 1.5.38.1 2009/08/20 22:32:19 matt Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -72,18 +72,18 @@
beq a2, zero, 4f
1:
lbu v0, 0(a0)
- subu a2, a2, 1
+ PTR_SUBU a2, a2, 1
beq v0, zero, 2f
sb v0, 0(a1) # each byte until NIL
- addu a0, a0, 1
+ PTR_ADDU a0, a0, 1
bne a2, zero, 1b # less than maxlen
- addu a1, a1, 1
+ PTR_ADDU a1, a1, 1
4:
li v0, ENAMETOOLONG # run out of space
2:
beq a3, zero, 3f # return num. of copied bytes
- subu a2, t0, a2 # if the 4th arg was non-NULL
- sw a2, 0(a3)
+ PTR_SUBU a2, t0, a2 # if the 4th arg was non-NULL
+ PTR_S a2, 0(a3)
3:
j ra # v0 is 0 or ENAMETOOLONG
nop
@@ -97,29 +97,29 @@
* else return 0 or EFAULT.
*/
LEAF(copyinstr)
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(copystrerr)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(copystrerr)
blt a0, zero, _C_LABEL(copystrerr)
- sw v0, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
move t0, a2
beq a2, zero, 4f
1:
lbu v0, 0(a0)
- subu a2, a2, 1
+ PTR_SUBU a2, a2, 1
beq v0, zero, 2f
sb v0, 0(a1)
- addu a0, a0, 1
+ PTR_ADDU a0, a0, 1
bne a2, zero, 1b
- addu a1, a1, 1
+ PTR_ADDU a1, a1, 1
4:
li v0, ENAMETOOLONG
2:
beq a3, zero, 3f
- subu a2, t0, a2
- sw a2, 0(a3)
+ PTR_SUBU a2, t0, a2
+ PTR_S a2, 0(a3)
3:
j ra # v0 is 0 or ENAMETOOLONG
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_S zero, U_PCB_ONFAULT(v1)
END(copyinstr)
/*
@@ -130,33 +130,33 @@
* else return 0 or EFAULT.
*/
LEAF(copyoutstr)
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(copystrerr)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(copystrerr)
blt a1, zero, _C_LABEL(copystrerr)
- sw v0, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
move t0, a2
beq a2, zero, 4f
1:
lbu v0, 0(a0)
- subu a2, a2, 1
+ PTR_SUBU a2, a2, 1
beq v0, zero, 2f
sb v0, 0(a1)
- addu a0, a0, 1
+ PTR_ADDU a0, a0, 1
bne a2, zero, 1b
- addu a1, a1, 1
+ PTR_ADDU a1, a1, 1
4:
li v0, ENAMETOOLONG
2:
beq a3, zero, 3f
- subu a2, t0, a2
- sw a2, 0(a3)
+ PTR_SUBU a2, t0, a2
+ PTR_S a2, 0(a3)
3:
j ra # v0 is 0 or ENAMETOOLONG
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_S zero, U_PCB_ONFAULT(v1)
END(copyoutstr)
LEAF(copystrerr)
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_S zero, U_PCB_ONFAULT(v1)
j ra
li v0, EFAULT # return EFAULT
END(copystrerr)
@@ -171,36 +171,36 @@
* called by uiomove(), which may be in the path of servicing a non-fatal
* page fault.
*/
-NESTED(kcopy, 48, ra)
- subu sp, sp, 48 # set up stack frame
+NESTED(kcopy, 2*CALLFRAME_SIZ, ra)
+ PTR_SUBU sp, sp, 2*CALLFRAME_SIZ # set up stack frame
/* Frame contains RA (31) and S0 (16). */
- .mask 0x80010000, -4
- sw ra, 44(sp) # save ra
- sw s0, 32(sp) # save s0
+ .mask 0x80010000, -SZREG
+ REG_S ra, CALLFRAME_SIZ+CALLFRAME_RA(sp) # save ra
+ REG_S s0, CALLFRAME_SIZ+CALLFRAME_S0(sp) # save s0
move v0, a0 # swap a0, a1 for call to memcpy
move a0, a1
move a1, v0
- lw v1, L_ADDR(MIPS_CURLWP) # set up fault handler
- la v0, _C_LABEL(kcopyerr)
- lw s0, U_PCB_ONFAULT(v1) # save old handler
+ PTR_L v1, L_ADDR(MIPS_CURLWP) # set up fault handler
+ PTR_LA v0, _C_LABEL(kcopyerr)
+ PTR_L s0, U_PCB_ONFAULT(v1) # save old handler
jal memcpy
- sw v0, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
- lw v1, L_ADDR(MIPS_CURLWP) # restore the old handler
- lw ra, 44(sp) # restore ra
- sw s0, U_PCB_ONFAULT(v1)
- lw s0, 32(sp) # restore s0
- addu sp, sp, 48 # kill stack frame
+ PTR_L v1, L_ADDR(MIPS_CURLWP) # restore the old handler
+ REG_L ra, CALLFRAME_SIZ+CALLFRAME_RA(sp) # restore ra
+ PTR_S s0, U_PCB_ONFAULT(v1)
+ REG_L s0, CALLFRAME_SIZ+CALLFRAME_S0(sp) # restore s0
+ PTR_ADDU sp, sp, 2*CALLFRAME_SIZ # kill stack frame
j ra
move v0, zero # success!
END(kcopy)
LEAF(kcopyerr)
- lw v1, L_ADDR(MIPS_CURLWP) # restore the old handler
- lw ra, 44(sp) # restore ra
- sw s0, U_PCB_ONFAULT(v1)
- lw s0, 32(sp) # restore s0
- addu sp, sp, 48 # kill stack frame
+ PTR_L v1, L_ADDR(MIPS_CURLWP) # restore the old handler
+ REG_L ra, CALLFRAME_SIZ+CALLFRAME_RA(sp) # restore ra
+ PTR_S s0, U_PCB_ONFAULT(v1)
+ REG_L s0, CALLFRAME_SIZ+CALLFRAME_S0(sp) # restore s0
+ PTR_ADDU sp, sp, 2*CALLFRAME_SIZ # kill stack frame
j ra
li v0, EFAULT # return EFAULT
END(kcopyerr)
@@ -212,22 +212,22 @@
* if a bad address is encountered.
*/
NESTED(copyin, CALLFRAME_SIZ, ra)
- subu sp, sp, CALLFRAME_SIZ
+ PTR_SUBU sp, sp, CALLFRAME_SIZ
.mask 0x80000000, -4
- sw ra, CALLFRAME_RA(sp)
+ REG_S ra, CALLFRAME_RA(sp)
blt a0, zero, _C_LABEL(copyerr)
move v0, a0 # swap a0, a1 for call to memcpy
move a0, a1
move a1, v0
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(copyerr)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(copyerr)
jal memcpy
- sw v0, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
- lw v1, L_ADDR(MIPS_CURLWP)
- lw ra, CALLFRAME_RA(sp)
- addu sp, sp, CALLFRAME_SIZ
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ REG_L ra, CALLFRAME_RA(sp)
+ PTR_ADDU sp, sp, CALLFRAME_SIZ
+ PTR_S zero, U_PCB_ONFAULT(v1)
j ra
move v0, zero
END(copyin)
@@ -239,31 +239,31 @@
* if a bad address is encountered.
*/
NESTED(copyout, CALLFRAME_SIZ, ra)
- subu sp, sp, CALLFRAME_SIZ
+ PTR_SUBU sp, sp, CALLFRAME_SIZ
.mask 0x80000000, -4
- sw ra, CALLFRAME_RA(sp)
+ REG_S ra, CALLFRAME_RA(sp)
blt a1, zero, _C_LABEL(copyerr)
move v0, a0 # swap a0, a1 for call to memcpy
move a0, a1
move a1, v0
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(copyerr)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(copyerr)
jal memcpy
- sw v0, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
- lw v1, L_ADDR(MIPS_CURLWP)
- lw ra, CALLFRAME_RA(sp)
- addu sp, sp, CALLFRAME_SIZ
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ REG_L ra, CALLFRAME_RA(sp)
+ PTR_ADDU sp, sp, CALLFRAME_SIZ
+ PTR_S zero, U_PCB_ONFAULT(v1)
j ra
move v0, zero
END(copyout)
LEAF(copyerr)
- lw v1, L_ADDR(MIPS_CURLWP)
- lw ra, CALLFRAME_RA(sp)
- addu sp, sp, CALLFRAME_SIZ
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ REG_L ra, CALLFRAME_RA(sp)
+ PTR_ADDU sp, sp, CALLFRAME_SIZ
+ PTR_S zero, U_PCB_ONFAULT(v1)
j ra
li v0, EFAULT # return EFAULT
END(copyerr)
@@ -274,14 +274,14 @@
* This function is safe to call during an interrupt context.
*/
LEAF(fuswintr)
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(fswintrberr)
- lw a2, U_PCB_ONFAULT(v1)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(fswintrberr)
+ PTR_L a2, U_PCB_ONFAULT(v1)
blt a0, zero, _C_LABEL(fswintrberr)
- sw v0, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
lhu v0, 0(a0) # fetch short
j ra
- sw a2, U_PCB_ONFAULT(v1)
+ PTR_S a2, U_PCB_ONFAULT(v1)
END(fuswintr)
/*
@@ -290,13 +290,13 @@
* This function is safe to call during an interrupt context.
*/
LEAF(suswintr)
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(fswintrberr)
- lw a2, U_PCB_ONFAULT(v1)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(fswintrberr)
+ PTR_L a2, U_PCB_ONFAULT(v1)
blt a0, zero, _C_LABEL(fswintrberr)
- sw v0, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
sh a1, 0(a0) # store short
- sw a2, U_PCB_ONFAULT(v1)
+ PTR_S a2, U_PCB_ONFAULT(v1)
j ra
move v0, zero
END(suswintr)
@@ -307,13 +307,13 @@
*/
LEAF(fuword)
XLEAF(fuiword)
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(fswberr)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(fswberr)
blt a0, zero, _C_LABEL(fswberr)
- sw v0, U_PCB_ONFAULT(v1)
- lw v0, 0(a0) # fetch word
+ PTR_S v0, U_PCB_ONFAULT(v1)
+ INT_L v0, 0(a0) # fetch word
j ra
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_S zero, U_PCB_ONFAULT(v1)
END(fuword)
/*
@@ -322,13 +322,13 @@
*/
LEAF(fusword)
XLEAF(fuisword)
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(fswberr)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(fswberr)
blt a0, zero, _C_LABEL(fswberr)
- sw v0, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
lhu v0, 0(a0) # fetch short
j ra
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_S zero, U_PCB_ONFAULT(v1)
END(fusword)
/*
@@ -337,13 +337,13 @@
*/
LEAF(fubyte)
XLEAF(fuibyte)
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(fswberr)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(fswberr)
blt a0, zero, _C_LABEL(fswberr)
- sw v0, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
lbu v0, 0(a0) # fetch byte
j ra
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_S zero, U_PCB_ONFAULT(v1)
END(fubyte)
/*
@@ -351,12 +351,12 @@
* Stores a word of data to the user-space address.
*/
LEAF(suword)
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(fswberr)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(fswberr)
blt a0, zero, _C_LABEL(fswberr)
- sw v0, U_PCB_ONFAULT(v1)
- sw a1, 0(a0) # store word
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
+ INT_S a1, 0(a0) # store word
+ PTR_S zero, U_PCB_ONFAULT(v1)
j ra
move v0, zero
END(suword)
@@ -366,14 +366,14 @@
* Have to flush instruction cache afterwards.
*/
LEAF(suiword)
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(fswberr)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(fswberr)
blt a0, zero, _C_LABEL(fswberr)
- sw v0, U_PCB_ONFAULT(v1)
- sw a1, 0(a0) # store word
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
+ INT_S a1, 0(a0) # store word
+ PTR_S zero, U_PCB_ONFAULT(v1)
move v0, zero
- lw v1, _C_LABEL(mips_cache_ops) + MIPSX_FLUSHICACHE
+ PTR_L v1, _C_LABEL(mips_cache_ops) + MIPSX_FLUSHICACHE
j v1 # NOTE: must not clobber v0!
li a1, 4 # size of word
END(suiword)
@@ -384,12 +384,12 @@
*/
LEAF(susword)
XLEAF(suisword)
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(fswberr)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(fswberr)
blt a0, zero, _C_LABEL(fswberr)
- sw v0, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
sh a1, 0(a0) # store short
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_S zero, U_PCB_ONFAULT(v1)
j ra
move v0, zero
END(susword)
@@ -400,12 +400,12 @@
*/
LEAF(subyte)
XLEAF(suibyte)
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(fswberr)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(fswberr)
blt a0, zero, _C_LABEL(fswberr)
- sw v0, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
sb a1, 0(a0) # store byte
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_S zero, U_PCB_ONFAULT(v1)
j ra
move v0, zero
END(subyte)
@@ -416,10 +416,10 @@
* len is length of access (1=byte, 2=short, 4=long)
*/
LEAF(badaddr)
- lw v1, L_ADDR(MIPS_CURLWP)
- la v0, _C_LABEL(baderr)
+ PTR_L v1, L_ADDR(MIPS_CURLWP)
+ PTR_LA v0, _C_LABEL(baderr)
bne a1, 1, 2f
- sw v0, U_PCB_ONFAULT(v1)
+ PTR_S v0, U_PCB_ONFAULT(v1)
b 5f
lbu v0, (a0)
2:
@@ -428,9 +428,9 @@
b 5f
lhu v0, (a0)
4:
- lw v0, (a0)
+ INT_L v0, (a0)
5:
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_S zero, U_PCB_ONFAULT(v1)
j ra
move v0, zero # made it w/o errors
END(badaddr)
@@ -443,14 +443,14 @@
*/
LEAF(fswintrberr)
nop
- sw a2, U_PCB_ONFAULT(v1)
+ PTR_S a2, U_PCB_ONFAULT(v1)
j ra
li v0, -1
END(fswintrberr)
LEAF(fswberr)
XLEAF(baderr)
- sw zero, U_PCB_ONFAULT(v1)
+ PTR_S zero, U_PCB_ONFAULT(v1)
j ra
li v0, -1
END(fswberr)