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)