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)
|