Module Name: src Committed By: matt Date: Fri Sep 3 17:22:52 UTC 2010
Modified Files: src/lib/libc/arch/mips/gen: Makefile.inc _setjmp.S flt_rounds.c longjmp.c setjmp.S src/lib/libc/arch/mips/sys: cerror.S Log Message: Pullup fixes from matt-nb5-mips64. This makes setjmp/longjmp work again. To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/lib/libc/arch/mips/gen/Makefile.inc cvs rdiff -u -r1.21 -r1.22 src/lib/libc/arch/mips/gen/_setjmp.S cvs rdiff -u -r1.5 -r1.6 src/lib/libc/arch/mips/gen/flt_rounds.c cvs rdiff -u -r1.3 -r1.4 src/lib/libc/arch/mips/gen/longjmp.c cvs rdiff -u -r1.18 -r1.19 src/lib/libc/arch/mips/gen/setjmp.S cvs rdiff -u -r1.14 -r1.15 src/lib/libc/arch/mips/sys/cerror.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/arch/mips/gen/Makefile.inc diff -u src/lib/libc/arch/mips/gen/Makefile.inc:1.30 src/lib/libc/arch/mips/gen/Makefile.inc:1.31 --- src/lib/libc/arch/mips/gen/Makefile.inc:1.30 Mon Dec 14 01:07:42 2009 +++ src/lib/libc/arch/mips/gen/Makefile.inc Fri Sep 3 17:22:51 2010 @@ -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+= 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 Index: src/lib/libc/arch/mips/gen/_setjmp.S diff -u src/lib/libc/arch/mips/gen/_setjmp.S:1.21 src/lib/libc/arch/mips/gen/_setjmp.S:1.22 --- src/lib/libc/arch/mips/gen/_setjmp.S:1.21 Mon Dec 14 01:07:42 2009 +++ src/lib/libc/arch/mips/gen/_setjmp.S Fri Sep 3 17:22:51 2010 @@ -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 @@ 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 @@ #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 @@ 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 @@ 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 @@ 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 @@ #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 Index: src/lib/libc/arch/mips/gen/flt_rounds.c diff -u src/lib/libc/arch/mips/gen/flt_rounds.c:1.5 src/lib/libc/arch/mips/gen/flt_rounds.c:1.6 --- src/lib/libc/arch/mips/gen/flt_rounds.c:1.5 Sat Dec 24 23:10:08 2005 +++ src/lib/libc/arch/mips/gen/flt_rounds.c Fri Sep 3 17:22:51 2010 @@ -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 @@ 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 } Index: src/lib/libc/arch/mips/gen/longjmp.c diff -u src/lib/libc/arch/mips/gen/longjmp.c:1.3 src/lib/libc/arch/mips/gen/longjmp.c:1.4 --- src/lib/libc/arch/mips/gen/longjmp.c:1.3 Mon Feb 16 03:23:29 2009 +++ src/lib/libc/arch/mips/gen/longjmp.c Fri Sep 3 17:22:51 2010 @@ -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 @@ 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 @@ 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; Index: src/lib/libc/arch/mips/gen/setjmp.S diff -u src/lib/libc/arch/mips/gen/setjmp.S:1.18 src/lib/libc/arch/mips/gen/setjmp.S:1.19 --- src/lib/libc/arch/mips/gen/setjmp.S:1.18 Mon Dec 14 01:07:42 2009 +++ src/lib/libc/arch/mips/gen/setjmp.S Fri Sep 3 17:22:51 2010 @@ -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 @@ 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 @@ #endif #endif /* SOFTFLOAT_FOR_GCC */ REG_EPILOGUE - j ra move v0, zero + j ra botch: jal _C_LABEL(abort) Index: src/lib/libc/arch/mips/sys/cerror.S diff -u src/lib/libc/arch/mips/sys/cerror.S:1.14 src/lib/libc/arch/mips/sys/cerror.S:1.15 --- src/lib/libc/arch/mips/sys/cerror.S:1.14 Mon Dec 14 01:07:42 2009 +++ src/lib/libc/arch/mips/sys/cerror.S Fri Sep 3 17:22:52 2010 @@ -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)