Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/arch/sh5 Userland side of SH5 signals/setjmp.



details:   https://anonhg.NetBSD.org/src/rev/83e957d8fbfa
branches:  trunk
changeset: 533951:83e957d8fbfa
user:      scw <scw%NetBSD.org@localhost>
date:      Thu Jul 11 14:23:04 2002 +0000

description:
Userland side of SH5 signals/setjmp.

diffstat:

 lib/libc/arch/sh5/Makefile.inc                 |    4 +-
 lib/libc/arch/sh5/gen/Makefile.inc             |    6 +-
 lib/libc/arch/sh5/gen/__setjmp14.S             |  184 +++++++++++++++++++
 lib/libc/arch/sh5/gen/__sigsetjmp14.S          |   73 +++++++
 lib/libc/arch/sh5/gen/_setjmp.S                |  241 ++++++++++++++++--------
 lib/libc/arch/sh5/gen/sigsetjmp.S              |   42 ----
 lib/libc/arch/sh5/sys/__sigaction14_sigtramp.c |   58 ++++++
 lib/libc/arch/sh5/sys/__sigtramp1.S            |   51 +++++
 8 files changed, 528 insertions(+), 131 deletions(-)

diffs (truncated from 725 to 300 lines):

diff -r 8b2a3c4afed3 -r 83e957d8fbfa lib/libc/arch/sh5/Makefile.inc
--- a/lib/libc/arch/sh5/Makefile.inc    Thu Jul 11 14:16:42 2002 +0000
+++ b/lib/libc/arch/sh5/Makefile.inc    Thu Jul 11 14:23:04 2002 +0000
@@ -1,4 +1,6 @@
-#      $NetBSD: Makefile.inc,v 1.1 2002/07/05 13:32:58 scw Exp $
+#      $NetBSD: Makefile.inc,v 1.2 2002/07/11 14:23:04 scw Exp $
 
 KMINCLUDES=
 KMSRCS=
+
+SRCS+= __sigaction14_sigtramp.c __sigtramp1.S
diff -r 8b2a3c4afed3 -r 83e957d8fbfa lib/libc/arch/sh5/gen/Makefile.inc
--- a/lib/libc/arch/sh5/gen/Makefile.inc        Thu Jul 11 14:16:42 2002 +0000
+++ b/lib/libc/arch/sh5/gen/Makefile.inc        Thu Jul 11 14:23:04 2002 +0000
@@ -1,9 +1,9 @@
-#      $NetBSD: Makefile.inc,v 1.2 2002/07/10 13:09:04 scw Exp $
+#      $NetBSD: Makefile.inc,v 1.3 2002/07/11 14:23:05 scw Exp $
 
-SRCS+= alloca.S \
+SRCS+= __setjmp14.S __sigsetjmp14.S _setjmp.S \
+       alloca.S \
        byte_swap_2.S byte_swap_4.S byte_swap_8.S \
        fabs.S flt_rounds.S \
-       sigsetjmp.S _setjmp.S
 
 SRCS+= ieee754_frexp.c ieee754_infinity.c ieee754_isinf.c ieee754_isnan.c \
        ieee754_ldexp.c ieee754_modf.c ieee754_nanf.c
