Pullup fixes from matt-nb5-mips64.
This makes setjmp/longjmp work again.
This commit is contained in:
parent
1eb23a5f2b
commit
015f9bbf7a
@ -1,6 +1,10 @@
|
||||
# $NetBSD: Makefile.inc,v 1.30 2009/12/14 01:07:42 matt Exp $
|
||||
# $NetBSD: Makefile.inc,v 1.31 2010/09/03 17:22:51 matt Exp $
|
||||
|
||||
.if ${MKSOFTFLOAT} == "no"
|
||||
SRCS+= fabs.S ldexp.S modf.S
|
||||
.else
|
||||
SRCS+= fabs_ieee754.c ldexp_ieee754.c modf_ieee754.c
|
||||
.endif
|
||||
|
||||
# Common ieee754 constants and functions
|
||||
SRCS+= infinityf_ieee754.c infinity_ieee754.c infinityl_dbl_ieee754.c
|
||||
@ -11,9 +15,12 @@ SRCS+= isfinitef_ieee754.c isfinited_ieee754.c
|
||||
SRCS+= signbitf_ieee754.c signbitd_ieee754.c
|
||||
|
||||
SRCS+= nanf.c
|
||||
SRCS+= flt_rounds.c
|
||||
|
||||
SRCS+= flt_rounds.c fpgetmask.c fpgetround.c fpgetsticky.c fpsetmask.c \
|
||||
.if ${MKSOFTFLOAT} == "no"
|
||||
SRCS+= fpgetmask.c fpgetround.c fpgetsticky.c fpsetmask.c \
|
||||
fpsetround.c fpsetsticky.c
|
||||
.endif
|
||||
|
||||
SRCS+= setjmp.S longjmp.c
|
||||
SRCS+= _setjmp.S
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: _setjmp.S,v 1.21 2009/12/14 01:07:42 matt Exp $ */
|
||||
/* $NetBSD: _setjmp.S,v 1.22 2010/09/03 17:22:51 matt Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993
|
||||
@ -46,7 +46,7 @@
|
||||
#if 0
|
||||
RCSID("from: @(#)_setjmp.s 8.1 (Berkeley) 6/4/93")
|
||||
#else
|
||||
RCSID("$NetBSD: _setjmp.S,v 1.21 2009/12/14 01:07:42 matt Exp $")
|
||||
RCSID("$NetBSD: _setjmp.S,v 1.22 2010/09/03 17:22:51 matt Exp $")
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
@ -68,7 +68,6 @@ LEAF(_setjmp)
|
||||
REG_LI v0, 0xACEDBADE # sigcontext magic number
|
||||
REG_S ra, _OFFSETOF_SC_PC(a0) # sc_pc = return address
|
||||
REG_S v0, _OFFSETOF_SC_REGS(a0) # saved in sc_regs[0]
|
||||
REG_S a1, _OFFSETOF_SC_REGS_V0(a0) # save return value
|
||||
REG_S s0, _OFFSETOF_SC_REGS_S0(a0)
|
||||
REG_S s1, _OFFSETOF_SC_REGS_S1(a0)
|
||||
REG_S s2, _OFFSETOF_SC_REGS_S2(a0)
|
||||
@ -82,13 +81,14 @@ LEAF(_setjmp)
|
||||
#if defined(__mips_n32) || defined(__mips_n64)
|
||||
REG_S gp, _OFFSETOF_SC_REGS_GP(a0) # newabi gp is callee-saved
|
||||
#endif
|
||||
cfc1 v0, $31 # too bad cant check if FP used
|
||||
/*
|
||||
* In N32, FP registers F20, F22, F24, F26, F28, F30 are callee-saved.
|
||||
* In N64, FP registers F23 .. F31 are callee-saved.
|
||||
* In O32, FP registers F20 .. F23 are callee-saved.
|
||||
*/
|
||||
#ifndef SOFTFLOAT_FOR_GCC
|
||||
cfc1 v0, $31 # too bad cant check if FP used
|
||||
INT_S v0, _OFFSETOF_SC_FPREGS_FCSR(a0)
|
||||
#if defined(__mips_n64) || defined(__mips_n32)
|
||||
FP_S $f30, _OFFSETOF_SC_FPREGS_F30(a0)
|
||||
FP_S $f28, _OFFSETOF_SC_FPREGS_F28(a0)
|
||||
@ -110,7 +110,6 @@ LEAF(_setjmp)
|
||||
FP_S $f31, _OFFSETOF_SC_FPREGS_F31(a0)
|
||||
#endif
|
||||
#endif /* SOFTFLOAT_FOR_GCC */
|
||||
INT_S v0, _OFFSETOF_SC_FPREGS_FCSR(a0)
|
||||
REG_EPILOGUE
|
||||
|
||||
j ra
|
||||
@ -128,6 +127,7 @@ LEAF(_longjmp)
|
||||
REG_LI t0, 0xACEDBADE
|
||||
bne v0, t0, botch # jump if error
|
||||
PTR_ADDU sp, sp, CALLFRAME_SIZ # does not matter, sanity
|
||||
REG_S a1, _OFFSETOF_SC_REGS_V0(a0) # save return value
|
||||
REG_L s0, _OFFSETOF_SC_REGS_S0(a0)
|
||||
REG_L s1, _OFFSETOF_SC_REGS_S1(a0)
|
||||
REG_L s2, _OFFSETOF_SC_REGS_S2(a0)
|
||||
@ -140,16 +140,16 @@ LEAF(_longjmp)
|
||||
REG_L gp, _OFFSETOF_SC_REGS_GP(a0)
|
||||
#endif
|
||||
# get fpu status
|
||||
INT_L v0, _OFFSETOF_SC_FPREGS_FCSR(a0)
|
||||
REG_L sp, _OFFSETOF_SC_REGS_SP(a0)
|
||||
REG_L s8, _OFFSETOF_SC_REGS_S8(a0)
|
||||
#ifndef SOFTFLOAT_FOR_GCC
|
||||
INT_L v0, _OFFSETOF_SC_FPREGS_FCSR(a0)
|
||||
ctc1 v0, $31
|
||||
/*
|
||||
* In N32, FP registers F20, F22, F24, F26, F28, F30 are callee-saved.
|
||||
* In N64, FP registers F23 .. F31 are callee-saved.
|
||||
* In O32, FP registers F20 .. F23 are callee-saved.
|
||||
*/
|
||||
#ifndef SOFTFLOAT_FOR_GCC
|
||||
#if defined(__mips_n64) || defined(__mips_n32)
|
||||
FP_L $f30, _OFFSETOF_SC_FPREGS_F30(a0)
|
||||
FP_L $f28, _OFFSETOF_SC_FPREGS_F28(a0)
|
||||
@ -173,7 +173,7 @@ LEAF(_longjmp)
|
||||
#endif /* SOFTFLOAT_FOR_GCC */
|
||||
|
||||
REG_EPILOGUE
|
||||
REG_L v0, _OFFSETOF_SC_REGS_V0(a0)
|
||||
move v0, a1 # get return value in 1st arg
|
||||
j ra
|
||||
nop
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: flt_rounds.c,v 1.5 2005/12/24 23:10:08 perry Exp $ */
|
||||
/* $NetBSD: flt_rounds.c,v 1.6 2010/09/03 17:22:51 matt Exp $ */
|
||||
|
||||
/*
|
||||
* Written by J.T. Conklin, Apr 11, 1995
|
||||
@ -7,10 +7,11 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: flt_rounds.c,v 1.5 2005/12/24 23:10:08 perry Exp $");
|
||||
__RCSID("$NetBSD: flt_rounds.c,v 1.6 2010/09/03 17:22:51 matt Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <machine/float.h>
|
||||
#include <ieeefp.h>
|
||||
|
||||
static const int map[] = {
|
||||
1, /* round to nearest */
|
||||
@ -22,8 +23,12 @@ static const int map[] = {
|
||||
int
|
||||
__flt_rounds()
|
||||
{
|
||||
#ifdef SOFTFLOAT_FOR_GCC
|
||||
return map[fpgetround()];
|
||||
#else
|
||||
int x;
|
||||
|
||||
__asm("cfc1 %0,$31" : "=r" (x));
|
||||
__asm("cfc1\t%0,$31" : "=r" (x));
|
||||
return map[x & 0x03];
|
||||
#endif
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: longjmp.c,v 1.3 2009/02/16 03:23:29 lukem Exp $ */
|
||||
/* $NetBSD: longjmp.c,v 1.4 2010/09/03 17:22:51 matt Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2003 The NetBSD Foundation, Inc.
|
||||
@ -70,7 +70,7 @@ __longjmp14(jmp_buf env, int val)
|
||||
uc.uc_link = 0;
|
||||
|
||||
/* Save return value in context */
|
||||
uc.uc_mcontext.__gregs[_R_V0] = val;
|
||||
uc.uc_mcontext.__gregs[_REG_V0] = val;
|
||||
|
||||
/* Copy saved registers */
|
||||
uc.uc_mcontext.__gregs[_REG_S0] = sc->sc_regs[_R_S0];
|
||||
@ -82,6 +82,9 @@ __longjmp14(jmp_buf env, int val)
|
||||
uc.uc_mcontext.__gregs[_REG_S6] = sc->sc_regs[_R_S6];
|
||||
uc.uc_mcontext.__gregs[_REG_S7] = sc->sc_regs[_R_S7];
|
||||
uc.uc_mcontext.__gregs[_REG_S8] = sc->sc_regs[_R_S8];
|
||||
#if defined(__mips_n32) || defined(__mips_n64)
|
||||
uc.uc_mcontext.__gregs[_REG_GP] = sc->sc_regs[_R_GP];
|
||||
#endif
|
||||
uc.uc_mcontext.__gregs[_REG_SP] = sc->sc_regs[_R_SP];
|
||||
uc.uc_mcontext.__gregs[_REG_RA] = sc->sc_regs[_R_RA];
|
||||
uc.uc_mcontext.__gregs[_REG_EPC] = sc->sc_pc;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: setjmp.S,v 1.18 2009/12/14 01:07:42 matt Exp $ */
|
||||
/* $NetBSD: setjmp.S,v 1.19 2010/09/03 17:22:51 matt Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993
|
||||
@ -41,7 +41,7 @@
|
||||
#if 0
|
||||
RCSID("from: @(#)setjmp.s 8.1 (Berkeley) 6/4/93")
|
||||
#else
|
||||
RCSID("$NetBSD: setjmp.S,v 1.18 2009/12/14 01:07:42 matt Exp $")
|
||||
RCSID("$NetBSD: setjmp.S,v 1.19 2010/09/03 17:22:51 matt Exp $")
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
@ -111,11 +111,13 @@ NON_LEAF(__setjmp14, SETJMP_FRAME_SIZE, ra)
|
||||
REG_S gp, _OFFSETOF_SC_REGS_GP(a0)
|
||||
REG_S sp, _OFFSETOF_SC_REGS_SP(a0)
|
||||
REG_S s8, _OFFSETOF_SC_REGS_S8(a0)
|
||||
#ifdef SOFTFLOAT_FOR_GCC
|
||||
INT_S zero, _OFFSETOF_SC_FPUSED(a0) # sc_fpused = 0
|
||||
#else
|
||||
li v0, 1 # be nice if we could tell
|
||||
INT_S v0, _OFFSETOF_SC_FPUSED(a0) # sc_fpused = 1
|
||||
cfc1 v0, $31
|
||||
INT_S v0, _OFFSETOF_SC_FPREGS_FCSR(a0)
|
||||
#ifndef SOFTFLOAT_FOR_GCC
|
||||
#if defined(__mips_o32) || defined(__mips_o64) || defined(__mips_n32)
|
||||
FP_S $f20, _OFFSETOF_SC_FPREGS_F20(a0)
|
||||
FP_S $f22, _OFFSETOF_SC_FPREGS_F22(a0)
|
||||
@ -138,8 +140,8 @@ NON_LEAF(__setjmp14, SETJMP_FRAME_SIZE, ra)
|
||||
#endif
|
||||
#endif /* SOFTFLOAT_FOR_GCC */
|
||||
REG_EPILOGUE
|
||||
j ra
|
||||
move v0, zero
|
||||
j ra
|
||||
|
||||
botch:
|
||||
jal _C_LABEL(abort)
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: cerror.S,v 1.14 2009/12/14 01:07:42 matt Exp $ */
|
||||
/* $NetBSD: cerror.S,v 1.15 2010/09/03 17:22:52 matt Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993
|
||||
@ -38,7 +38,7 @@
|
||||
#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 $")
|
||||
RCSID("$NetBSD: cerror.S,v 1.15 2010/09/03 17:22:52 matt Exp $")
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
@ -47,22 +47,23 @@
|
||||
NESTED_NOPROFILE(__cerror, CALLFRAME_SIZ, ra)
|
||||
.mask 0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
|
||||
PIC_PROLOGUE(__cerror)
|
||||
PTR_SUBU sp, sp, CALLFRAME_SIZ
|
||||
PTR_SUBU sp, CALLFRAME_SIZ
|
||||
PTR_S ra, CALLFRAME_RA(sp)
|
||||
INT_S v0, CALLFRAME_S0(sp) # save errno value
|
||||
|
||||
SAVE_GP(CALLFRAME_GP)
|
||||
|
||||
PTR_LA t9, _C_LABEL(__errno) # locate address of errno
|
||||
jalr t9
|
||||
RESTORE_GP64 # restore GP (from t3)
|
||||
jalr t9 # __errno()
|
||||
|
||||
INT_L t0, CALLFRAME_S0(sp)
|
||||
PTR_L ra, CALLFRAME_RA(sp)
|
||||
INT_S t0, 0(v0) # update errno value
|
||||
PTR_ADDU sp, sp, CALLFRAME_SIZ
|
||||
PTR_ADDU sp, CALLFRAME_SIZ
|
||||
li v0, -1
|
||||
li v1, -1
|
||||
PIC_RETURN()
|
||||
j ra # GP has been restored.
|
||||
END(__cerror)
|
||||
#else
|
||||
.globl _C_LABEL(errno)
|
||||
|
Loading…
Reference in New Issue
Block a user