Merge jmallett@'s n64 work into HEAD - changeset 1.

Update libc assembly code to use macros that work on both o32 and n64.
Merge string functions from NetBSD.

The changes are from http://svn.freebsd.org/base/user/jmallett/octeon

Approved by:	rrs (mentor), jmallett
This commit is contained in:
jchandra 2010-06-16 12:55:14 +00:00
parent 9a26791248
commit fa919cddc1
20 changed files with 509 additions and 520 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: SYS.h,v 1.18 2003/10/29 12:28:33 pooka Exp $ */
/* $NetBSD: SYS.h,v 1.19 2009/12/14 01:07:41 matt Exp $ */
/* $FreeBSD$ */
/*-
@ -79,14 +79,22 @@
*/
#ifdef __ABICALLS__
.abicalls
# define PIC_PROLOGUE(x,sr) .set noreorder; .cpload sr; .set reorder
# define PIC_CALL(l,sr) la sr, _C_LABEL(l); jr sr
# if defined(__mips_o32) || defined(__mips_o64)
# define PIC_PROLOGUE(x) SETUP_GP
# define PIC_TAILCALL(l) PTR_LA t9, _C_LABEL(l); jr t9
# define PIC_RETURN() j ra
# else
# define PIC_PROLOGUE(x) SETUP_GP64(t3, x)
# define PIC_TAILCALL(l) PTR_LA t9, _C_LABEL(l); RESTORE_GP64; jr t9
# define PIC_RETURN() RESTORE_GP64; j ra
# endif
#else
# define PIC_PROLOGUE(x,sr)
# define PIC_CALL(l,sr) j _C_LABEL(l)
#endif
# define PIC_PROLOGUE(x)
# define PIC_TAILCALL(l) j _C_LABEL(l)
# define PIC_RETURN()
#endif /* __ABICALLS__ */
# define SYSTRAP(x) li v0, SYS_ ## x; syscall;
# define SYSTRAP(x) li v0,SYS_ ## x; syscall;
/*
* Do a syscall that cannot fail (sync, get{p,u,g,eu,eg)id)
@ -106,7 +114,7 @@
*/
#define PSEUDO_NOERROR(x) \
LEAF(__sys_ ## x); \
.weak _C_LABEL(x); \
.weak _C_LABEL(x); \
_C_LABEL(x) = _C_LABEL(__CONCAT(__sys_,x)); \
.weak _C_LABEL(__CONCAT(_,x)); \
_C_LABEL(__CONCAT(_,x)) = _C_LABEL(__CONCAT(__sys_,x)); \
@ -116,14 +124,14 @@ LEAF(__sys_ ## x); \
#define PSEUDO(x) \
LEAF(__sys_ ## x); \
.weak _C_LABEL(x); \
.weak _C_LABEL(x); \
_C_LABEL(x) = _C_LABEL(__CONCAT(__sys_,x)); \
.weak _C_LABEL(__CONCAT(_,x)); \
_C_LABEL(__CONCAT(_,x)) = _C_LABEL(__CONCAT(__sys_,x)); \
PIC_PROLOGUE(x,t9); \
PIC_PROLOGUE(__sys_ ## x); \
SYSTRAP(x); \
bne a3,zero,err; \
j ra; \
PIC_RETURN(); \
err: \
PIC_CALL(__cerror,t9); \
END(__sys_ ## x)
PIC_TAILCALL(__cerror); \
END(__sys_ ## x)

View File

@ -1,4 +1,4 @@
/* $NetBSD: _setjmp.S,v 1.20 2005/10/07 17:16:40 tsutsui Exp $ */
/* $NetBSD: _setjmp.S,v 1.20.34.5 2010/02/03 23:46:47 matt Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -36,14 +36,15 @@
__FBSDID("$FreeBSD$");
#include <machine/regnum.h>
#if defined(LIBC_SCCS) && !defined(lint)
ASMSTR("from: @(#)_setjmp.s 8.1 (Berkeley) 6/4/93")
ASMSTR("$NetBSD: _setjmp.S,v 1.20 2005/10/07 17:16:40 tsutsui Exp $")
#endif /* LIBC_SCCS and not lint */
#include "SYS.h"
#ifdef __ABICALLS__
.abicalls
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
RCSID("from: @(#)_setjmp.s 8.1 (Berkeley) 6/4/93")
#else
RCSID("$NetBSD: _setjmp.S,v 1.20.34.5 2010/02/03 23:46:47 matt Exp $")
#endif
#endif /* LIBC_SCCS and not lint */
/*
* C library -- _setjmp, _longjmp
@ -56,62 +57,70 @@ __FBSDID("$FreeBSD$");
* The previous signal state is NOT restored.
*/
.set noreorder
LEAF(_setjmp)
#ifdef __ABICALLS__
.set noreorder
.cpload t9
subu sp, sp, CALLFRAME_SIZ # allocate stack frame
.cprestore 16
REG_PROLOGUE
REG_LI v0, _JB_MAGIC__SETJMP
REG_S v0, (_JB_MAGIC * SZREG)(a0)
REG_S ra, (_JB_REG_RA * SZREG)(a0)
REG_S s0, (_JB_REG_S0 * SZREG)(a0)
REG_S s1, (_JB_REG_S1 * SZREG)(a0)
REG_S s2, (_JB_REG_S2 * SZREG)(a0)
REG_S s3, (_JB_REG_S3 * SZREG)(a0)
REG_S s4, (_JB_REG_S4 * SZREG)(a0)
REG_S s5, (_JB_REG_S5 * SZREG)(a0)
REG_S s6, (_JB_REG_S6 * SZREG)(a0)
REG_S s7, (_JB_REG_S7 * SZREG)(a0)
REG_S s8, (_JB_REG_S8 * SZREG)(a0)
#if defined(__mips_n32) || defined(__mips_n64)
REG_S gp, (_JB_REG_GP * SZREG)(a0) # newabi gp is callee-saved
#endif
li v0, _JB_MAGIC__SETJMP
sw v0, (_JB_MAGIC * SZREG)(a0)
sw ra, (_JB_REG_RA * SZREG)(a0)
sw s0, (_JB_REG_S0 * SZREG)(a0)
sw s1, (_JB_REG_S1 * SZREG)(a0)
sw s2, (_JB_REG_S2 * SZREG)(a0)
sw s3, (_JB_REG_S3 * SZREG)(a0)
sw s4, (_JB_REG_S4 * SZREG)(a0)
sw s5, (_JB_REG_S5 * SZREG)(a0)
sw s6, (_JB_REG_S6 * SZREG)(a0)
sw s7, (_JB_REG_S7 * SZREG)(a0)
sw s8, (_JB_REG_S8 * SZREG)(a0)
#ifdef __ABICALLS__
addu sp, sp, CALLFRAME_SIZ # un-allocate the stack frame
#endif
sw sp, (_JB_REG_SP * SZREG)(a0)
REG_S sp, (_JB_REG_SP * SZREG)(a0)
REG_EPILOGUE
j ra
move v0, zero
END(_setjmp)
LEAF(_longjmp)
#ifdef __ABICALLS__
.set noreorder
.cpload t9
subu sp, sp, CALLFRAME_SIZ # allocate stack frame
.cprestore 16
#endif
lw v0, (_JB_MAGIC * SZREG)(a0)
lw ra, (_JB_REG_RA * SZREG)(a0)
li t0, _JB_MAGIC__SETJMP
bne v0, t0, botch # jump if error
lw s0, (_JB_REG_S0 * SZREG)(a0)
lw s1, (_JB_REG_S1 * SZREG)(a0)
lw s2, (_JB_REG_S2 * SZREG)(a0)
lw s3, (_JB_REG_S3 * SZREG)(a0)
lw s4, (_JB_REG_S4 * SZREG)(a0)
lw s5, (_JB_REG_S5 * SZREG)(a0)
lw s6, (_JB_REG_S6 * SZREG)(a0)
lw s7, (_JB_REG_S7 * SZREG)(a0)
lw sp, (_JB_REG_SP * SZREG)(a0)
lw s8, (_JB_REG_S8 * SZREG)(a0)
PIC_PROLOGUE(_longjmp)
PTR_SUBU sp, sp, CALLFRAME_SIZ
SAVE_GP(CALLFRAME_GP)
REG_PROLOGUE
REG_L v0, (_JB_MAGIC * SZREG)(a0) # get magic number
REG_L ra, (_JB_REG_RA * SZREG)(a0)
REG_LI t0, _JB_MAGIC__SETJMP
bne v0, t0, botch # jump if error
PTR_ADDU sp, sp, CALLFRAME_SIZ # does not matter, sanity
REG_L s0, (_JB_REG_S0 * SZREG)(a0)
REG_L s1, (_JB_REG_S1 * SZREG)(a0)
REG_L s2, (_JB_REG_S2 * SZREG)(a0)
REG_L s3, (_JB_REG_S3 * SZREG)(a0)
REG_L s4, (_JB_REG_S4 * SZREG)(a0)
REG_L s5, (_JB_REG_S5 * SZREG)(a0)
REG_L s6, (_JB_REG_S6 * SZREG)(a0)
REG_L s7, (_JB_REG_S7 * SZREG)(a0)
#if defined(__mips_n32) || defined(__mips_n64)
REG_L gp, (_JB_REG_GP * SZREG)(a0)
#endif
REG_L sp, (_JB_REG_SP * SZREG)(a0)
REG_L s8, (_JB_REG_S8 * SZREG)(a0)
REG_EPILOGUE
move v0, a1 # get return value in 1st arg
j ra
move v0, a1
nop
botch:
jal _C_LABEL(longjmperror)
nop
jal _C_LABEL(abort)
/*
* We know we aren't returning so we don't care about restoring
* our caller's GP.
*/
PTR_LA t9, _C_LABEL(longjmperror)
jalr t9
nop
PIC_TAILCALL(abort)
END(_longjmp)

View File

@ -41,6 +41,8 @@ __FBSDID("$FreeBSD$");
ASMSTR("$NetBSD: setjmp.S,v 1.17 2005/09/17 11:49:39 tsutsui Exp $")
#endif /* LIBC_SCCS and not lint */
#include "SYS.h"
#ifdef __ABICALLS__
.abicalls
#endif
@ -61,100 +63,102 @@ __FBSDID("$FreeBSD$");
NESTED(setjmp, SETJMP_FRAME_SIZE, ra)
.mask 0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
.set noreorder
#ifdef __ABICALLS__
.cpload t9
#endif
subu sp, sp, SETJMP_FRAME_SIZE # allocate stack frame
#ifdef __ABICALLS__
.cprestore 16
#endif
sw ra, CALLFRAME_RA(sp) # save RA
sw a0, CALLFRAME_SIZ(sp) # store env
SETUP_GP
PTR_SUBU sp, sp, SETJMP_FRAME_SIZE # allocate stack frame
SAVE_GP(CALLFRAME_GP)
SETUP_GP64(CALLFRAME_GP, setjmp)
REG_S ra, CALLFRAME_RA(sp) # save RA
REG_S a0, CALLFRAME_SIZ(sp) # store env
/* Get the signal mask. */
addu a2, a0, _JB_SIGMASK * SZREG # &oenv
PTR_ADDU a2, a0, _JB_SIGMASK * SZREG # &oenv
li a0, 1 # SIG_SETBLOCK
move a1, zero # &env == 0
la t9, _C_LABEL(sigprocmask) # get current signal mask
jal t9
nop
PTR_LA t9, _C_LABEL(sigprocmask) # get current signal mask
jalr t9
lw a0, CALLFRAME_SIZ(sp) # restore env pointer
lw ra, CALLFRAME_RA(sp) # restore RA
addu sp, sp, SETJMP_FRAME_SIZE # pop stack frame
RESTORE_GP64
REG_L a0, CALLFRAME_SIZ(sp) # restore env pointer
REG_L ra, CALLFRAME_RA(sp) # restore RA
PTR_ADDU sp, sp, SETJMP_FRAME_SIZE # pop stack frame
li v0, _JB_MAGIC_SETJMP
sw v0, (_JB_MAGIC * SZREG)(a0)
sw ra, (_JB_REG_RA * SZREG)(a0)
sw s0, (_JB_REG_S0 * SZREG)(a0)
sw s1, (_JB_REG_S1 * SZREG)(a0)
sw s2, (_JB_REG_S2 * SZREG)(a0)
sw s3, (_JB_REG_S3 * SZREG)(a0)
sw s4, (_JB_REG_S4 * SZREG)(a0)
sw s5, (_JB_REG_S5 * SZREG)(a0)
sw s6, (_JB_REG_S6 * SZREG)(a0)
sw s7, (_JB_REG_S7 * SZREG)(a0)
sw sp, (_JB_REG_SP * SZREG)(a0)
sw s8, (_JB_REG_S8 * SZREG)(a0)
REG_LI v0, _JB_MAGIC_SETJMP
REG_S v0, (_JB_MAGIC * SZREG)(a0)
REG_S ra, (_JB_REG_RA * SZREG)(a0)
REG_S s0, (_JB_REG_S0 * SZREG)(a0)
REG_S s1, (_JB_REG_S1 * SZREG)(a0)
REG_S s2, (_JB_REG_S2 * SZREG)(a0)
REG_S s3, (_JB_REG_S3 * SZREG)(a0)
REG_S s4, (_JB_REG_S4 * SZREG)(a0)
REG_S s5, (_JB_REG_S5 * SZREG)(a0)
REG_S s6, (_JB_REG_S6 * SZREG)(a0)
REG_S s7, (_JB_REG_S7 * SZREG)(a0)
REG_S sp, (_JB_REG_SP * SZREG)(a0)
REG_S s8, (_JB_REG_S8 * SZREG)(a0)
#if defined(__mips_n32) || defined(__mips_n64)
REG_S gp, (_JB_REG_GP * SZREG)(a0)
#endif
move v0, zero
j ra
jr ra
END(setjmp)
#define LONGJMP_FRAME_SIZE (CALLFRAME_SIZ + (SZREG * 2))
NESTED(longjmp, LONGJMP_FRAME_SIZE, ra)
.mask 0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
.set noreorder
#ifdef __ABICALLS__
.cpload t9
#endif
subu sp, sp, LONGJMP_FRAME_SIZE # allocate stack frame
#ifdef __ABICALLS__
.cprestore 16
#endif
sw ra, CALLFRAME_RA(sp) # save RA
lw v0, (_JB_MAGIC * SZREG)(a0)
li t0, _JB_MAGIC_SETJMP
PIC_PROLOGUE(longjmp)
PTR_SUBU sp, sp, LONGJMP_FRAME_SIZE # allocate stack frame
SAVE_GP(CALLFRAME_GP)
REG_S ra, CALLFRAME_RA(sp) # save RA
REG_L v0, (_JB_MAGIC * SZREG)(a0)
REG_LI t0, _JB_MAGIC_SETJMP
bne v0, t0, botch # jump if error
nop
sw a0, CALLFRAME_SIZ(sp) # save env
sw a1, (CALLFRAME_SIZ + SZREG)(sp) # save return value
REG_S a0, CALLFRAME_SIZ(sp) # save env
REG_S a1, (CALLFRAME_SIZ + SZREG)(sp) # save return value
# set sigmask
addu a1, a0, _JB_SIGMASK * SZREG # &set
PTR_ADDU a1, a0, _JB_SIGMASK * SZREG # &set
move a2, zero # &oset == NULL
li a0, 3 # SIG_SETMASK
la t9,_C_LABEL(sigprocmask) # set current signal mask
PTR_LA t9,_C_LABEL(sigprocmask) # set current signal mask
jal t9
nop
lw a0, CALLFRAME_SIZ(sp) # restore env
lw a1, (CALLFRAME_SIZ + SZREG)(sp) # restore return value
REG_L a0, CALLFRAME_SIZ(sp) # restore env
REG_L a1, (CALLFRAME_SIZ + SZREG)(sp) # restore return value
REG_L ra, (_JB_REG_RA * SZREG)(a0)
REG_L s0, (_JB_REG_S0 * SZREG)(a0)
REG_L s1, (_JB_REG_S1 * SZREG)(a0)
REG_L s2, (_JB_REG_S2 * SZREG)(a0)
REG_L s3, (_JB_REG_S3 * SZREG)(a0)
REG_L s4, (_JB_REG_S4 * SZREG)(a0)
REG_L s5, (_JB_REG_S5 * SZREG)(a0)
REG_L s6, (_JB_REG_S6 * SZREG)(a0)
REG_L s7, (_JB_REG_S7 * SZREG)(a0)
REG_L sp, (_JB_REG_SP * SZREG)(a0)
REG_L s8, (_JB_REG_S8 * SZREG)(a0)
#if defined(__mips_n32) || defined(__mips_n64)
REG_L gp, (_JB_REG_GP * SZREG)(a0)
#endif
lw ra, (_JB_REG_RA * SZREG)(a0)
lw s0, (_JB_REG_S0 * SZREG)(a0)
lw s1, (_JB_REG_S1 * SZREG)(a0)
lw s2, (_JB_REG_S2 * SZREG)(a0)
lw s3, (_JB_REG_S3 * SZREG)(a0)
lw s4, (_JB_REG_S4 * SZREG)(a0)
lw s5, (_JB_REG_S5 * SZREG)(a0)
lw s6, (_JB_REG_S6 * SZREG)(a0)
lw s7, (_JB_REG_S7 * SZREG)(a0)
lw sp, (_JB_REG_SP * SZREG)(a0)
lw s8, (_JB_REG_S8 * SZREG)(a0)
move v0, a1
j ra
nop
botch:
la t9, _C_LABEL(longjmperror)
jal t9
/*
* We know we aren't returning so we don't care about restoring
* our caller's GP.
*/
PTR_LA t9, _C_LABEL(longjmperror)
jalr t9
nop
la t9, _C_LABEL(abort)
jal t9
nop
PIC_TAILCALL(abort)
END(longjmp)

View File

@ -40,6 +40,8 @@ __FBSDID("$FreeBSD$");
ASMSTR("$NetBSD: sigsetjmp.S,v 1.8 2005/09/17 11:49:39 tsutsui Exp $")
#endif /* LIBC_SCCS and not lint */
#include "SYS.h"
#ifdef __ABICALLS__
.abicalls
#endif
@ -57,30 +59,19 @@ __FBSDID("$FreeBSD$");
*/
LEAF(sigsetjmp)
#ifdef __ABICALLS__
.set noreorder
.cpload t9
.set reorder
#endif
bne a1, 0x0, 1f # do saving of signal mask?
la t9, _setjmp
jr t9
PIC_PROLOGUE(sigsetjmp)
1: la t9, setjmp
jr t9
bne a1, 0x0, 1f # do saving of signal mask?
PIC_TAILCALL(_setjmp)
1: PIC_TAILCALL(setjmp)
END(sigsetjmp)
LEAF(siglongjmp)
#ifdef __ABICALLS__
.set noreorder
.cpload t9
.set reorder
#endif
lw t0, (_JB_MAGIC * SZREG)(a0)
li t1, _JB_MAGIC__SETJMP
PIC_PROLOGUE(siglongjmp)
REG_L t0, (_JB_MAGIC * SZREG)(a0)
REG_LI t1, _JB_MAGIC__SETJMP
bne t0, t1, 1f # setjmp or _setjmp magic?
la t9, _longjmp
jr t9
1: la t9, longjmp
jr t9
PIC_TAILCALL(_longjmp)
1: PIC_TAILCALL(longjmp)
END(siglongjmp)

View File

@ -1,4 +1,4 @@
/* $NetBSD: bcmp.S,v 1.8 2003/08/07 16:42:16 agc Exp $ */
/* $NetBSD: bcmp.S,v 1.9 2009/12/14 01:07:42 matt Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -35,9 +35,15 @@
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
#define _LOCORE /* XXX not really, just assembly-code source */
#include <machine/endian.h> /* LWLO/LWHI, SWLO/SWHI */
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
ASMSTR("from: @(#)bcmp.s 8.1 (Berkeley) 6/4/93")
ASMSTR("$NetBSD: bcmp.S,v 1.8 2003/08/07 16:42:16 agc Exp $")
#else
ASMSTR("$NetBSD: bcmp.S,v 1.9 2009/12/14 01:07:42 matt Exp $")
#endif
#endif /* LIBC_SCCS and not lint */
#ifdef __ABICALLS__
@ -49,86 +55,76 @@ __FBSDID("$FreeBSD$");
LEAF(bcmp)
.set noreorder
blt a2, 16, small # is it worth any trouble?
xor v0, a0, a1 # compare low two bits of addresses
and v0, v0, 3
subu a3, zero, a1 # compute # bytes to word align address
bne v0, zero, unaligned # not possible to align addresses
and a3, a3, 3
blt a2, 16, small # is it worth any trouble?
xor v0, a0, a1 # compare low two bits of addresses
and v0, v0, 3
PTR_SUBU a3, zero, a1 # compute # bytes to word align address
bne v0, zero, unaligned # not possible to align addresses
and a3, a3, 3
beq a3, zero, 1f
subu a2, a2, a3 # subtract from remaining count
move v0, v1 # init v0,v1 so unmodified bytes match
#ifdef __MIPSEB__
lwl v0, 0(a0) # read 1, 2, or 3 bytes
lwl v1, 0(a1)
#else
lwr v0, 0(a0) # read 1, 2, or 3 bytes
lwr v1, 0(a1)
#endif
addu a1, a1, a3
bne v0, v1, nomatch
addu a0, a0, a3
beq a3, zero, 1f
PTR_SUBU a2, a2, a3 # subtract from remaining count
move v0, v1 # init v0,v1 so unmodified bytes match
LWHI v0, 0(a0) # read 1, 2, or 3 bytes
LWHI v1, 0(a1)
PTR_ADDU a1, a1, a3
bne v0, v1, nomatch
PTR_ADDU a0, a0, a3
1:
and a3, a2, ~3 # compute number of whole words left
subu a2, a2, a3 # which has to be >= (16-3) & ~3
addu a3, a3, a0 # compute ending address
and a3, a2, ~3 # compute number of whole words left
PTR_SUBU a2, a2, a3 # which has to be >= (16-3) & ~3
PTR_ADDU a3, a3, a0 # compute ending address
2:
lw v0, 0(a0) # compare words
lw v1, 0(a1)
addu a0, a0, 4
bne v0, v1, nomatch
addu a1, a1, 4
bne a0, a3, 2b
lw v0, 0(a0) # compare words
lw v1, 0(a1)
PTR_ADDU a0, a0, 4
bne v0, v1, nomatch
PTR_ADDU a1, a1, 4
bne a0, a3, 2b
nop
b small # finish remainder
b small # finish remainder
nop
unaligned:
beq a3, zero, 2f
subu a2, a2, a3 # subtract from remaining count
addu a3, a3, a0 # compute ending address
beq a3, zero, 2f
PTR_SUBU a2, a2, a3 # subtract from remaining count
PTR_ADDU a3, a3, a0 # compute ending address
1:
lbu v0, 0(a0) # compare bytes until a1 word aligned
lbu v1, 0(a1)
addu a0, a0, 1
bne v0, v1, nomatch
addu a1, a1, 1
bne a0, a3, 1b
lbu v0, 0(a0) # compare bytes until a1 word aligned
lbu v1, 0(a1)
PTR_ADDU a0, a0, 1
bne v0, v1, nomatch
PTR_ADDU a1, a1, 1
bne a0, a3, 1b
nop
2:
and a3, a2, ~3 # compute number of whole words left
subu a2, a2, a3 # which has to be >= (16-3) & ~3
addu a3, a3, a0 # compute ending address
and a3, a2, ~3 # compute number of whole words left
PTR_SUBU a2, a2, a3 # which has to be >= (16-3) & ~3
PTR_ADDU a3, a3, a0 # compute ending address
3:
#ifdef __MIPSEB__
lwl v0, 0(a0) # compare words a0 unaligned, a1 aligned
lwr v0, 3(a0)
#else
lwr v0, 0(a0) # compare words a0 unaligned, a1 aligned
lwl v0, 3(a0)
#endif
lw v1, 0(a1)
addu a0, a0, 4
bne v0, v1, nomatch
addu a1, a1, 4
bne a0, a3, 3b
LWHI v0, 0(a0) # compare words a0 unaligned, a1 aligned
LWLO v0, 3(a0)
lw v1, 0(a1)
PTR_ADDU a0, a0, 4
bne v0, v1, nomatch
PTR_ADDU a1, a1, 4
bne a0, a3, 3b
nop
small:
ble a2, zero, match
addu a3, a2, a0 # compute ending address
ble a2, zero, match
PTR_ADDU a3, a2, a0 # compute ending address
1:
lbu v0, 0(a0)
lbu v1, 0(a1)
addu a0, a0, 1
bne v0, v1, nomatch
addu a1, a1, 1
bne a0, a3, 1b
lbu v0, 0(a0)
lbu v1, 0(a1)
PTR_ADDU a0, a0, 1
bne v0, v1, nomatch
PTR_ADDU a1, a1, 1
bne a0, a3, 1b
nop
match:
j ra
move v0, zero
j ra
move v0, zero
nomatch:
j ra
li v0, 1
j ra
li v0, 1
.set reorder
END(bcmp)

View File

@ -1,4 +1,4 @@
/* $NetBSD: bcopy.S,v 1.2 2005/12/27 11:23:53 tsutsui Exp $ */
/* $NetBSD: bcopy.S,v 1.3 2009/12/14 00:39:00 matt Exp $ */
/*
* Mach Operating System
@ -38,9 +38,15 @@
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
#define _LOCORE /* XXX not really, just assembly-code source */
#include <machine/endian.h>
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
ASMSTR("from: @(#)mips_bcopy.s 2.2 CMU 18/06/93")
ASMSTR("$NetBSD: bcopy.S,v 1.2 2005/12/27 11:23:53 tsutsui Exp $")
#else
ASMSTR("$NetBSD: bcopy.S,v 1.3 2009/12/14 00:39:00 matt Exp $")
#endif
#endif /* LIBC_SCCS and not lint */
#ifdef __ABICALLS__
@ -99,71 +105,72 @@ LEAF(FUNCTION)
* copy is alignable. eg if src and dest are both
* on a halfword boundary.
*/
andi t1,DSTREG,3 # get last 3 bits of dest
bne t1,zero,3f
andi t0,SRCREG,3 # get last 3 bits of src
bne t0,zero,5f
andi t1,DSTREG,(SZREG-1) # get last bits of dest
bne t1,zero,3f # dest unaligned
andi t0,SRCREG,(SZREG-1) # get last bits of src
bne t0,zero,5f
/*
* Forward aligned->aligned copy, 8*4 bytes at a time.
* Forward aligned->aligned copy, 8 words at a time.
*/
li AT,-32
and t0,SIZEREG,AT # count truncated to multiple of 32 */
addu a3,SRCREG,t0 # run fast loop up to this address
sltu AT,SRCREG,a3 # any work to do?
beq AT,zero,2f
subu SIZEREG,t0
98:
li AT,-(SZREG*8)
and t0,SIZEREG,AT # count truncated to multiples
PTR_ADDU a3,SRCREG,t0 # run fast loop up to this addr
sltu AT,SRCREG,a3 # any work to do?
beq AT,zero,2f
PTR_SUBU SIZEREG,t0
/*
* loop body
*/
1: # cp
lw t3,0(SRCREG)
lw v1,4(SRCREG)
lw t0,8(SRCREG)
lw t1,12(SRCREG)
addu SRCREG,32
sw t3,0(DSTREG)
sw v1,4(DSTREG)
sw t0,8(DSTREG)
sw t1,12(DSTREG)
lw t1,-4(SRCREG)
lw t0,-8(SRCREG)
lw v1,-12(SRCREG)
lw t3,-16(SRCREG)
addu DSTREG,32
sw t1,-4(DSTREG)
sw t0,-8(DSTREG)
sw v1,-12(DSTREG)
bne SRCREG,a3,1b
sw t3,-16(DSTREG)
REG_L t3,(0*SZREG)(SRCREG)
REG_L v1,(1*SZREG)(SRCREG)
REG_L t0,(2*SZREG)(SRCREG)
REG_L t1,(3*SZREG)(SRCREG)
PTR_ADDU SRCREG,SZREG*8
REG_S t3,(0*SZREG)(DSTREG)
REG_S v1,(1*SZREG)(DSTREG)
REG_S t0,(2*SZREG)(DSTREG)
REG_S t1,(3*SZREG)(DSTREG)
REG_L t1,(-1*SZREG)(SRCREG)
REG_L t0,(-2*SZREG)(SRCREG)
REG_L v1,(-3*SZREG)(SRCREG)
REG_L t3,(-4*SZREG)(SRCREG)
PTR_ADDU DSTREG,SZREG*8
REG_S t1,(-1*SZREG)(DSTREG)
REG_S t0,(-2*SZREG)(DSTREG)
REG_S v1,(-3*SZREG)(DSTREG)
bne SRCREG,a3,1b
REG_S t3,(-4*SZREG)(DSTREG)
/*
* Copy a word at a time, no loop unrolling.
*/
2: # wordcopy
andi t2,SIZEREG,3 # get byte count / 4
subu t2,SIZEREG,t2 # t2 = number of words to copy * 4
beq t2,zero,3f
addu t0,SRCREG,t2 # stop at t0
subu SIZEREG,SIZEREG,t2
andi t2,SIZEREG,(SZREG-1) # get byte count / SZREG
PTR_SUBU t2,SIZEREG,t2 # t2 = words to copy * SZREG
beq t2,zero,3f
PTR_ADDU t0,SRCREG,t2 # stop at t0
PTR_SUBU SIZEREG,SIZEREG,t2
1:
lw t3,0(SRCREG)
addu SRCREG,4
sw t3,0(DSTREG)
bne SRCREG,t0,1b
addu DSTREG,4
REG_L t3,0(SRCREG)
PTR_ADDU SRCREG,SZREG
REG_S t3,0(DSTREG)
bne SRCREG,t0,1b
PTR_ADDU DSTREG,SZREG
3: # bytecopy
beq SIZEREG,zero,4f # nothing left to do?
beq SIZEREG,zero,4f # nothing left to do?
nop
1:
lb t3,0(SRCREG)
addu SRCREG,1
sb t3,0(DSTREG)
subu SIZEREG,1
bgtz SIZEREG,1b
addu DSTREG,1
lb t3,0(SRCREG)
PTR_ADDU SRCREG,1
sb t3,0(DSTREG)
PTR_SUBU SIZEREG,1
bgtz SIZEREG,1b
PTR_ADDU DSTREG,1
4: # copydone
j ra
@ -173,96 +180,91 @@ LEAF(FUNCTION)
* Copy from unaligned source to aligned dest.
*/
5: # destaligned
andi t0,SIZEREG,3 # t0 = bytecount mod 4
subu a3,SIZEREG,t0 # number of words to transfer
beq a3,zero,3b
andi t0,SIZEREG,(SZREG-1) # t0 = bytecount mod SZREG
PTR_SUBU a3,SIZEREG,t0 # number of words to transfer
beq a3,zero,3b
nop
move SIZEREG,t0 # this many to do after we are done
addu a3,SRCREG,a3 # stop point
move SIZEREG,t0 # this many to do after we are done
PTR_ADDU a3,SRCREG,a3 # stop point
1:
#ifdef __MIPSEB__
lwl t3,0(SRCREG)
lwr t3,3(SRCREG)
#else
lwr t3,0(SRCREG)
lwl t3,3(SRCREG)
#endif
addi SRCREG,4
sw t3,0(DSTREG)
bne SRCREG,a3,1b
addi DSTREG,4
REG_LHI t3,0(SRCREG)
REG_LLO t3,SZREG-1(SRCREG)
PTR_ADDI SRCREG,SZREG
REG_S t3,0(DSTREG)
bne SRCREG,a3,1b
PTR_ADDI DSTREG,SZREG
j 3b
b 3b
nop
6: # backcopy -- based on above
addu SRCREG,SIZEREG
addu DSTREG,SIZEREG
andi t1,DSTREG,3 # get last 3 bits of dest
bne t1,zero,3f
andi t0,SRCREG,3 # get last 3 bits of src
bne t0,zero,5f
PTR_ADDU SRCREG,SIZEREG
PTR_ADDU DSTREG,SIZEREG
andi t1,DSTREG,SZREG-1 # get last 3 bits of dest
bne t1,zero,3f
andi t0,SRCREG,SZREG-1 # get last 3 bits of src
bne t0,zero,5f
/*
* Forward aligned->aligned copy, 8*4 bytes at a time.
*/
li AT,-32
and t0,SIZEREG,AT # count truncated to multiple of 32
beq t0,zero,2f # any work to do?
subu SIZEREG,t0
subu a3,SRCREG,t0
li AT,(-8*SZREG)
and t0,SIZEREG,AT # count truncated to multiple of 32
beq t0,zero,2f # any work to do?
PTR_SUBU SIZEREG,t0
PTR_SUBU a3,SRCREG,t0
/*
* loop body
*/
1: # cp
lw t3,-16(SRCREG)
lw v1,-12(SRCREG)
lw t0,-8(SRCREG)
lw t1,-4(SRCREG)
subu SRCREG,32
sw t3,-16(DSTREG)
sw v1,-12(DSTREG)
sw t0,-8(DSTREG)
sw t1,-4(DSTREG)
lw t1,12(SRCREG)
lw t0,8(SRCREG)
lw v1,4(SRCREG)
lw t3,0(SRCREG)
subu DSTREG,32
sw t1,12(DSTREG)
sw t0,8(DSTREG)
sw v1,4(DSTREG)
bne SRCREG,a3,1b
sw t3,0(DSTREG)
REG_L t3,(-4*SZREG)(SRCREG)
REG_L v1,(-3*SZREG)(SRCREG)
REG_L t0,(-2*SZREG)(SRCREG)
REG_L t1,(-1*SZREG)(SRCREG)
PTR_SUBU SRCREG,8*SZREG
REG_S t3,(-4*SZREG)(DSTREG)
REG_S v1,(-3*SZREG)(DSTREG)
REG_S t0,(-2*SZREG)(DSTREG)
REG_S t1,(-1*SZREG)(DSTREG)
REG_L t1,(3*SZREG)(SRCREG)
REG_L t0,(2*SZREG)(SRCREG)
REG_L v1,(1*SZREG)(SRCREG)
REG_L t3,(0*SZREG)(SRCREG)
PTR_SUBU DSTREG,8*SZREG
REG_S t1,(3*SZREG)(DSTREG)
REG_S t0,(2*SZREG)(DSTREG)
REG_S v1,(1*SZREG)(DSTREG)
bne SRCREG,a3,1b
REG_S t3,(0*SZREG)(DSTREG)
/*
* Copy a word at a time, no loop unrolling.
*/
2: # wordcopy
andi t2,SIZEREG,3 # get byte count / 4
subu t2,SIZEREG,t2 # t2 = number of words to copy * 4
beq t2,zero,3f
subu t0,SRCREG,t2 # stop at t0
subu SIZEREG,SIZEREG,t2
andi t2,SIZEREG,SZREG-1 # get byte count / 4
PTR_SUBU t2,SIZEREG,t2 # t2 = number of words to copy
beq t2,zero,3f
PTR_SUBU t0,SRCREG,t2 # stop at t0
PTR_SUBU SIZEREG,SIZEREG,t2
1:
lw t3,-4(SRCREG)
subu SRCREG,4
sw t3,-4(DSTREG)
bne SRCREG,t0,1b
subu DSTREG,4
REG_L t3,-SZREG(SRCREG)
PTR_SUBU SRCREG,SZREG
REG_S t3,-SZREG(DSTREG)
bne SRCREG,t0,1b
PTR_SUBU DSTREG,SZREG
3: # bytecopy
beq SIZEREG,zero,4f # nothing left to do?
beq SIZEREG,zero,4f # nothing left to do?
nop
1:
lb t3,-1(SRCREG)
subu SRCREG,1
sb t3,-1(DSTREG)
subu SIZEREG,1
bgtz SIZEREG,1b
subu DSTREG,1
lb t3,-1(SRCREG)
PTR_SUBU SRCREG,1
sb t3,-1(DSTREG)
PTR_SUBU SIZEREG,1
bgtz SIZEREG,1b
PTR_SUBU DSTREG,1
4: # copydone
j ra
@ -272,27 +274,22 @@ LEAF(FUNCTION)
* Copy from unaligned source to aligned dest.
*/
5: # destaligned
andi t0,SIZEREG,3 # t0 = bytecount mod 4
subu a3,SIZEREG,t0 # number of words to transfer
beq a3,zero,3b
andi t0,SIZEREG,SZREG-1 # t0 = bytecount mod 4
PTR_SUBU a3,SIZEREG,t0 # number of words to transfer
beq a3,zero,3b
nop
move SIZEREG,t0 # this many to do after we are done
subu a3,SRCREG,a3 # stop point
move SIZEREG,t0 # this many to do after we are done
PTR_SUBU a3,SRCREG,a3 # stop point
1:
#ifdef __MIPSEB__
lwl t3,-4(SRCREG)
lwr t3,-1(SRCREG)
#else
lwr t3,-4(SRCREG)
lwl t3,-1(SRCREG)
#endif
subu SRCREG,4
sw t3,-4(DSTREG)
bne SRCREG,a3,1b
subu DSTREG,4
REG_LHI t3,-SZREG(SRCREG)
REG_LLO t3,-1(SRCREG)
PTR_SUBU SRCREG,SZREG
REG_S t3,-SZREG(DSTREG)
bne SRCREG,a3,1b
PTR_SUBU DSTREG,SZREG
j 3b
b 3b
nop
.set reorder

View File

@ -1,4 +1,4 @@
/* $NetBSD: bzero.S,v 1.8 2003/08/07 16:42:16 agc Exp $ */
/* $NetBSD: bzero.S,v 1.10 2009/12/14 02:53:52 matt Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -36,10 +36,15 @@
__FBSDID("$FreeBSD$");
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
ASMSTR("from: @(#)bzero.s 8.1 (Berkeley) 6/4/93")
ASMSTR("$NetBSD: bzero.S,v 1.8 2003/08/07 16:42:16 agc Exp $")
#else
ASMSTR("$NetBSD: bzero.S,v 1.10 2009/12/14 02:53:52 matt Exp $")
#endif
#endif /* LIBC_SCCS and not lint */
#define _LOCORE /* XXX not really, just assembly-code source */
#include <machine/endian.h>
#ifdef __ABICALLS__
.abicalls
@ -49,34 +54,48 @@ __FBSDID("$FreeBSD$");
LEAF(bzero)
.set noreorder
blt a1, 12, smallclr # small amount to clear?
subu a3, zero, a0 # compute # bytes to word align address
and a3, a3, 3
beq a3, zero, 1f # skip if word aligned
subu a1, a1, a3 # subtract from remaining count
#ifdef __MIPSEB__
swl zero, 0(a0) # clear 1, 2, or 3 bytes to align
#else
swr zero, 0(a0) # clear 1, 2, or 3 bytes to align
blt a1, 3*SZREG, smallclr # small amount to clear?
PTR_SUBU a3, zero, a0 # compute # bytes to word align address
and a3, a3, SZREG-1
beq a3, zero, 1f # skip if word aligned
#if SZREG == 4
PTR_SUBU a1, a1, a3 # subtract from remaining count
SWHI zero, 0(a0) # clear 1, 2, or 3 bytes to align
PTR_ADDU a0, a0, a3
#endif
#if SZREG == 8
PTR_SUBU a1, a1, a3 # subtract from remaining count
PTR_ADDU a0, a0, a3 # align dst to next word
sll a3, a3, 3 # bits to bytes
li a2, -1 # make a mask
#if _BYTE_ORDER == _BIG_ENDIAN
REG_SRLV a2, a2, a3 # we want to keep the MSB bytes
#endif
#if _BYTE_ORDER == _LITTLE_ENDIAN
REG_SLLV a2, a2, a3 # we want to keep the LSB bytes
#endif
nor a2, zero, a2 # complement the mask
REG_L v0, -SZREG(a0) # load the word to partially clear
and v0, v0, a2 # clear the bytes
REG_S v0, -SZREG(a0) # store it back
#endif
addu a0, a0, a3
1:
and v0, a1, 3 # compute number of words left
subu a3, a1, v0
move a1, v0
addu a3, a3, a0 # compute ending address
and v0, a1, SZREG-1 # compute number of words left
PTR_SUBU a3, a1, v0
move a1, v0
PTR_ADDU a3, a3, a0 # compute ending address
2:
addu a0, a0, 4 # clear words
bne a0, a3, 2b # unrolling loop doesnt help
sw zero, -4(a0) # since we are limited by memory speed
PTR_ADDU a0, a0, SZREG # clear words
bne a0, a3, 2b # unrolling loop doesnt help
REG_S zero, -SZREG(a0) # since we are limited by memory speed
smallclr:
ble a1, zero, 2f
addu a3, a1, a0 # compute ending address
ble a1, zero, 2f
PTR_ADDU a3, a1, a0 # compute ending address
1:
addu a0, a0, 1 # clear bytes
bne a0, a3, 1b
sb zero, -1(a0)
PTR_ADDU a0, a0, 1 # clear bytes
bne a0, a3, 1b
sb zero, -1(a0)
2:
j ra
j ra
nop
END(bzero)

View File

@ -1,4 +1,4 @@
/* $NetBSD: ffs.S,v 1.1 2005/12/20 19:28:49 christos Exp $ */
/* $NetBSD: ffs.S,v 1.2 2009/12/14 00:39:00 matt Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -37,7 +37,7 @@ __FBSDID("$FreeBSD$");
#if defined(LIBC_SCCS) && !defined(lint)
ASMSTR("from: @(#)ffs.s 8.1 (Berkeley) 6/4/93")
ASMSTR("$NetBSD: ffs.S,v 1.1 2005/12/20 19:28:49 christos Exp $")
ASMSTR("$NetBSD: ffs.S,v 1.2 2009/12/14 00:39:00 matt Exp $")
#endif /* LIBC_SCCS and not lint */
#ifdef __ABICALLS__

View File

@ -46,14 +46,14 @@ __FBSDID("$FreeBSD$");
LEAF(index)
1:
lbu a2, 0(a0) # get a byte
addu a0, a0, 1
beq a2, a1, fnd
bne a2, zero, 1b
lbu a2, 0(a0) # get a byte
PTR_ADDU a0, a0, 1
beq a2, a1, fnd
bne a2, zero, 1b
notfnd:
move v0, zero
j ra
move v0, zero
j ra
fnd:
subu v0, a0, 1
j ra
PTR_SUBU v0, a0, 1
j ra
END(index)

View File

@ -45,13 +45,13 @@ __FBSDID("$FreeBSD$");
#endif
LEAF(rindex)
move v0, zero # default if not found
move v0, zero # default if not found
1:
lbu a3, 0(a0) # get a byte
addu a0, a0, 1
bne a3, a1, 2f
subu v0, a0, 1 # save address of last match
lbu a3, 0(a0) # get a byte
PTR_ADDU a0, a0, 1
bne a3, a1, 2f
PTR_SUBU v0, a0, 1 # save address of last match
2:
bne a3, zero, 1b # continue if not end
j ra
bne a3, zero, 1b # continue if not end
j ra
END(rindex)

View File

@ -1,4 +1,4 @@
/* $NetBSD: strcmp.S,v 1.1 2005/12/20 19:28:50 christos Exp $ */
/* $NetBSD: strcmp.S,v 1.2 2009/12/14 00:39:00 matt Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -37,7 +37,7 @@ __FBSDID("$FreeBSD$");
#if defined(LIBC_SCCS) && !defined(lint)
ASMSTR("from: @(#)strcmp.s 8.1 (Berkeley) 6/4/93")
ASMSTR("$NetBSD: strcmp.S,v 1.1 2005/12/20 19:28:50 christos Exp $")
ASMSTR("$NetBSD: strcmp.S,v 1.2 2009/12/14 00:39:00 matt Exp $")
#endif /* LIBC_SCCS and not lint */
#ifdef __ABICALLS__
@ -55,9 +55,9 @@ LEAF(strcmp)
bne t0, t1, NotEq
lbu t0, 1(a0) # unroll loop
lbu t1, 1(a1)
add a0, a0, 2
PTR_ADD a0, a0, 2
beq t0, zero, LessOrEq # end of first string?
add a1, a1, 2
PTR_ADD a1, a1, 2
beq t0, t1, 1b
NotEq:
subu v0, t0, t1

View File

@ -1,4 +1,4 @@
/* $NetBSD: strlen.S,v 1.1 2005/12/20 19:28:50 christos Exp $ */
/* $NetBSD: strlen.S,v 1.2 2009/12/14 00:39:00 matt Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -37,7 +37,7 @@ __FBSDID("$FreeBSD$");
#if defined(LIBC_SCCS) && !defined(lint)
ASMSTR("from: @(#)strlen.s 8.1 (Berkeley) 6/4/93")
ASMSTR("$NetBSD: strlen.S,v 1.1 2005/12/20 19:28:50 christos Exp $")
ASMSTR("$NetBSD: strlen.S,v 1.2 2009/12/14 00:39:00 matt Exp $")
#endif /* LIBC_SCCS and not lint */
#ifdef __ABICALLS__
@ -45,11 +45,11 @@ __FBSDID("$FreeBSD$");
#endif
LEAF(strlen)
addu v1, a0, 1
PTR_ADDU v1, a0, 1
1:
lb v0, 0(a0) # get byte from string
addu a0, a0, 1 # increment pointer
bne v0, zero, 1b # continue if not end
subu v0, a0, v1 # compute length - 1 for '\0' char
j ra
lb v0, 0(a0) # get byte from string
PTR_ADDU a0, a0, 1 # increment pointer
bne v0, zero, 1b # continue if not end
PTR_SUBU v0, a0, v1 # compute length - 1 for '\0' char
j ra
END(strlen)

View File

@ -49,21 +49,16 @@ __FBSDID("$FreeBSD$");
*/
LEAF(__sys_vfork)
#ifdef __ABICALLS__
.set noreorder
.cpload t9
.set reorder
#endif
WEAK_ALIAS(vfork, __sys_vfork)
WEAK_ALIAS(_vfork, __sys_vfork)
PIC_PROLOGUE(__sys_vfork)
li v0, SYS_vfork # system call number for vfork
syscall
beq a3, zero, 1f # jump if no errors
la t9, __cerror
jr t9
PIC_TAILCALL(__cerror)
1:
beq v1, zero, 2f # parent process ?
move v0, zero # return zero in child
2:
j ra
PIC_RETURN()
END(__sys_vfork)

View File

@ -49,25 +49,23 @@ __FBSDID("$FreeBSD$");
_C_LABEL(minbrk):
.word _C_LABEL(_end)
.text
LEAF(__sys_brk)
WEAK_ALIAS(brk, __sys_brk)
WEAK_ALIAS(_brk, __sys_brk)
#ifdef __ABICALLS__
.set noreorder
.cpload t9
.set reorder
#endif
lw v0, _C_LABEL(minbrk)
PIC_PROLOGUE(__sys_brk)
PTR_LA v0, _C_LABEL(minbrk)
PTR_L v0, 0(v0)
bgeu a0, v0, 1f
move a0, v0 # dont allow break < minbrk
1:
li v0, SYS_break
syscall
bne a3, zero, 2f
sw a0, _C_LABEL(__curbrk)
PTR_LA t0, _C_LABEL(__curbrk)
PTR_S a0, 0(t0)
move v0, zero
j ra
PIC_RETURN()
2:
la t9, _C_LABEL(__cerror)
jr t9
PIC_TAILCALL(__cerror)
END(__sys_brk)

View File

@ -1,4 +1,4 @@
/* $NetBSD: cerror.S,v 1.13 2003/08/07 16:42:17 agc Exp $ */
/* $NetBSD: cerror.S,v 1.14 2009/12/14 01:07:42 matt Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -37,35 +37,36 @@ __FBSDID("$FreeBSD$");
#include "SYS.h"
#if defined(LIBC_SCCS) && !defined(lint)
ASMSTR("from: @(#)cerror.s 8.1 (Berkeley) 6/16/93")
ASMSTR("$NetBSD: cerror.S,v 1.13 2003/08/07 16:42:17 agc Exp $")
#if 0
RCSID("from: @(#)cerror.s 8.1 (Berkeley) 6/16/93")
#else
RCSID("$NetBSD: cerror.S,v 1.14 2009/12/14 01:07:42 matt Exp $")
#endif
#endif /* LIBC_SCCS and not lint */
/*
* The __error() function is thread aware. For non-threaded
* programs and the initial threaded in threaded programs,
* it returns a pointer to the global errno variable.
*/
.globl _C_LABEL(__error)
.type _C_LABEL(__error),%function
LEAF(__cerror)
.frame sp, CALLFRAME_SIZ, ra
PIC_PROLOGUE(__cerror, t9)
subu sp, sp, CALLFRAME_SIZ
.globl _C_LABEL(__error)
NESTED_NOPROFILE(__cerror, CALLFRAME_SIZ, ra)
.mask 0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
sw ra, CALLFRAME_RA(sp)
sw v0, 12(sp) # save errno value
SETUP_GP
PTR_SUBU sp, sp, CALLFRAME_SIZ
SETUP_GP64(CALLFRAME_GP, __cerror)
SAVE_GP(CALLFRAME_GP)
la t9, _C_LABEL(__error) # locate address of errno
jalr t9
PTR_S ra, CALLFRAME_RA(sp)
REG_S v0, CALLFRAME_S0(sp) # save errno value
lw t0, 12(sp)
lw ra, CALLFRAME_RA(sp)
sw t0, 0(v0) # update errno value
addiu sp, sp, CALLFRAME_SIZ
li v0, -1
li v1, -1
j ra
PTR_LA t9, _C_LABEL(__error) # locate address of errno
jalr t9
REG_L t0, CALLFRAME_S0(sp)
PTR_L ra, CALLFRAME_RA(sp)
INT_S t0, 0(v0) # update errno value
RESTORE_GP64
PTR_ADDU sp, sp, CALLFRAME_SIZ
li v0, -1
li v1, -1
j ra
END(__cerror)

View File

@ -41,16 +41,11 @@ __FBSDID("$FreeBSD$");
#endif /* LIBC_SCCS and not lint */
LEAF(exect)
#ifdef __ABICALLS__
.set noreorder
.cpload t9
.set reorder
#endif
PIC_PROLOGUE(exect)
li v0, SYS_execve
syscall
bne a3, zero, 1f
j ra
PIC_RETURN()
1:
la t9, _C_LABEL(__cerror)
jr t9
PIC_TAILCALL(__cerror)
END(exect)

View File

@ -44,20 +44,14 @@ __FBSDID("$FreeBSD$");
LEAF(__sys_fork)
WEAK_ALIAS(fork, __sys_fork)
WEAK_ALIAS(_fork, __sys_fork)
#ifdef __ABICALLS__
.set noreorder
.cpload t9
.set reorder
#endif
fork = __sys_fork
PIC_PROLOGUE(__sys_fork)
li v0, SYS_fork # pid = fork()
syscall
bne a3, zero, 2f
beq v1, zero, 1f # v1 == 0 in parent, 1 in child
move v0, zero
1:
j ra
PIC_RETURN()
2:
la t9, _C_LABEL(__cerror)
jr t9
PIC_TAILCALL(__cerror)
END(__sys_fork)

View File

@ -44,19 +44,14 @@ __FBSDID("$FreeBSD$");
LEAF(__sys_pipe)
WEAK_ALIAS(pipe, __sys_pipe)
WEAK_ALIAS(_pipe, __sys_pipe)
#ifdef __ABICALLS__
.set noreorder
.cpload t9
.set reorder
#endif
PIC_PROLOGUE(__sys_pipe)
li v0, SYS_pipe # pipe(fildes) int fildes[2];
syscall
bne a3, zero, 1f
sw v0, 0(a0) # store the two file descriptors
sw v1, 4(a0)
move v0, zero
j ra
PIC_RETURN()
1:
la t9, _C_LABEL(__cerror)
jr t9
PIC_TAILCALL(__cerror)
END(__sys_pipe)

View File

@ -41,32 +41,31 @@ __FBSDID("$FreeBSD$");
ASMSTR("$NetBSD: ptrace.S,v 1.9 2003/08/07 16:42:17 agc Exp $")
#endif /* LIBC_SCCS and not lint */
LEAF(ptrace)
.frame sp, 40, ra
.mask 0x80000000, -8
#ifdef __ABICALLS__
.set noreorder
.cpload t9
.set reorder
#endif
subu sp, sp, 40
sw ra, 32(sp)
#ifdef __ABICALLS__
.cprestore 16
#endif
la t9, _C_LABEL(__error) # locate address of errno
jalr t9
#ifdef __ABICALLS__
lw gp, 16(sp)
#endif
sw zero, 0(v0)
lw ra, 32(sp)
addu sp, sp, 40
li v0, SYS_ptrace
NESTED_NOPROFILE(ptrace, CALLFRAME_SIZ, ra)
.mask 0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
SETUP_GP
PTR_SUBU sp, sp, CALLFRAME_SIZ
SETUP_GP64(CALLFRAME_GP, ptrace)
SAVE_GP(CALLFRAME_GP)
PTR_S ra, CALLFRAME_RA(sp)
PTR_LA t9, _C_LABEL(__error) # locate address of errno
jalr t9
PTR_L ra, CALLFRAME_RA(sp)
INT_S zero, 0(v0) # update errno value
li v0, SYS_ptrace
syscall
bne a3, zero, 1f
j ra
1:
la t9, _C_LABEL(__cerror)
jr t9
# Load __cerror's address using our gp, then restore it.
PTR_LA t9, __cerror
RESTORE_GP64
PTR_ADDU sp, sp, CALLFRAME_SIZ
bne a3, zero, 1f
j ra
1: j t9
END(ptrace)

View File

@ -52,34 +52,22 @@ _C_LABEL(__curbrk):
LEAF(__sys_sbrk)
WEAK_ALIAS(sbrk, __sys_sbrk)
WEAK_ALIAS(_sbrk, __sys_sbrk)
#ifdef __ABICALLS__
.set noreorder
.cpload t9
.set reorder
#endif
addu sp, sp, -16
sw s0, 0(sp) # Preserve s0 value in stack
# it should be the same on return
# We can't use v1 as temporary
# register since syscall uses it
# to return 64-bit values
lw s0, _C_LABEL(__curbrk)
li v0, SYS_break
addu a0, a0, s0 # compute current break
PIC_PROLOGUE(__sys_sbrk)
PTR_LA t0, _C_LABEL(__curbrk)
PTR_L t0, 0(t0)
PTR_ADDU a0, a0, t0
li v0, SYS_break
syscall
bne a3, zero, 1f
nop
move v0, s0 # return old val of curbrk from above
lw s0, 0(sp)
addu sp, sp, 16
sw a0, _C_LABEL(__curbrk) # save current val of curbrk from above
move v0, t0 # return old val of curbrk from above
PTR_LA t0, _C_LABEL(__curbrk)
PTR_S a0, 0(t0) # save current val of curbrk from above
PIC_RETURN()
j ra
1:
lw s0, 0(sp)
addu sp, sp, 16
la t9, _C_LABEL(__cerror)
jr t9
PIC_TAILCALL(__cerror)
END(__sys_sbrk)