summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/vax/__longjmp.S
blob: 61b37a3b90d0aa7137147d80da61fb8ac69608d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <features.h>

/*
 * longjmp.S	atp sept 2001
 *		Jan-Benedict Glaw <jbglaw@lug-owl.de> 2006
 *
 * Restore regs and info and jmp back to a previous setjmp
 */

.globl	__longjmp
.align	4
__longjmp:
	.word	0x0040		/* This matches setjmp and PLT	*/
	movl	0x4(%ap), %r0	/* Our scratch reg		*/
/*	movl	$0, %r0						*/
/*	movl	(%r0), %r0					*/
	/* We are going to modify our stack frame		*/
	/* to the same as that of the setjmp we called earlier	*/
	movl	(%r0), (%fp)		/* cond handler		*/
	movl	0x4(%r0), 0x4(%fp)	/* psw			*/
	movl	0x8(%r0), 0x8(%fp)	/* ap			*/
	movl	0xc(%r0), 0xc(%fp)	/* fp			*/
	movl	0x10(%r0), 0x10(%fp)	/* pc			*/

	/* Restore the regs					*/
	movl	0x14(%r0), %r1
	movl	0x18(%r0), %r2
	movl	0x1c(%r0), %r3
	movl	0x20(%r0), %r4
	movl	0x24(%r0), %r5
	movl	0x28(%r0), %r6
	movl	0x2c(%r0), %r7
	movl	0x30(%r0), %r8
	movl	0x34(%r0), %r9
	movl	0x38(%r0), %r10
	movl	0x3c(%r0), %r11

	/* Check val and set to 1 if set to zero		*/
	movl	0x8(%ap), %r0
	tstl	%r0
	bneq	exit_ok
	movl	$0x1, %r0
exit_ok:
	ret
.size __longjmp,.-__longjmp
libc_hidden_def(__longjmp)