1/* Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005 2 Free Software Foundation, Inc. 3 Contributed by David Mosberger-Tang <davidm@hpl.hp.com>. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <http://www.gnu.org/licenses/>. 18 19 The layout of the jmp_buf is as follows. This is subject to change 20 and user-code should never depend on the particular layout of 21 jmp_buf! 22 23 24 offset: description: 25 ------- ------------ 26 0x000 stack pointer (r12) ; unchangeable (see _JMPBUF_UNWINDS) 27 0x008 r1 (gp) 28 0x010 caller's unat 29 0x018 fpsr 30 0x020 r4 31 0x028 r5 32 0x030 r6 33 0x038 r7 34 0x040 rp (b0) 35 0x048 b1 36 0x050 b2 37 0x058 b3 38 0x060 b4 39 0x068 b5 40 0x070 ar.pfs 41 0x078 ar.lc 42 0x080 pr 43 0x088 ar.bsp ; unchangeable (see __longjmp.S) 44 0x090 ar.unat 45 0x098 &__jmp_buf ; address of the jmpbuf (needed to locate NaT bits in unat) 46 0x0a0 f2 47 0x0b0 f3 48 0x0c0 f4 49 0x0d0 f5 50 0x0e0 f16 51 0x0f0 f17 52 0x100 f18 53 0x110 f19 54 0x120 f20 55 0x130 f21 56 0x130 f22 57 0x140 f23 58 0x150 f24 59 0x160 f25 60 0x170 f26 61 0x180 f27 62 0x190 f28 63 0x1a0 f29 64 0x1b0 f30 65 0x1c0 f31 */ 66 67#include "sysdep.h" 68#include <features.h> 69 70 /* The following two entry points are the traditional entry points: */ 71 72LEAF(setjmp) 73 alloc r8=ar.pfs,2,0,0,0 74 mov in1=1 75 br.cond.sptk.many _GI___sigsetjmp 76END(setjmp) 77 78LEAF(_setjmp) 79 alloc r8=ar.pfs,2,0,0,0 80 mov in1=0 81 br.cond.sptk.many _GI___sigsetjmp 82END(_setjmp) 83libc_hidden_def (_setjmp) 84 85 /* __sigsetjmp(__jmp_buf buf, int savemask) */ 86 87ENTRY(__sigsetjmp) 88 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2) 89 alloc loc1=ar.pfs,2,5,2,0 90 .save ar.unat, loc2 91 mov loc2=ar.unat 92 ;; 93 mov r17=ar.fpsr 94 mov r2=in0 95 add r3=8,in0 96 ;; 97.mem.offset 8,0; st8.spill.nta [r2]=sp,16 /* r12 (sp) */ 98.mem.offset 0,0; st8.spill.nta [r3]=gp,16 /* r1 (gp) */ 99 ;; 100 st8.nta [r2]=loc2,16 /* save caller's unat */ 101 st8.nta [r3]=r17,16 /* save fpsr */ 102 add r8=0xa0,in0 103 ;; 104.mem.offset 8,0; st8.spill.nta [r2]=r4,16 /* r4 */ 105.mem.offset 0,0; st8.spill.nta [r3]=r5,16 /* r5 */ 106 add r9=0xb0,in0 107 ;; 108 stf.spill.nta [r8]=f2,32 109 stf.spill.nta [r9]=f3,32 110 mov loc0=rp 111 .body 112 ;; 113 stf.spill.nta [r8]=f4,32 114 stf.spill.nta [r9]=f5,32 115 mov r17=b1 116 ;; 117 stf.spill.nta [r8]=f16,32 118 stf.spill.nta [r9]=f17,32 119 mov r18=b2 120 ;; 121 stf.spill.nta [r8]=f18,32 122 stf.spill.nta [r9]=f19,32 123 mov r19=b3 124 ;; 125 stf.spill.nta [r8]=f20,32 126 stf.spill.nta [r9]=f21,32 127 mov r20=b4 128 ;; 129 stf.spill.nta [r8]=f22,32 130 stf.spill.nta [r9]=f23,32 131 mov r21=b5 132 ;; 133 stf.spill.nta [r8]=f24,32 134 stf.spill.nta [r9]=f25,32 135 mov r22=ar.lc 136 ;; 137 stf.spill.nta [r8]=f26,32 138 stf.spill.nta [r9]=f27,32 139 mov r24=pr 140 ;; 141 stf.spill.nta [r8]=f28,32 142 stf.spill.nta [r9]=f29,32 143 ;; 144 stf.spill.nta [r8]=f30 145 stf.spill.nta [r9]=f31 146 147.mem.offset 8,0; st8.spill.nta [r2]=r6,16 /* r6 */ 148.mem.offset 0,0; st8.spill.nta [r3]=r7,16 /* r7 */ 149 ;; 150 mov r23=ar.bsp 151 mov r25=ar.unat 152 mov out0=in0 153 154 st8.nta [r2]=loc0,16 /* b0 */ 155 st8.nta [r3]=r17,16 /* b1 */ 156 mov out1=in1 157 ;; 158 st8.nta [r2]=r18,16 /* b2 */ 159 st8.nta [r3]=r19,16 /* b3 */ 160 ;; 161 st8.nta [r2]=r20,16 /* b4 */ 162 st8.nta [r3]=r21,16 /* b5 */ 163 ;; 164 st8.nta [r2]=loc1,16 /* ar.pfs */ 165 st8.nta [r3]=r22,16 /* ar.lc */ 166 ;; 167 st8.nta [r2]=r24,16 /* pr */ 168 st8.nta [r3]=r23,16 /* ar.bsp */ 169 ;; 170 st8.nta [r2]=r25 /* ar.unat */ 171 st8.nta [r3]=in0 /* &__jmp_buf */ 172#if defined NOT_IN_libc && defined IS_IN_rtld 173 /* In ld.so we never save the signal mask. */ 174 ;; 175#else 176 br.call.dpnt.few rp=__sigjmp_save 177#endif 178.ret0: /* force a new bundle ::q */ 179 mov.m ar.unat=loc2 /* restore caller's unat */ 180 mov rp=loc0 181 mov ar.pfs=loc1 182 mov r8=0 183 ret 184END(__sigsetjmp) 185strong_alias(__sigsetjmp, _GI___sigsetjmp) 186 187weak_extern(_setjmp) 188weak_extern(setjmp) 189