123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- /* Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005
- Free Software Foundation, Inc.
- Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA.
- The layout of the jmp_buf is as follows. This is subject to change
- and user-code should never depend on the particular layout of
- jmp_buf!
- offset: description:
- ------- ------------
- 0x000 stack pointer (r12) ; unchangeable (see _JMPBUF_UNWINDS)
- 0x008 r1 (gp)
- 0x010 caller's unat
- 0x018 fpsr
- 0x020 r4
- 0x028 r5
- 0x030 r6
- 0x038 r7
- 0x040 rp (b0)
- 0x048 b1
- 0x050 b2
- 0x058 b3
- 0x060 b4
- 0x068 b5
- 0x070 ar.pfs
- 0x078 ar.lc
- 0x080 pr
- 0x088 ar.bsp ; unchangeable (see __longjmp.S)
- 0x090 ar.unat
- 0x098 &__jmp_buf ; address of the jmpbuf (needed to locate NaT bits in unat)
- 0x0a0 f2
- 0x0b0 f3
- 0x0c0 f4
- 0x0d0 f5
- 0x0e0 f16
- 0x0f0 f17
- 0x100 f18
- 0x110 f19
- 0x120 f20
- 0x130 f21
- 0x130 f22
- 0x140 f23
- 0x150 f24
- 0x160 f25
- 0x170 f26
- 0x180 f27
- 0x190 f28
- 0x1a0 f29
- 0x1b0 f30
- 0x1c0 f31 */
- #include "sysdep.h"
- #include <features.h>
- /* The following two entry points are the traditional entry points: */
- LEAF(setjmp)
- alloc r8=ar.pfs,2,0,0,0
- mov in1=1
- br.cond.sptk.many _GI___sigsetjmp
- END(setjmp)
- LEAF(_setjmp)
- alloc r8=ar.pfs,2,0,0,0
- mov in1=0
- br.cond.sptk.many _GI___sigsetjmp
- END(_setjmp)
- libc_hidden_def (_setjmp)
- /* __sigsetjmp(__jmp_buf buf, int savemask) */
- ENTRY(__sigsetjmp)
- .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
- alloc loc1=ar.pfs,2,5,2,0
- .save ar.unat, loc2
- mov loc2=ar.unat
- ;;
- mov r17=ar.fpsr
- mov r2=in0
- add r3=8,in0
- ;;
- .mem.offset 8,0; st8.spill.nta [r2]=sp,16 /* r12 (sp) */
- .mem.offset 0,0; st8.spill.nta [r3]=gp,16 /* r1 (gp) */
- ;;
- st8.nta [r2]=loc2,16 /* save caller's unat */
- st8.nta [r3]=r17,16 /* save fpsr */
- add r8=0xa0,in0
- ;;
- .mem.offset 8,0; st8.spill.nta [r2]=r4,16 /* r4 */
- .mem.offset 0,0; st8.spill.nta [r3]=r5,16 /* r5 */
- add r9=0xb0,in0
- ;;
- stf.spill.nta [r8]=f2,32
- stf.spill.nta [r9]=f3,32
- mov loc0=rp
- .body
- ;;
- stf.spill.nta [r8]=f4,32
- stf.spill.nta [r9]=f5,32
- mov r17=b1
- ;;
- stf.spill.nta [r8]=f16,32
- stf.spill.nta [r9]=f17,32
- mov r18=b2
- ;;
- stf.spill.nta [r8]=f18,32
- stf.spill.nta [r9]=f19,32
- mov r19=b3
- ;;
- stf.spill.nta [r8]=f20,32
- stf.spill.nta [r9]=f21,32
- mov r20=b4
- ;;
- stf.spill.nta [r8]=f22,32
- stf.spill.nta [r9]=f23,32
- mov r21=b5
- ;;
- stf.spill.nta [r8]=f24,32
- stf.spill.nta [r9]=f25,32
- mov r22=ar.lc
- ;;
- stf.spill.nta [r8]=f26,32
- stf.spill.nta [r9]=f27,32
- mov r24=pr
- ;;
- stf.spill.nta [r8]=f28,32
- stf.spill.nta [r9]=f29,32
- ;;
- stf.spill.nta [r8]=f30
- stf.spill.nta [r9]=f31
- .mem.offset 8,0; st8.spill.nta [r2]=r6,16 /* r6 */
- .mem.offset 0,0; st8.spill.nta [r3]=r7,16 /* r7 */
- ;;
- mov r23=ar.bsp
- mov r25=ar.unat
- mov out0=in0
- st8.nta [r2]=loc0,16 /* b0 */
- st8.nta [r3]=r17,16 /* b1 */
- mov out1=in1
- ;;
- st8.nta [r2]=r18,16 /* b2 */
- st8.nta [r3]=r19,16 /* b3 */
- ;;
- st8.nta [r2]=r20,16 /* b4 */
- st8.nta [r3]=r21,16 /* b5 */
- ;;
- st8.nta [r2]=loc1,16 /* ar.pfs */
- st8.nta [r3]=r22,16 /* ar.lc */
- ;;
- st8.nta [r2]=r24,16 /* pr */
- st8.nta [r3]=r23,16 /* ar.bsp */
- ;;
- st8.nta [r2]=r25 /* ar.unat */
- st8.nta [r3]=in0 /* &__jmp_buf */
- #if defined NOT_IN_libc && defined IS_IN_rtld
- /* In ld.so we never save the signal mask. */
- ;;
- #else
- br.call.dpnt.few rp=__sigjmp_save
- #endif
- .ret0: /* force a new bundle ::q */
- mov.m ar.unat=loc2 /* restore caller's unat */
- mov rp=loc0
- mov ar.pfs=loc1
- mov r8=0
- ret
- END(__sigsetjmp)
- strong_alias(__sigsetjmp, _GI___sigsetjmp)
- weak_extern(_setjmp)
- weak_extern(setjmp)
|