diff -r 8b2a3c4afed3 -r 83e957d8fbfa lib/libc/arch/sh5/gen/__setjmp14.S
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/arch/sh5/gen/__setjmp14.S        Thu Jul 11 14:23:04 2002 +0000
@@ -0,0 +1,184 @@
+/*     $NetBSD: __setjmp14.S,v 1.1 2002/07/11 14:23:05 scw Exp $       */
+
+/*
+ * Copyright 2002 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Steve C. Woodford for Wasabi Systems, Inc.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed for the NetBSD Project by
+ *      Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ *    or promote products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
+ * 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>
+#include <machine/setjmp.h>
+
+/*
+ * C library -- setjmp, longjmp
+ *
+ *     longjmp(a,v)
+ * will generate a "return(v)" from
+ * the last call to
+ *     setjmp(a)
+ * by restoring registers from the stack,
+ * and the previous signal state.
+ */
+
+ENTRY_NOPROFILE(__setjmp14)
+       /* Save callee-saved register */
+       getcon  usr, r1
+       st.q    r2, _JB_R10, r10
+       st.q    r2, _JB_R11, r11
+       st.q    r2, _JB_R12, r12
+       st.q    r2, _JB_R13, r13
+       st.q    r2, _JB_R14, r14
+       st.q    r2, _JB_R15, r15
+       st.q    r2, _JB_R18, r18
+       LDUC32(0xACEBABE5, r0)
+       st.q    r2, _JB_R24, r0         /* sigcontext magic number */
+       st.q    r2, _JB_R26, r26
+       st.q    r2, _JB_R27, r27
+       st.q    r2, _JB_R28, r28
+       st.q    r2, _JB_R29, r29
+       st.q    r2, _JB_R30, r30
+       st.q    r2, _JB_R31, r31
+       st.q    r2, _JB_R32, r32
+       st.q    r2, _JB_R33, r33
+       st.q    r2, _JB_R34, r34
+       st.q    r2, _JB_R35, r35
+       st.q    r2, _JB_R44, r44
+       st.q    r2, _JB_R45, r45
+       st.q    r2, _JB_R46, r46
+       st.q    r2, _JB_R47, r47
+       st.q    r2, _JB_R48, r48
+       st.q    r2, _JB_R49, r49
+       st.q    r2, _JB_R50, r50
+       st.q    r2, _JB_R51, r51
+       st.q    r2, _JB_R52, r52
+       st.q    r2, _JB_R53, r53
+       st.q    r2, _JB_R54, r54
+       st.q    r2, _JB_R55, r55
+       st.q    r2, _JB_R56, r56
+       st.q    r2, _JB_R57, r57
+       st.q    r2, _JB_R58, r58
+       st.q    r2, _JB_R59, r59
+       movi    1, r0
+       st.q    r2, _JB_TR0, r0         /* Ensure caller-saved copies of */
+       st.q    r2, _JB_TR1, r0         /* branch-target registers have valid */
+       st.q    r2, _JB_TR2, r0         /* (albeit, pointing to nothing) */
+       st.q    r2, _JB_TR3, r0         /* SHmedia addresses. */
+       st.q    r2, _JB_TR4, r0
+       gettr   tr5, r0
+       st.q    r2, _JB_TR5, r0
+       gettr   tr6, r0
+       st.q    r2, _JB_TR6, r0
+       gettr   tr7, r0
+       st.q    r2, _JB_TR7, r0
+       pta/u   1f, tr0
+       shlri   r1, 8, r3
+       andi    r3, 0xff, r3
+       movi    0, r0                   /* Assume not saved */
+       beq/u   r3, r63, tr0            /* Jump if no FP regs used */
+       movi    -3329, r0               /* Mask for FP regs saved/used */
+       and     r1, r0, r1              /* Update USR */
+       fst.d   r2, _JB_DR12, dr12      /* Quicker to save all callee-saved */
+       fst.d   r2, _JB_DR14, dr14      /* than check USR bits */
+       fst.d   r2, _JB_DR36, dr36
+       fst.d   r2, _JB_DR38, dr38
+       fst.d   r2, _JB_DR40, dr40
+       fst.d   r2, _JB_DR42, dr42
+       fst.d   r2, _JB_DR44, dr44
+       fst.d   r2, _JB_DR46, dr46
+       fst.d   r2, _JB_DR48, dr48
+       fst.d   r2, _JB_DR50, dr50
+       fst.d   r2, _JB_DR52, dr52
+       fst.d   r2, _JB_DR54, dr54
+       fst.d   r2, _JB_DR56, dr56
+       fst.d   r2, _JB_DR58, dr58
+       fst.d   r2, _JB_DR60, dr60
+       fst.d   r2, _JB_DR62, dr62
+       fgetscr fr0
+       fst.d   r2, _JB_FPSCR, dr0
+       movi    3, r0                   /* Regs saved/used */
+1:     st.l    r2, _JB_SIGFPSTATE, r0
+       st.q    r2, _JB_USR, r1
+
+       or      r2, r63, r28            /* r28 is a safe-haven for jmpbuf */
+
+       /* Get signal information */
+       pta/l   _C_LABEL(__sigprocmask14), tr0
+       movi    0, r2                   /* how */
+       movi    0, r3                   /* set (NULL) */
+       movi    _JB_SIGMASK, r0
+       add     r28, r0, r4             /* point to mask in jmpbuf */
+       blink   tr0, r18
+
+       /* Prepare to fetch the current signal stack state */
+       pta/l   _C_LABEL(__sigaltstack14), tr0
+#ifndef _LP64
+       addi    r15, -12, r15           /* sizeof(struct sigaltstack) */
+#else
+       addi    r15, -24, r15           /* sizeof(struct sigaltstack) */
+#endif
+       movi    0, r2                   /* ss = NULL */
+       or      r15, r63, r3            /* oss -> sigaltstack created above */
+       blink   tr0, r18
+#ifndef _LP64
+       ld.l    r15, 8, r0              /* Fetch oss->ss_flags */
+       addi    r15, 12, r15            /* Clear stack */
+#else
+       ld.l    r15, 16, r0             /* Fetch oss->ss_flags */
+       addi    r15, 24, r15            /* Clear stack */
+#endif
+       ld.q    r28, _JB_R18, r18       /* Restore return address */
+       pta/u   Lbotch, tr0             /* Exit on error */
+       bgt/u   r63, r2, tr0
+       andi    r0, 1, r0               /* Get SA_ONSTACK flag */
+       st.l    r28, _JB_SIGONSTACK, r0 /* Save it in sc_onstack */
+       st.l    r28, _JB_SIGMASK13, r63 /* Zero unused fields */
+       st.l    r28, _JB_SIGPAD, r63
+       ld.l    r28, _JB_R18, r18       /* Restore return address */
+       ld.l    r28, _JB_R28, r28       /* Restore r28 */
+       ptabs/l r18, tr0
+       movi    0, r2
+       blink   tr0, r63
+
+
+ENTRY_NOPROFILE(__longjmp14)
+       LINK_FRAME(0)
+       pta/l   _C_LABEL(__sigreturn14), tr0
+       cmpeq   r3, r63, r3             /* Ensure a non-zero return value */
+       st.q    r2, _JB_R2, r3          /* Modify jmp_buf's copy of r2 */
+       blink   tr0, r18
+       UNLINK_FRAME(0)
+
+Lbotch:        pta/l   _C_LABEL(longjmperror), tr0
+       blink   tr0, r18
+       pta/l   _C_LABEL(abort), tr0
+       blink   tr0, r63
+
diff -r 8b2a3c4afed3 -r 83e957d8fbfa lib/libc/arch/sh5/gen/__sigsetjmp14.S
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/arch/sh5/gen/__sigsetjmp14.S     Thu Jul 11 14:23:04 2002 +0000
@@ -0,0 +1,73 @@
+/*     $NetBSD: __sigsetjmp14.S,v 1.1 2002/07/11 14:23:05 scw Exp $    */
+
+/*
+ * Copyright 2002 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Steve C. Woodford for Wasabi Systems, Inc.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed for the NetBSD Project by
+ *      Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ *    or promote products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
+ * 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>
+#include <machine/setjmp.h>
+
+/*
+ * C library -- sigsetjmp, siglongjmp
+ *
+ *     siglongjmp(a,v)
+ * will generate a "return(v)" from
+ * the last call to
+ *     sigsetjmp(a, mask)
+ * by restoring registers from the stack.
+ * If `mask' is non-zero, the previous signal
+ * state will be restored.
+ */
+
+ENTRY_NOPROFILE(__sigsetjmp14)
+#ifndef _LP64
+       st.l    r2, _JBLEN, r3          /* Save mask */
+#else
+       st.q    r2, _JBLEN, r3          /* Save mask */
+#endif
+       pta/l   _C_LABEL(__setjmp14), tr0
+       pta/u   _C_LABEL(_setjmp), tr1
+       beq/u   r3, r63, tr1            /* If mask == 0, don't save signals */
+       blink   tr0, r63                /* Else, save them */
+
+ENTRY_NOPROFILE(__siglongjmp14)
+#ifndef _LP64
+       ld.l    r2, _JBLEN, r0          /* Fetch mask */
+#else
+       ld.q    r2, _JBLEN, r0          /* Fetch mask */
+#endif
+       pta/l   _C_LABEL(__longjmp14), tr0
+       pta/u   _C_LABEL(_longjmp), tr1
+       beq/u   r0, r63, tr1            /* If mask == 0, don't restore sigs */
+       blink   tr0, r63                /* Else, restore them */
diff -r 8b2a3c4afed3 -r 83e957d8fbfa lib/libc/arch/sh5/gen/_setjmp.S
--- a/lib/libc/arch/sh5/gen/_setjmp.S   Thu Jul 11 14:16:42 2002 +0000
+++ b/lib/libc/arch/sh5/gen/_setjmp.S   Thu Jul 11 14:23:04 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: _setjmp.S,v 1.2 2002/07/10 11:05:19 scw Exp $  */
+/*     $NetBSD: _setjmp.S,v 1.3 2002/07/11 14:23:05 scw Exp $  */
 
 /*



Home | Main Index | Thread Index | Old Index