xref: /freebsd/lib/libc/i386/gen/sigsetjmp.S (revision 646c5b4840f4d31cf856f513b1e618d066a13058)
12ceb2ce9SGarrett Wollman/*-
22ceb2ce9SGarrett Wollman * Copyright (c) 1990 The Regents of the University of California.
32ceb2ce9SGarrett Wollman * All rights reserved.
42ceb2ce9SGarrett Wollman *
52ceb2ce9SGarrett Wollman * This code is derived from software contributed to Berkeley by
62ceb2ce9SGarrett Wollman * William Jolitz.
72ceb2ce9SGarrett Wollman *
82ceb2ce9SGarrett Wollman * Redistribution and use in source and binary forms, with or without
92ceb2ce9SGarrett Wollman * modification, are permitted provided that the following conditions
102ceb2ce9SGarrett Wollman * are met:
112ceb2ce9SGarrett Wollman * 1. Redistributions of source code must retain the above copyright
122ceb2ce9SGarrett Wollman *    notice, this list of conditions and the following disclaimer.
132ceb2ce9SGarrett Wollman * 2. Redistributions in binary form must reproduce the above copyright
142ceb2ce9SGarrett Wollman *    notice, this list of conditions and the following disclaimer in the
152ceb2ce9SGarrett Wollman *    documentation and/or other materials provided with the distribution.
162ceb2ce9SGarrett Wollman * 4. Neither the name of the University nor the names of its contributors
172ceb2ce9SGarrett Wollman *    may be used to endorse or promote products derived from this software
182ceb2ce9SGarrett Wollman *    without specific prior written permission.
192ceb2ce9SGarrett Wollman *
202ceb2ce9SGarrett Wollman * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
212ceb2ce9SGarrett Wollman * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
222ceb2ce9SGarrett Wollman * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
232ceb2ce9SGarrett Wollman * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
242ceb2ce9SGarrett Wollman * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
252ceb2ce9SGarrett Wollman * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
262ceb2ce9SGarrett Wollman * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
272ceb2ce9SGarrett Wollman * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
282ceb2ce9SGarrett Wollman * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
292ceb2ce9SGarrett Wollman * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
302ceb2ce9SGarrett Wollman * SUCH DAMAGE.
310f4f0285SDavid E. O'Brien *
320f4f0285SDavid E. O'Brien *	@(#)setjmp.s	5.1 (Berkeley) 4/23/90"
332ceb2ce9SGarrett Wollman */
342ceb2ce9SGarrett Wollman
350f4f0285SDavid E. O'Brien#if defined(LIBC_SCCS) && !defined(lint)
36717d9cddSDavid Greenman	.text
370f4f0285SDavid E. O'Brien	.asciz "$Id: sigsetjmp.S,v 1.1 1993/12/05 13:01:05 ats Exp $"
380f4f0285SDavid E. O'Brien#endif /* LIBC_SCCS and not lint */
390f4f0285SDavid E. O'Brien#include <machine/asm.h>
400f4f0285SDavid E. O'Brien__FBSDID("$FreeBSD$");
412ceb2ce9SGarrett Wollman
422ceb2ce9SGarrett Wollman#include "SYS.h"
432ceb2ce9SGarrett Wollman
441a4206ddSBruce Evans/*-
451a4206ddSBruce Evans * TODO:
461a4206ddSBruce Evans *	Rename sigsetjmp to __sigsetjmp and siglongjmp to __siglongjmp,
471a4206ddSBruce Evans *	remove the other *jmp functions and define everything in terms
481a4206ddSBruce Evans *	of the renamed functions.  This requires compiler support for
491a4206ddSBruce Evans *	the renamed functions (introduced in gcc-2.5.3; previous versions
501a4206ddSBruce Evans *	only supported *jmp with 0 or 1 leading underscores).
511a4206ddSBruce Evans *
521a4206ddSBruce Evans *	Restore _all_ the registers and the signal mask atomically.  Can
531a4206ddSBruce Evans *	use sigreturn() if sigreturn() works.
541a4206ddSBruce Evans */
551a4206ddSBruce Evans
56bafd6b2fSJason EvansENTRY(sigsetjmp)
572ceb2ce9SGarrett Wollman	movl	8(%esp),%eax
582ceb2ce9SGarrett Wollman	movl	4(%esp),%ecx
593cf3c5d9SMarcel Moolenaar	movl	%eax,44(%ecx)
602ceb2ce9SGarrett Wollman	testl	%eax,%eax
61cbdc4399SJohn Polstra	jz	2f
62f1703dfbSPeter Wemm	PIC_PROLOGUE
631a9879c3SKonstantin Belousov#ifdef PIC
641a9879c3SKonstantin Belousov	subl	$12,%esp		/* make the stack 16-byte aligned */
651a9879c3SKonstantin Belousov#endif
663cf3c5d9SMarcel Moolenaar	leal	28(%ecx), %eax
673cf3c5d9SMarcel Moolenaar	pushl	%eax			/* (sigset_t*)oset */
683cf3c5d9SMarcel Moolenaar	pushl	$0			/* (sigset_t*)set  */
693cf3c5d9SMarcel Moolenaar	pushl	$1			/* SIG_BLOCK       */
70d201fe46SDaniel Eischen	call	PIC_PLT(CNAME(_sigprocmask))
711a9879c3SKonstantin Belousov#ifdef PIC
721a9879c3SKonstantin Belousov	addl	$24,%esp
731a9879c3SKonstantin Belousov#else
743cf3c5d9SMarcel Moolenaar	addl	$12,%esp
751a9879c3SKonstantin Belousov#endif
76f1703dfbSPeter Wemm	PIC_EPILOGUE
772ceb2ce9SGarrett Wollman	movl	4(%esp),%ecx
78cbdc4399SJohn Polstra2:	movl	0(%esp),%edx
792ceb2ce9SGarrett Wollman	movl	%edx, 0(%ecx)
802ceb2ce9SGarrett Wollman	movl	%ebx, 4(%ecx)
812ceb2ce9SGarrett Wollman	movl	%esp, 8(%ecx)
822ceb2ce9SGarrett Wollman	movl	%ebp,12(%ecx)
832ceb2ce9SGarrett Wollman	movl	%esi,16(%ecx)
842ceb2ce9SGarrett Wollman	movl	%edi,20(%ecx)
853cf3c5d9SMarcel Moolenaar	fnstcw	24(%ecx)
862ceb2ce9SGarrett Wollman	xorl	%eax,%eax
872ceb2ce9SGarrett Wollman	ret
88ed820052SPeter WemmEND(sigsetjmp)
892ceb2ce9SGarrett Wollman
90*646c5b48SAndreas Tobler	WEAK_REFERENCE(__siglongjmp, siglongjmp)
91ed820052SPeter WemmENTRY(__siglongjmp)
922ceb2ce9SGarrett Wollman	movl	4(%esp),%edx
933cf3c5d9SMarcel Moolenaar	cmpl	$0,44(%edx)
94cbdc4399SJohn Polstra	jz	2f
95f1703dfbSPeter Wemm	PIC_PROLOGUE
961a9879c3SKonstantin Belousov#ifdef PIC
971a9879c3SKonstantin Belousov	subl	$12,%esp		/* make the stack 16-byte aligned */
981a9879c3SKonstantin Belousov#endif
993cf3c5d9SMarcel Moolenaar	pushl	$0			/* (sigset_t*)oset */
1003cf3c5d9SMarcel Moolenaar	leal	28(%edx), %eax
1013cf3c5d9SMarcel Moolenaar	pushl	%eax			/* (sigset_t*)set  */
1023cf3c5d9SMarcel Moolenaar	pushl	$3			/* SIG_SETMASK     */
103d201fe46SDaniel Eischen	call	PIC_PLT(CNAME(_sigprocmask))
1041a9879c3SKonstantin Belousov#ifdef PIC
1051a9879c3SKonstantin Belousov	addl	$24,%esp
1061a9879c3SKonstantin Belousov#else
1073cf3c5d9SMarcel Moolenaar	addl	$12,%esp
1081a9879c3SKonstantin Belousov#endif
109f1703dfbSPeter Wemm	PIC_EPILOGUE
1103cf3c5d9SMarcel Moolenaar	movl	4(%esp),%edx
1113cf3c5d9SMarcel Moolenaar2:	movl	8(%esp),%eax
1122ceb2ce9SGarrett Wollman	movl	0(%edx),%ecx
1132ceb2ce9SGarrett Wollman	movl	4(%edx),%ebx
1142ceb2ce9SGarrett Wollman	movl	8(%edx),%esp
1152ceb2ce9SGarrett Wollman	movl	12(%edx),%ebp
1162ceb2ce9SGarrett Wollman	movl	16(%edx),%esi
1172ceb2ce9SGarrett Wollman	movl	20(%edx),%edi
1181a4206ddSBruce Evans	fninit
1193cf3c5d9SMarcel Moolenaar	fldcw	24(%edx)
1202ceb2ce9SGarrett Wollman	testl	%eax,%eax
121cbdc4399SJohn Polstra	jnz	1f
1222ceb2ce9SGarrett Wollman	incl	%eax
123cbdc4399SJohn Polstra1:	movl	%ecx,0(%esp)
1242ceb2ce9SGarrett Wollman	ret
125ed820052SPeter WemmEND(__siglongjmp)
12693ab7586SKonstantin Belousov
12793ab7586SKonstantin Belousov	.section .note.GNU-stack,"",%progbits
128