xref: /freebsd/sys/i386/i386/sigtramp.S (revision 29363fb446372cb3f10bc98664e9767c53fbb457)
1/*-
2 * Copyright (c) 1990 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * William Jolitz.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 *    may be used to endorse or promote products derived from this software
18 *    without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 *
32 *		originally from: locore.s, by William F. Jolitz
33 *
34 *		Substantially rewritten by David Greenman, Rod Grimes,
35 *			Bruce Evans, Wolfgang Solfrank, Poul-Henning Kamp
36 *			and many others.
37 */
38
39#include <sys/syscall.h>
40#include <machine/asmacros.h>
41#include <machine/psl.h>
42
43#include "assym.inc"
44
45/*
46 * Signal trampoline, copied to top of user stack
47 */
48ENTRY(sigcode)
49	calll	*SIGF_HANDLER(%esp)
50	leal	SIGF_UC(%esp),%eax	/* get ucontext */
51	pushl	%eax
52	testl	$PSL_VM,UC_EFLAGS(%eax)
53	jne	1f
54	mov	UC_GS(%eax),%gs		/* restore %gs */
551:
56	movl	$SYS_sigreturn,%eax
57	pushl	%eax			/* junk to fake return addr. */
58	int	$0x80			/* enter kernel with args */
59					/* on stack */
601:
61	jmp	1b
62
63#ifdef COMPAT_FREEBSD4
64	ALIGN_TEXT
65freebsd4_sigcode:
66	calll	*SIGF_HANDLER(%esp)
67	leal	SIGF_UC4(%esp),%eax	/* get ucontext */
68	pushl	%eax
69	testl	$PSL_VM,UC4_EFLAGS(%eax)
70	jne	1f
71	mov	UC4_GS(%eax),%gs	/* restore %gs */
721:
73	movl	$344,%eax		/* 4.x SYS_sigreturn */
74	pushl	%eax			/* junk to fake return addr. */
75	int	$0x80			/* enter kernel with args */
76					/* on stack */
771:
78	jmp	1b
79#endif
80
81#ifdef COMPAT_43
82	ALIGN_TEXT
83osigcode:
84	call	*SIGF_HANDLER(%esp)	/* call signal handler */
85	lea	SIGF_SC(%esp),%eax	/* get sigcontext */
86	pushl	%eax
87	testl	$PSL_VM,SC_PS(%eax)
88	jne	9f
89	mov	SC_GS(%eax),%gs		/* restore %gs */
909:
91	movl	$103,%eax		/* 3.x SYS_sigreturn */
92	pushl	%eax			/* junk to fake return addr. */
93	int	$0x80			/* enter kernel with args */
940:	jmp	0b
95
96/*
97 * Our lcall $7,$0 handler remains in user mode (ring 3), since lcalls
98 * don't change the interrupt mask, so if this one went directly to the
99 * kernel then there would be a window with interrupts enabled in kernel
100 * mode, and all interrupt handlers would have to be almost as complicated
101 * as the NMI handler to support this.
102 *
103 * Instead, convert the lcall to an int0x80 call.  The kernel does most
104 * of the conversion by popping the lcall return values off the user
105 * stack and returning to them instead of to here, except when the
106 * conversion itself fails.  Adjusting the stack here is impossible for
107 * vfork() and harder for other syscalls.
108 */
109	ALIGN_TEXT
110lcall_tramp:
111	int	$0x80
1121:	jmp	1b
113
114#endif /* COMPAT_43 */
115
116	ALIGN_TEXT
117esigcode:
118
119	.data
120	.globl	szsigcode
121szsigcode:
122	.long	esigcode-sigcode
123#ifdef COMPAT_FREEBSD4
124	.globl	szfreebsd4_sigcode
125szfreebsd4_sigcode:
126	.long	esigcode-freebsd4_sigcode
127#endif
128#ifdef COMPAT_43
129	.globl	szosigcode
130szosigcode:
131	.long	esigcode-osigcode
132	.globl	sz_lcall_tramp
133sz_lcall_tramp:
134	.long	esigcode-lcall_tramp
135#endif
136