summaryrefslogtreecommitdiff
path: root/lib/libc
diff options
context:
space:
mode:
authorJayachandran C. <jchandra@FreeBSD.org>2010-11-27 12:26:40 +0000
committerJayachandran C. <jchandra@FreeBSD.org>2010-11-27 12:26:40 +0000
commit43f6e368b0a5523c2727da0b0248172b488b758e (patch)
treefd7cffbdc745cef2675b66c7c0b61767483a2475 /lib/libc
parent30409a7564cd898dd84a0f5835cf3931705d01c0 (diff)
Notes
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/Makefile9
-rw-r--r--lib/libc/mips/Makefile.inc2
-rw-r--r--lib/libc/mips/SYS.h34
-rw-r--r--lib/libc/mips/Symbol.map26
-rw-r--r--lib/libc/mips/gen/Makefile.inc2
-rw-r--r--lib/libc/mips/gen/_ctx_start.S41
-rw-r--r--lib/libc/mips/gen/_setjmp.S113
-rw-r--r--lib/libc/mips/gen/hardfloat/fpgetmask.c (renamed from lib/libc/mips/gen/fpgetmask.c)0
-rw-r--r--lib/libc/mips/gen/hardfloat/fpgetround.c (renamed from lib/libc/mips/gen/fpgetround.c)0
-rw-r--r--lib/libc/mips/gen/hardfloat/fpgetsticky.c (renamed from lib/libc/mips/gen/fpgetsticky.c)0
-rw-r--r--lib/libc/mips/gen/hardfloat/fpsetmask.c (renamed from lib/libc/mips/gen/fpsetmask.c)0
-rw-r--r--lib/libc/mips/gen/hardfloat/fpsetround.c (renamed from lib/libc/mips/gen/fpsetround.c)0
-rw-r--r--lib/libc/mips/gen/hardfloat/fpsetsticky.c (renamed from lib/libc/mips/gen/fpsetsticky.c)0
-rw-r--r--lib/libc/mips/gen/makecontext.c99
-rw-r--r--lib/libc/mips/gen/setjmp.S138
-rw-r--r--lib/libc/mips/gen/sigsetjmp.S31
-rw-r--r--lib/libc/mips/string/bcmp.S130
-rw-r--r--lib/libc/mips/string/bcopy.S257
-rw-r--r--lib/libc/mips/string/bzero.S69
-rw-r--r--lib/libc/mips/string/ffs.S4
-rw-r--r--lib/libc/mips/string/index.S16
-rw-r--r--lib/libc/mips/string/rindex.S14
-rw-r--r--lib/libc/mips/string/strcmp.S8
-rw-r--r--lib/libc/mips/string/strlen.S16
-rw-r--r--lib/libc/mips/sys/Makefile.inc2
-rw-r--r--lib/libc/mips/sys/Ovfork.S11
-rw-r--r--lib/libc/mips/sys/brk.S25
-rw-r--r--lib/libc/mips/sys/cerror.S53
-rw-r--r--lib/libc/mips/sys/exect.S11
-rw-r--r--lib/libc/mips/sys/fork.S12
-rw-r--r--lib/libc/mips/sys/pipe.S11
-rw-r--r--lib/libc/mips/sys/ptrace.S41
-rw-r--r--lib/libc/mips/sys/sbrk.S34
33 files changed, 651 insertions, 558 deletions
diff --git a/lib/libc/Makefile b/lib/libc/Makefile
index b48d858de4f3..720c0f4145b9 100644
--- a/lib/libc/Makefile
+++ b/lib/libc/Makefile
@@ -51,7 +51,12 @@ NOASM=
.include "${.CURDIR}/posix1e/Makefile.inc"
.if ${MACHINE_ARCH} != "amd64" && \
${MACHINE_ARCH} != "ia64" && \
- ${MACHINE_ARCH} != "sparc64"
+ ${MACHINE_ARCH} != "sparc64" && \
+ ${MACHINE_ARCH} != "mips"
+.include "${.CURDIR}/quad/Makefile.inc"
+.endif
+.if ${MACHINE_ARCH} == "mips" && \
+ (!defined(TARGET_ABI) || ${TARGET_ABI} == "o32")
.include "${.CURDIR}/quad/Makefile.inc"
.endif
.include "${.CURDIR}/regex/Makefile.inc"
@@ -64,7 +69,7 @@ NOASM=
.include "${.CURDIR}/rpc/Makefile.inc"
.include "${.CURDIR}/uuid/Makefile.inc"
.include "${.CURDIR}/xdr/Makefile.inc"
-.if ${MACHINE_ARCH} == "arm"
+.if ${MACHINE_ARCH} == "arm" || ${MACHINE_ARCH} == "mips"
.include "${.CURDIR}/softfloat/Makefile.inc"
.endif
.if ${MK_NIS} != "no"
diff --git a/lib/libc/mips/Makefile.inc b/lib/libc/mips/Makefile.inc
index 2ae88d8910bb..a02ca01f22ff 100644
--- a/lib/libc/mips/Makefile.inc
+++ b/lib/libc/mips/Makefile.inc
@@ -1,8 +1,6 @@
# $NetBSD: Makefile.inc,v 1.7 2005/09/17 11:49:39 tsutsui Exp $
# $FreeBSD$
-SOFTFLOAT_BITS=32
-
CFLAGS+=-DSOFTFLOAT
MDSRCS+= machdep_ldisd.c
diff --git a/lib/libc/mips/SYS.h b/lib/libc/mips/SYS.h
index c4aad4457a1b..10205b8793a4 100644
--- a/lib/libc/mips/SYS.h
+++ b/lib/libc/mips/SYS.h
@@ -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() j ra
+#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)
diff --git a/lib/libc/mips/Symbol.map b/lib/libc/mips/Symbol.map
index 2bbdd6dd3442..b47855178755 100644
--- a/lib/libc/mips/Symbol.map
+++ b/lib/libc/mips/Symbol.map
@@ -24,13 +24,9 @@ FBSD_1.0 {
sigsetjmp;
siglongjmp;
htonl;
- __htonl;
htons;
- __htons;
ntohl;
- __ntohl;
ntohs;
- __ntohs;
vfork;
brk;
cerror; /* XXX - Should this be .cerror (see sys/cerror.S)? */
@@ -56,9 +52,27 @@ FBSDprivate_1.0 {
__siglongjmp;
__sys_vfork;
_vfork;
- end; /* XXX - Should this be _end (see sys/brk.S)? */
- curbrk;
+ _end;
+ __curbrk;
minbrk;
_brk;
_sbrk;
+
+ /* softfloat */
+ __addsf3;
+ __adddf3;
+ __subsf3;
+ __subdf3;
+ __mulsf3;
+ __muldf3;
+ __divsf3;
+ __divdf3;
+ __floatsisf;
+ __floatsidf;
+ __fixsfsi;
+ __fixdfsi;
+ __fixunssfsi;
+ __fixunsdfsi;
+ __extendsfdf2;
+ __truncdfsf2;
};
diff --git a/lib/libc/mips/gen/Makefile.inc b/lib/libc/mips/gen/Makefile.inc
index 2fa20b054637..1fafb012bdc3 100644
--- a/lib/libc/mips/gen/Makefile.inc
+++ b/lib/libc/mips/gen/Makefile.inc
@@ -6,4 +6,4 @@ SRCS+= infinity.c fabs.c ldexp.c modf.c
# SRCS+= flt_rounds.c fpgetmask.c fpgetround.c fpgetsticky.c fpsetmask.c \
# fpsetround.c fpsetsticky.c
-SRCS+= _set_tp.c _setjmp.S makecontext.c setjmp.S signalcontext.c sigsetjmp.S
+SRCS+= _ctx_start.S _set_tp.c _setjmp.S makecontext.c setjmp.S signalcontext.c sigsetjmp.S
diff --git a/lib/libc/mips/gen/_ctx_start.S b/lib/libc/mips/gen/_ctx_start.S
new file mode 100644
index 000000000000..5d754a9927d1
--- /dev/null
+++ b/lib/libc/mips/gen/_ctx_start.S
@@ -0,0 +1,41 @@
+/*-
+ * Copyright (c) 2010 Juli Mallett.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * XXX gp?
+ */
+ENTRY(_ctx_start)
+ jalr t9
+
+ move a0, s0
+ PTR_LA t9, _ctx_done
+ jalr t9
+
+ break 0
+END(_ctx_start)
diff --git a/lib/libc/mips/gen/_setjmp.S b/lib/libc/mips/gen/_setjmp.S
index 596c71200405..3918407038c6 100644
--- a/lib/libc/mips/gen/_setjmp.S
+++ b/lib/libc/mips/gen/_setjmp.S
@@ -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)
diff --git a/lib/libc/mips/gen/fpgetmask.c b/lib/libc/mips/gen/hardfloat/fpgetmask.c
index 505a74c68466..505a74c68466 100644
--- a/lib/libc/mips/gen/fpgetmask.c
+++ b/lib/libc/mips/gen/hardfloat/fpgetmask.c
diff --git a/lib/libc/mips/gen/fpgetround.c b/lib/libc/mips/gen/hardfloat/fpgetround.c
index 6d0f11a5cb6e..6d0f11a5cb6e 100644
--- a/lib/libc/mips/gen/fpgetround.c
+++ b/lib/libc/mips/gen/hardfloat/fpgetround.c
diff --git a/lib/libc/mips/gen/fpgetsticky.c b/lib/libc/mips/gen/hardfloat/fpgetsticky.c
index 8028261c2c81..8028261c2c81 100644
--- a/lib/libc/mips/gen/fpgetsticky.c
+++ b/lib/libc/mips/gen/hardfloat/fpgetsticky.c
diff --git a/lib/libc/mips/gen/fpsetmask.c b/lib/libc/mips/gen/hardfloat/fpsetmask.c
index 7abb3fd05f92..7abb3fd05f92 100644
--- a/lib/libc/mips/gen/fpsetmask.c
+++ b/lib/libc/mips/gen/hardfloat/fpsetmask.c
diff --git a/lib/libc/mips/gen/fpsetround.c b/lib/libc/mips/gen/hardfloat/fpsetround.c
index 020516180033..020516180033 100644
--- a/lib/libc/mips/gen/fpsetround.c
+++ b/lib/libc/mips/gen/hardfloat/fpsetround.c
diff --git a/lib/libc/mips/gen/fpsetsticky.c b/lib/libc/mips/gen/hardfloat/fpsetsticky.c
index e43367117792..e43367117792 100644
--- a/lib/libc/mips/gen/fpsetsticky.c
+++ b/lib/libc/mips/gen/hardfloat/fpsetsticky.c
diff --git a/lib/libc/mips/gen/makecontext.c b/lib/libc/mips/gen/makecontext.c
index 01d88bf2294a..f2a826e77bdd 100644
--- a/lib/libc/mips/gen/makecontext.c
+++ b/lib/libc/mips/gen/makecontext.c
@@ -1,4 +1,4 @@
-/* $NetBSD: makecontext.c,v 1.3 2003/01/19 08:53:36 matt Exp $ */
+/* $NetBSD: makecontext.c,v 1.5 2009/12/14 01:07:42 matt Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -15,13 +15,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -39,48 +32,92 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: makecontext.c,v 1.3 2003/01/19 08:53:36 matt Exp $");
+__RCSID("$NetBSD: makecontext.c,v 1.5 2009/12/14 01:07:42 matt Exp $");
#endif
-#include <sys/types.h>
-#include <ucontext.h>
+#include <sys/param.h>
+#include <machine/regnum.h>
+
#include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <ucontext.h>
+
+__weak_reference(__makecontext, makecontext);
+
+void _ctx_done(ucontext_t *);
+void _ctx_start(void);
void
-makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
+__makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
{
- /* XXXMIPS: Implement me */
-#if 0
- __greg_t *gr = ucp->uc_mcontext.__gregs;
- uintptr_t *sp;
+ mcontext_t *mc;
+ register_t *sp;
int i;
va_list ap;
- void __resumecontext(void);
+ /*
+ * XXX/juli
+ * We need an mc_len or mc_flags like other architectures
+ * so that we can mark a context as invalid. Store it in
+ * mc->mc_regs[ZERO] perhaps?
+ */
+ if (argc < 0 || argc > 6 || ucp == NULL ||
+ ucp->uc_stack.ss_sp == NULL ||
+ ucp->uc_stack.ss_size < MINSIGSTKSZ)
+ return;
+ mc = &ucp->uc_mcontext;
- /* LINTED uintptr_t is safe */
- sp = (uintptr_t *)
+ sp = (register_t *)
((uintptr_t)ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
- /* LINTED uintptr_t is safe */
+#if defined(__mips_o32) || defined(__mips_o64)
sp -= (argc >= 4 ? argc : 4); /* Make room for >=4 arguments. */
- sp = (uintptr_t *)
- ((uintptr_t)sp & ~0x7); /* Align on double-word boundary. */
+ sp = (register_t *)
+ ((uintptr_t)sp & ~0x7); /* Align on double-word boundary. */
+#elif defined(__mips_n32) || defined(__mips_n64)
+ sp -= (argc > 8 ? argc - 8 : 0); /* Make room for > 8 arguments. */
+ sp = (register_t *)
+ ((uintptr_t)sp & ~0xf); /* Align on quad-word boundary. */
+#endif
- gr[_REG_SP] = (__greg_t)sp;
- gr[_REG_RA] = (__greg_t)__resumecontext;
- gr[_REG_T9] = (__greg_t)func; /* required for .abicalls */
- gr[_REG_EPC] = (__greg_t)func;
+ mc->mc_regs[SP] = (intptr_t)sp;
+ mc->mc_regs[S0] = (intptr_t)ucp;
+ mc->mc_regs[T9] = (intptr_t)func;
+ mc->mc_pc = (intptr_t)_ctx_start;
/* Construct argument list. */
va_start(ap, argc);
+#if defined(__mips_o32) || defined(__mips_o64)
/* Up to the first four arguments are passed in $a0-3. */
for (i = 0; i < argc && i < 4; i++)
- /* LINTED uintptr_t is safe */
- gr[_REG_A0 + i] = va_arg(ap, uintptr_t);
+ /* LINTED register_t is safe */
+ mc->mc_regs[A0 + i] = va_arg(ap, register_t);
+ /* Pass remaining arguments on the stack above the $a0-3 gap. */
+ sp += i;
+#endif
+#if defined(__mips_n32) || defined(__mips_n64)
+ /* Up to the first 8 arguments are passed in $a0-7. */
+ for (i = 0; i < argc && i < 8; i++)
+ /* LINTED register_t is safe */
+ mc->mc_regs[A0 + i] = va_arg(ap, register_t);
/* Pass remaining arguments on the stack above the $a0-3 gap. */
- for (sp += 4; i < argc; i++)
+#endif
+ /* Pass remaining arguments on the stack above the $a0-3 gap. */
+ for (; i < argc; i++)
/* LINTED uintptr_t is safe */
- *sp++ = va_arg(ap, uintptr_t);
+ *sp++ = va_arg(ap, register_t);
va_end(ap);
-#endif
+}
+
+void
+_ctx_done(ucontext_t *ucp)
+{
+
+ if (ucp->uc_link == NULL)
+ exit(0);
+ else {
+ setcontext((const ucontext_t *)ucp->uc_link);
+ abort();
+ }
}
diff --git a/lib/libc/mips/gen/setjmp.S b/lib/libc/mips/gen/setjmp.S
index 2abc57b02c2f..deeb8924e308 100644
--- a/lib/libc/mips/gen/setjmp.S
+++ b/lib/libc/mips/gen/setjmp.S
@@ -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
-
- lw a0, CALLFRAME_SIZ(sp) # restore env pointer
- lw ra, CALLFRAME_RA(sp) # restore RA
- 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)
+ PTR_LA t9, _C_LABEL(sigprocmask) # get current signal mask
+ jalr t9
+
+ 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
+
+ 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
-
- 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)
+ 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
+
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)
diff --git a/lib/libc/mips/gen/sigsetjmp.S b/lib/libc/mips/gen/sigsetjmp.S
index 4e86e28e667d..7705c29a46b1 100644
--- a/lib/libc/mips/gen/sigsetjmp.S
+++ b/lib/libc/mips/gen/sigsetjmp.S
@@ -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
+ PIC_PROLOGUE(sigsetjmp)
+
bne a1, 0x0, 1f # do saving of signal mask?
- la t9, _setjmp
- jr t9
+ PIC_TAILCALL(_setjmp)
-1: la t9, setjmp
- jr t9
+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)
diff --git a/lib/libc/mips/string/bcmp.S b/lib/libc/mips/string/bcmp.S
index 7b7fa687beae..ffcaeeb1a3fa 100644
--- a/lib/libc/mips/string/bcmp.S
+++ b/lib/libc/mips/string/bcmp.S
@@ -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)
diff --git a/lib/libc/mips/string/bcopy.S b/lib/libc/mips/string/bcopy.S
index 6287d0696f00..bc227e07d662 100644
--- a/lib/libc/mips/string/bcopy.S
+++ b/lib/libc/mips/string/bcopy.S
@@ -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
diff --git a/lib/libc/mips/string/bzero.S b/lib/libc/mips/string/bzero.S
index 9b341302f975..66f29ddeeae8 100644
--- a/lib/libc/mips/string/bzero.S
+++ b/lib/libc/mips/string/bzero.S
@@ -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)
diff --git a/lib/libc/mips/string/ffs.S b/lib/libc/mips/string/ffs.S
index 8df2be311979..17e509c24637 100644
--- a/lib/libc/mips/string/ffs.S
+++ b/lib/libc/mips/string/ffs.S
@@ -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__
diff --git a/lib/libc/mips/string/index.S b/lib/libc/mips/string/index.S
index 055baacab8dc..d1df5400fc1a 100644
--- a/lib/libc/mips/string/index.S
+++ b/lib/libc/mips/string/index.S
@@ -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)
diff --git a/lib/libc/mips/string/rindex.S b/lib/libc/mips/string/rindex.S
index 60cbb48ba63b..e50379e673a4 100644
--- a/lib/libc/mips/string/rindex.S
+++ b/lib/libc/mips/string/rindex.S
@@ -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)
diff --git a/lib/libc/mips/string/strcmp.S b/lib/libc/mips/string/strcmp.S
index ce2839d62f90..8a9905630ce8 100644
--- a/lib/libc/mips/string/strcmp.S
+++ b/lib/libc/mips/string/strcmp.S
@@ -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
diff --git a/lib/libc/mips/string/strlen.S b/lib/libc/mips/string/strlen.S
index c1f302d4ca49..3b46ccceb54b 100644
--- a/lib/libc/mips/string/strlen.S
+++ b/lib/libc/mips/string/strlen.S
@@ -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)
diff --git a/lib/libc/mips/sys/Makefile.inc b/lib/libc/mips/sys/Makefile.inc
index d2e7291b20ef..3601909bc0ec 100644
--- a/lib/libc/mips/sys/Makefile.inc
+++ b/lib/libc/mips/sys/Makefile.inc
@@ -1,7 +1,7 @@
# $FreeBSD$
MDASM= Ovfork.S brk.S cerror.S exect.S \
- fork.S pipe.S ptrace.S sbrk.S shmat.S syscall.S
+ fork.S pipe.S ptrace.S sbrk.S syscall.S
# Don't generate default code for these syscalls:
NOASM= break.o exit.o ftruncate.o getlogin.o lseek.o mmap.o \
diff --git a/lib/libc/mips/sys/Ovfork.S b/lib/libc/mips/sys/Ovfork.S
index 99a5526d1f45..9df93ea59e9d 100644
--- a/lib/libc/mips/sys/Ovfork.S
+++ b/lib/libc/mips/sys/Ovfork.S
@@ -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)
diff --git a/lib/libc/mips/sys/brk.S b/lib/libc/mips/sys/brk.S
index 580d7fa5ed30..68f0bd45b32a 100644
--- a/lib/libc/mips/sys/brk.S
+++ b/lib/libc/mips/sys/brk.S
@@ -42,35 +42,30 @@ __FBSDID("$FreeBSD$");
#endif /* LIBC_SCCS and not lint */
.globl _C_LABEL(minbrk)
- .globl _C_LABEL(curbrk)
+ .globl _C_LABEL(__curbrk)
.globl _C_LABEL(_end)
.data
_C_LABEL(minbrk):
- .word _C_LABEL(_end)
-_C_LABEL(curbrk):
- .word _C_LABEL(_end)
- .text
+ PTR_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)
diff --git a/lib/libc/mips/sys/cerror.S b/lib/libc/mips/sys/cerror.S
index 535fbe063b6c..c504d73afa3f 100644
--- a/lib/libc/mips/sys/cerror.S
+++ b/lib/libc/mips/sys/cerror.S
@@ -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 */
+ .globl _C_LABEL(__error)
+NESTED_NOPROFILE(__cerror, CALLFRAME_SIZ, ra)
+ .mask 0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
+ SETUP_GP
+ PTR_SUBU sp, sp, CALLFRAME_SIZ
+ SETUP_GP64(CALLFRAME_GP, __cerror)
+ SAVE_GP(CALLFRAME_GP)
- /*
- * 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
+ PTR_S ra, CALLFRAME_RA(sp)
+ REG_S v0, CALLFRAME_S0(sp) # save errno value
-LEAF(__cerror)
- .frame sp, CALLFRAME_SIZ, ra
- PIC_PROLOGUE(__cerror, t9)
- subu sp, sp, CALLFRAME_SIZ
- .mask 0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
- sw ra, CALLFRAME_RA(sp)
- sw v0, 12(sp) # save errno value
+ 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
- la t9, _C_LABEL(__error) # locate address of errno
- jalr t9
+ li v0, -1
+ li v1, -1
- 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
+ j ra
END(__cerror)
diff --git a/lib/libc/mips/sys/exect.S b/lib/libc/mips/sys/exect.S
index 702015d96ed3..613d47c5d6d5 100644
--- a/lib/libc/mips/sys/exect.S
+++ b/lib/libc/mips/sys/exect.S
@@ -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)
diff --git a/lib/libc/mips/sys/fork.S b/lib/libc/mips/sys/fork.S
index 2d1f14b855e7..7636bd379292 100644
--- a/lib/libc/mips/sys/fork.S
+++ b/lib/libc/mips/sys/fork.S
@@ -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)
diff --git a/lib/libc/mips/sys/pipe.S b/lib/libc/mips/sys/pipe.S
index 224b78c8aafc..01465328f834 100644
--- a/lib/libc/mips/sys/pipe.S
+++ b/lib/libc/mips/sys/pipe.S
@@ -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)
diff --git a/lib/libc/mips/sys/ptrace.S b/lib/libc/mips/sys/ptrace.S
index 86bc1e59caa9..8cf984a9c727 100644
--- a/lib/libc/mips/sys/ptrace.S
+++ b/lib/libc/mips/sys/ptrace.S
@@ -41,20 +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)
-#ifdef __ABICALLS__
- .set noreorder
- .cpload t9
- .set reorder
-#endif
- la t9, _C_LABEL(__error) # locate address of errno
- jalr t9
- sw zero, 0(v0)
- 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)
diff --git a/lib/libc/mips/sys/sbrk.S b/lib/libc/mips/sys/sbrk.S
index c53536010066..0989493a6172 100644
--- a/lib/libc/mips/sys/sbrk.S
+++ b/lib/libc/mips/sys/sbrk.S
@@ -46,40 +46,28 @@ __FBSDID("$FreeBSD$");
.data
_C_LABEL(__curbrk):
- .word _C_LABEL(_end)
+ PTR_WORD _C_LABEL(_end)
.text
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)