xref: /csrg-svn/lib/libc/i386/gen/setjmp.s (revision 41041)
1*41041Swilliam/*-
2*41041Swilliam * Copyright (c) 1990 The Regents of the University of California.
3*41041Swilliam * All rights reserved.
4*41041Swilliam *
5*41041Swilliam * This code is derived from software contributed to Berkeley by
6*41041Swilliam * William Jolitz.
7*41041Swilliam *
8*41041Swilliam * %sccs.include.redist.c%
9*41041Swilliam */
10*41041Swilliam
11*41041Swilliam#if defined(LIBC_SCCS) && !defined(lint)
12*41041Swilliam	.asciz "@(#)setjmp.s	5.1 (Berkeley) 04/23/90"
13*41041Swilliam#endif /* LIBC_SCCS and not lint */
14*41041Swilliam
15*41041Swilliam/*
16*41041Swilliam * C library -- _setjmp, _longjmp
17*41041Swilliam *
18*41041Swilliam *	longjmp(a,v)
19*41041Swilliam * will generate a "return(v)" from the last call to
20*41041Swilliam *	setjmp(a)
21*41041Swilliam * by restoring registers from the stack.
22*41041Swilliam * The previous signal state is restored.
23*41041Swilliam */
24*41041Swilliam
25*41041Swilliam#include "DEFS.h"
26*41041Swilliam
27*41041SwilliamENTRY(setjmp)
28*41041Swilliam	pushl	$0
29*41041Swilliam	call	_sigblock
30*41041Swilliam	popl	%edx
31*41041Swilliam	movl	4(%esp),%ecx
32*41041Swilliam	movl	0(%esp),%edx
33*41041Swilliam	movl	%edx, 0(%ecx)
34*41041Swilliam	movl	%ebx, 4(%ecx)
35*41041Swilliam	movl	%esp, 8(%ecx)
36*41041Swilliam	movl	%ebp,12(%ecx)
37*41041Swilliam	movl	%esi,16(%ecx)
38*41041Swilliam	movl	%edi,20(%ecx)
39*41041Swilliam	movl	%eax,24(%ecx)
40*41041Swilliam	movl	$0,%eax
41*41041Swilliam	ret
42*41041Swilliam
43*41041SwilliamENTRY(longjmp)
44*41041Swilliam	movl	4(%esp),%edx
45*41041Swilliam	pushl	24(%edx)
46*41041Swilliam	call	_sigsetmask
47*41041Swilliam	popl	%eax
48*41041Swilliam	movl	4(%esp),%edx
49*41041Swilliam	movl	8(%esp),%eax
50*41041Swilliam	movl	0(%edx),%ecx
51*41041Swilliam	movl	4(%edx),%ebx
52*41041Swilliam	movl	8(%edx),%esp
53*41041Swilliam	movl	12(%edx),%ebp
54*41041Swilliam	movl	16(%edx),%esi
55*41041Swilliam	movl	20(%edx),%edi
56*41041Swilliam	cmpl	$0,%eax
57*41041Swilliam	jne	1f
58*41041Swilliam	movl	$1,%eax
59*41041Swilliam1:	movl	%ecx,0(%esp)
60*41041Swilliam	ret
61