15abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm/* libunwind - a platform-independent unwind library
25abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm   Copyright (C) 2001-2003 Hewlett-Packard Co
35abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
45abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
55abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmThis file is part of libunwind.
65abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
75abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmPermission is hereby granted, free of charge, to any person obtaining
85abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidma copy of this software and associated documentation files (the
95abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm"Software"), to deal in the Software without restriction, including
105abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmwithout limitation the rights to use, copy, modify, merge, publish,
115abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmdistribute, sublicense, and/or sell copies of the Software, and to
125abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmpermit persons to whom the Software is furnished to do so, subject to
135abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmthe following conditions:
145abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
155abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmThe above copyright notice and this permission notice shall be
165abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmincluded in all copies or substantial portions of the Software.
175abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
185abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
195abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
205abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
215abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
225abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
235abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
245abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
255abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
265abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm#include "ucontext_i.h"
275abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
285abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm#ifdef UNW_LOCAL_ONLY
295abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm# include "Lcursor_i.h"
305abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm# define ia64_install_cursor	_ULia64_install_cursor
315abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm#else
325abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm# include "Gcursor_i.h"
335abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm# define ia64_install_cursor	_Uia64_install_cursor
345abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm#endif
355abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
365abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm#define SYS_sigreturn	1181
375abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
385abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm#ifndef UNW_REMOTE_ONLY
395abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
400aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm/*  ia64_install_cursor (const cursor *c, long pri_unat, long *extra,
410aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm			 long bspstore, long dirty_size, long *dirty_partition,
420aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm			 long dirty_rnat)
435abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
445abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm  Restores the machine-state represented by C and thereby resumes execution
455abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm  in that frame.  If the frame or one of its descendants was interrupted
465abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm  by a signal, all registers are restored (including the signal mask).
475abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm  Otherwise, only the preserved registers, the global-pointer (r1), and
485abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm  the exception-arguments (r15-r18) are restored.  */
495abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
505abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm#define pRet	p6
515abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm#define pSig	p7
525abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
535abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	.align 32
545abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	.hidden ia64_install_cursor
555abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	.global ia64_install_cursor
565abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	.proc ia64_install_cursor
575abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidmia64_install_cursor:
580aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	alloc r3 = ar.pfs, 7, 0, 0, 0
595abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	invala
605abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	add r2 = FR_LOC_OFF, in0
615abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
625abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
635abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r16 = [r2], LOC_SIZE	// r16 = loc[IA64_REG_FR16]
645abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov.m r10 = ar.rsc		// (ar.rsc: ~ 12 cycle latency)
655abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	add r3 = FR_LOC_OFF + 16, in0
665abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
675abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
685abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r17 = [r2], 2*LOC_SIZE	// r17 = loc[IA64_REG_FR17]
695abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r18 = [r3], 2*LOC_SIZE	// r18 = loc[IA64_REG_FR18]
705abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r16 = -4, r16
715abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
725abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
735abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r19 = [r2], 2*LOC_SIZE	// r19 = loc[IA64_REG_FR19]
745abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r20 = [r3], 2*LOC_SIZE	// r20 = loc[IA64_REG_FR20]
755abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r17 = -4, r17
765abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
775abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
785abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f16 = [r16]		// f16 restored (don't touch no more)
795abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f17 = [r17]		// f17 restored (don't touch no more)
805abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r18 = -4, r18
815abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
825abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r21 = [r2], 2*LOC_SIZE	// r21 = loc[IA64_REG_FR21]
835abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r22 = [r3], 2*LOC_SIZE	// r22 = loc[IA64_REG_FR22]
845abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r19 = -4, r19
855abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
865abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
875abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f18 = [r18]		// f18 restored (don't touch no more)
885abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f19 = [r19]		// f19 restored (don't touch no more)
895abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r20 = -4, r20
905abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
915abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r23 = [r2], 2*LOC_SIZE	// r23 = loc[IA64_REG_FR23]
925abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r24 = [r3], 2*LOC_SIZE	// r24 = loc[IA64_REG_FR24]
935abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r21 = -4, r21
945abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
955abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
965abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f20 = [r20]		// f20 restored (don't touch no more)
975abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f21 = [r21]		// f21 restored (don't touch no more)
985abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r22 = -4, r22
995abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1005abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r25 = [r2], 2*LOC_SIZE	// r25 = loc[IA64_REG_FR25]
1015abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r26 = [r3], 2*LOC_SIZE	// r26 = loc[IA64_REG_FR26]
1025abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r23 = -4, r23
1035abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1045abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1055abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f22 = [r22]		// f22 restored (don't touch no more)
1065abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f23 = [r23]		// f23 restored (don't touch no more)
1075abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r24 = -4, r24
1085abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1095abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r27 = [r2], 2*LOC_SIZE	// r27 = loc[IA64_REG_FR27]
1105abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r28 = [r3], 2*LOC_SIZE	// r28 = loc[IA64_REG_FR28]
1115abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r25 = -4, r25
1125abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1135abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1145abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f24 = [r24]		// f24 restored (don't touch no more)
1155abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f25 = [r25]		// f25 restored (don't touch no more)
1165abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r26 = -4, r26
1175abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1185abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r29 = [r2], 2*LOC_SIZE	// r29 = loc[IA64_REG_FR29]
1195abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r30 = [r3], 2*LOC_SIZE	// r30 = loc[IA64_REG_FR30]
1205abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r27 = -4, r27
1215abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1225abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1235abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f26 = [r26]		// f26 restored (don't touch no more)
1245abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f27 = [r27]		// f27 restored (don't touch no more)
1255abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r28 = -4, r28
1265abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1275abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r31 = [r2]			// r31 = loc[IA64_REG_FR31]
1285abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov.m ar.unat = in1
1295abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r29 = -4, r29
1305abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1315abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1325abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f28 = [r28]		// f28 restored (don't touch no more)
1335abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f29 = [r29]		// f29 restored (don't touch no more)
1345abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r30 = -4, r30
1355abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1365abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r1 = [in2], 8		// gp restored (don't touch no more)
1375abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	add r8 = SIGCONTEXT_ADDR_OFF, in0
1385abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r31 = -4, r31
1395abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1405abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1415abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r8 = [r8]			// r8 = sigcontext_addr
1425abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r11 = 0x1c, r10		// clear all but rsc.be and rsc.pl
1435abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	add r2 = PFS_LOC_OFF, in0
1445abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1455abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f30 = [r30]		// f30 restored (don't touch no more)
1465abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f31 = [r31]		// f31 restored (don't touch no more)
1475abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	add r3 = 8, in2
1485abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1495abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1505abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8.fill r4 = [in2], 16		// r4 restored (don't touch no more)
1515abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8.fill r5 = [r3], 16		// r5 restored (don't touch no more)
1525abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	cmp.eq pRet, pSig = r0, r8	// sigcontext_addr == NULL?
1535abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1545abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8.fill r6 = [in2], 16		// r6 restored (don't touch no more)
1555abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8.fill r7 = [r3]		// r7 restored (don't touch no more)
1565abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	add r3 = IP_OFF, in0
1575abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1585abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1595abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r14 = [r2], (B1_LOC_OFF - PFS_LOC_OFF)	// r14 = pfs_loc
1605abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r15 = [r3]			// r15 = ip
1615abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	add r3 = (B2_LOC_OFF - IP_OFF), r3
1625abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1635abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1645abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r16 = [r2], (B3_LOC_OFF - B1_LOC_OFF)	// r16 = b1_loc
1655abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r17= [r3], (B4_LOC_OFF - B2_LOC_OFF)	// r17 = b2_loc
1665abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r14 = -4, r14
1675abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1685abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1695abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r18 = [r2], (B5_LOC_OFF - B3_LOC_OFF)	// r18 = b3_loc
1705abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r19 = [r3], (F2_LOC_OFF - B4_LOC_OFF)	// r19 = b4_loc
1715abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r16 = -4, r16
1725abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1735abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1745abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r20 = [r2], (F3_LOC_OFF - B5_LOC_OFF)	// r20 = b5_loc
1755abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r21 = [r3], (F4_LOC_OFF - F2_LOC_OFF)	// r21 = f2_loc
1765abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r17 = -4, r17
1775abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1785abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1795abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r16 = [r16]			// r16 = *b1_loc
1805abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r17 = [r17]			// r17 = *b2_loc
1815abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r18 = -4, r18
1825abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1835abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r22 = [r2], (F5_LOC_OFF - F3_LOC_OFF)	// r21 = f3_loc
1845abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r23 = [r3], (UNAT_LOC_OFF - F4_LOC_OFF)	// r22 = f4_loc
1855abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r19 = -4, r19
1865abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1875abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1885abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r18 = [r18]			// r18 = *b3_loc
1895abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r19 = [r19]			// r19 = *b4_loc
1905abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r20 = -4, r20
1915abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1925abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r24 = [r2], (LC_LOC_OFF - F5_LOC_OFF)	// r24 = f5_loc
1935abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r25 = [r3], (FPSR_LOC_OFF - UNAT_LOC_OFF)	// r25 = unat_loc
1945abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r21 = -4, r21
1955abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
1965abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
1975abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r22 = -4, r22
1985abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r23 = -4, r23
1995abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r24 = -4, r24
2005abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2015abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r20 = [r20]			// r20 = *b5_loc
2025abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f2 = [r21]		// f2 restored (don't touch no more)
2035abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov b1 = r16			// b1 restored (don't touch no more)
2045abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
2055abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2065abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f3 = [r22]		// f3 restored (don't touch no more)
2075abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f4 = [r23]		// f4 restored (don't touch no more)
2085abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov b2 = r17			// b2 restored (don't touch no more)
2095abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2105abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r26 = [r2], (RNAT_LOC_OFF - LC_LOC_OFF)	// r26 = lc_loc
2115abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r27 = [r3]			// r27 = fpsr_loc
2125abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r25 = -4, r25
2135abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2145abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	add r3 = (PSP_OFF - FPSR_LOC_OFF), r3
2155abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	nop 0
2165abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	nop 0
2175abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
2185abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2195abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f5 = [r24]		// f5 restored (don't touch no more)
2205abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm(pRet)	ld8 r25 = [r25]			// r25 = *unat_loc
2215abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov b3 = r18			// b3 restored (don't touch no more)
2225abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2235abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r28 = [r2], (BSP_OFF - RNAT_LOC_OFF)	// r28 = rnat_loc
2245abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r29 = [r3], (PR_OFF - PSP_OFF)		// r29 = sp
2255abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov b4 = r19			// b4 restored (don't touch no more)
2265abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2275abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r26 = -4, r26
2285abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r27 = -4, r27
2295abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov b5 = r20			// b5 restored (don't touch no more)
2305abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
2315abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2325abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r26 = [r26]			// r26 = *lc_loc
2335abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r27 = [r27]			// r27 = *fpsr_loc
2345abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	and r28 = -4, r28
2355abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2360aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	mov r30 = in3			// make backup-copy of new bsp
2375abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r31 = [r3]			// r31 = pr
2385abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov rp = r15
2395abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
2405abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2415abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r28 = [r28]			// r28 = rnat
2425abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov.m ar.rsc = r11		// put RSE into enforced lazy mode
2435abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov.i ar.lc = r26		// lc restored (don't touch no more)
2445abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
2455abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2465abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	loadrs				// drop dirty partition
2470aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	mov r9 = in2			// make backup-copy of &extra[r16]
2480aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	cmp.eq p8, p0 = in4, r0		// dirty-size == 0?
2490aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm(p8)	br.cond.dpnt.many .skip_load_dirty
2500aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm
2510aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	mov r2 = in4			// make backup-copy of dirty_size
2520aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	mov r15 = in5			// make backup-copy of dirty_partition
2530aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	mov r16 = in6			// make backup-copy of dirty_rnat
2540aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	;;
2550aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm
2560aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	alloc r3 = ar.pfs, 0, 0, 0, 0	// drop register frame
2570aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	dep r11 = r2, r11, 16, 16
2580aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	;;
2590aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	mov.m ar.bspstore = r15
2605abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
2610aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	mov.m ar.rnat = r16
2620aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	mov.m ar.rsc = r11		// 14 cycles latency to loadrs
2630aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	;;
2640aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	loadrs				// loadup new dirty partition
2650aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	;;
2660aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm
2670aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm.skip_load_dirty:
2685abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov.m ar.bspstore = r30		// restore register backing-store
2690aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	add r3 = 8, r9			// r3 = &extra[r16]
2705abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
2715abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2725abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm(pRet)	mov.m ar.fpsr = r27		// fpsr restored (don't touch no more)
2735abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov.m ar.rnat = r28
2745abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm(pSig)	br.cond.dpnt.many .next
2755abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2765abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm/****** Return via br.ret: */
2775abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2785abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r14 = [r14]			// r14 = *pfs_loc
2790aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	ld8 r15 = [r9], 16		// r15 restored (don't touch no more)
2805abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov pr = r31, -1		// pr restored (don't touch no more)
2815abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
2825abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2835abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r16 = [r3], 16		// r16 restored (don't touch no more)
2840aa29032f620f291476f449c0cce49a03324e6c6hp.com!davidm	ld8 r17 = [r9]			// r17 restored (don't touch no more)
2855abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	nop.i 0
2865abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
2875abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2885abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r18 = [r3]			// r18 restored (don't touch no more)
2895abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov.m ar.rsc = r10		// restore original ar.rsc
2905abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov sp = r29
2915abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2925abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov.m ar.unat = r25		// unat restored (don't touch no more)
2935abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov.i ar.pfs = r14
2945abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	br.ret.sptk.many rp
2955abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
2965abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2975abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm/****** Return via sigreturn(): */
2985abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
2995abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm.next:	mov.m ar.rsc = r10		// restore original ar.rsc
3005abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	add r2 = (SC_FR + 6*16), r8
3015abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	add r3 = (SC_FR + 7*16), r8
3025abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
3035abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
3045abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f6 = [r2], 32
3055abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f7 = [r3], 32
3065abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	nop 0
3075abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
3085abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
3095abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f8 = [r2], 32
3105abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f9 = [r3], 32
3115abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	nop 0
3125abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
3135abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
3145abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f10 = [r2], 32
3155abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f11 = [r3], 32
3165abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	nop 0
3175abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
3185abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
3195abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f12 = [r2], 32
3205abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f13 = [r3], 32
3215abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	nop 0
3225abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
3235abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
3245abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f14 = [r2], 32
3255abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ldf.fill f15 = [r3], 32
3265abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov sp = r29
3275abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
3285abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
3295abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm#if NEW_SYSCALL
3305abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	add r2 = 8, tp;;
3315abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	ld8 r2 = [r2]
3325abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov r15 = SYS_sigreturn
3335abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov b7 = r2
3345abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	br.call.sptk.many b6 = b7
3355abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	;;
3365abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm#else
3375abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	mov r15 = SYS_sigreturn
3385abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	break 0x100000
3395abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm#endif
3405abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	break 0				// bug out if sigreturn() returns
3415abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
3425abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm	.endp ia64_install_cursor
3435abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm
3445abc74b276e25e964deb4da1a9026c5ba4f4c13fhomeip.net!davidm#endif /* !UNW_REMOTE_ONLY */
34557e569646368cb730f028ecf1732143474e3e642Jan Kratochvil#ifdef __linux__
34657e569646368cb730f028ecf1732143474e3e642Jan Kratochvil	/* We do not need executable stack.  */
34757e569646368cb730f028ecf1732143474e3e642Jan Kratochvil	.section	.note.GNU-stack,"",@progbits
34857e569646368cb730f028ecf1732143474e3e642Jan Kratochvil#endif
349