xref: /freebsd/sys/amd64/ia32/ia32_sigtramp.S (revision 95ee2897)
1d85631c4SPeter Wemm/*-
2d85631c4SPeter Wemm * Copyright (c) 2003 Peter Wemm
3d85631c4SPeter Wemm * All rights reserved.
4d85631c4SPeter Wemm *
58a4bd7f8SKonstantin Belousov * Copyright (c) 2021 The FreeBSD Foundation
68a4bd7f8SKonstantin Belousov *
78a4bd7f8SKonstantin Belousov * Portions of this software were developed by Konstantin Belousov
88a4bd7f8SKonstantin Belousov * under sponsorship from the FreeBSD Foundation.
98a4bd7f8SKonstantin Belousov *
10d85631c4SPeter Wemm * Redistribution and use in source and binary forms, with or without
11d85631c4SPeter Wemm * modification, are permitted provided that the following conditions
12d85631c4SPeter Wemm * are met:
13d85631c4SPeter Wemm * 1. Redistributions of source code must retain the above copyright
14d85631c4SPeter Wemm *    notice, this list of conditions and the following disclaimer.
15d85631c4SPeter Wemm * 2. Redistributions in binary form must reproduce the above copyright
16d85631c4SPeter Wemm *    notice, this list of conditions and the following disclaimer in the
17d85631c4SPeter Wemm *    documentation and/or other materials provided with the distribution.
18d85631c4SPeter Wemm *
19d85631c4SPeter Wemm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20d85631c4SPeter Wemm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21d85631c4SPeter Wemm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22d85631c4SPeter Wemm * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23d85631c4SPeter Wemm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24d85631c4SPeter Wemm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25d85631c4SPeter Wemm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26d85631c4SPeter Wemm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27d85631c4SPeter Wemm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28d85631c4SPeter Wemm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29d85631c4SPeter Wemm * SUCH DAMAGE.
30d85631c4SPeter Wemm */
31d85631c4SPeter Wemm
32d85631c4SPeter Wemm#include <machine/asmacros.h>
33d85631c4SPeter Wemm#include <sys/syscall.h>
34d85631c4SPeter Wemm
35d85631c4SPeter Wemm#include "ia32_assym.h"
36d85631c4SPeter Wemm
37d85631c4SPeter Wemm	.text
38d85631c4SPeter Wemm/*
3998c8b625SKonstantin Belousov * Signal trampoline, mapped as vdso into shared page, or copied to
4098c8b625SKonstantin Belousov * top of user stack for old binaries.
41d85631c4SPeter Wemm */
42d85631c4SPeter Wemm	ALIGN_TEXT
4398c8b625SKonstantin Belousov	.globl	__vdso_ia32_sigcode
4498c8b625SKonstantin Belousov__vdso_ia32_sigcode:
458a4bd7f8SKonstantin Belousov	.cfi_startproc
468a4bd7f8SKonstantin Belousov	.cfi_signal_frame
478a4bd7f8SKonstantin Belousov	.cfi_def_cfa	%esp, 0
488a4bd7f8SKonstantin Belousov#if 0
498a4bd7f8SKonstantin Belousov	.cfi_offset	%gs,  IA32_SIGF_UC + IA32_UC_GS
508a4bd7f8SKonstantin Belousov	.cfi_offset	%fs,  IA32_SIGF_UC + IA32_UC_FS
518a4bd7f8SKonstantin Belousov	.cfi_offset	%es,  IA32_SIGF_UC + IA32_UC_ES
528a4bd7f8SKonstantin Belousov	.cfi_offset	%ds,  IA32_SIGF_UC + IA32_UC_DS
538a4bd7f8SKonstantin Belousov#endif
548a4bd7f8SKonstantin Belousov	.cfi_offset	%edi, IA32_SIGF_UC + IA32_UC_EDI
558a4bd7f8SKonstantin Belousov	.cfi_offset	%esi, IA32_SIGF_UC + IA32_UC_ESI
568a4bd7f8SKonstantin Belousov	.cfi_offset	%ebp, IA32_SIGF_UC + IA32_UC_EBP
578a4bd7f8SKonstantin Belousov	.cfi_offset	%ebx, IA32_SIGF_UC + IA32_UC_EBX
588a4bd7f8SKonstantin Belousov	.cfi_offset	%edx, IA32_SIGF_UC + IA32_UC_EDX
598a4bd7f8SKonstantin Belousov	.cfi_offset	%ecx, IA32_SIGF_UC + IA32_UC_ECX
608a4bd7f8SKonstantin Belousov	.cfi_offset	%eax, IA32_SIGF_UC + IA32_UC_EAX
618a4bd7f8SKonstantin Belousov	.cfi_offset	%eip, IA32_SIGF_UC + IA32_UC_EIP
628a4bd7f8SKonstantin Belousov#if 0
638a4bd7f8SKonstantin Belousov	.cfi_offset	%cs,  IA32_SIGF_UC + IA32_UC_CS
648a4bd7f8SKonstantin Belousov	.cfi_offset	%flags, IA32_SIGF_UC + IA32_UC_EFLAGS
658a4bd7f8SKonstantin Belousov#endif
668a4bd7f8SKonstantin Belousov	.cfi_offset	%esp, IA32_SIGF_UC + IA32_UC_ESP
678a4bd7f8SKonstantin Belousov#if 0
688a4bd7f8SKonstantin Belousov	.cfi_offset	%ss,  IA32_SIGF_UC + IA32_UC_SS
698a4bd7f8SKonstantin Belousov	.cfi_offset	93 /* %fs.base */, IA32_SIGF_UC + IA32_UC_FSBASE
708a4bd7f8SKonstantin Belousov	.cfi_offset	94 /* %gs.base */, IA32_SIGF_UC + IA32_UC_GSBASE
718a4bd7f8SKonstantin Belousov#endif
72d85631c4SPeter Wemm	calll	*IA32_SIGF_HANDLER(%esp)
73d85631c4SPeter Wemm	leal	IA32_SIGF_UC(%esp),%eax	/* get ucontext */
74d85631c4SPeter Wemm	pushl	%eax
758a4bd7f8SKonstantin Belousov	.cfi_def_cfa	%esp, 4
76d85631c4SPeter Wemm	movl	$SYS_sigreturn,%eax
77d85631c4SPeter Wemm	pushl	%eax			/* junk to fake return addr. */
788a4bd7f8SKonstantin Belousov	.cfi_def_cfa	%esp, 8
79d85631c4SPeter Wemm	int	$0x80			/* enter kernel with args */
80d85631c4SPeter Wemm					/* on stack */
81d85631c4SPeter Wemm1:
82d85631c4SPeter Wemm	jmp	1b
838a4bd7f8SKonstantin Belousov	.cfi_endproc
84d85631c4SPeter Wemm
85d85631c4SPeter Wemm	ALIGN_TEXT
8698c8b625SKonstantin Belousov	.globl	__vdso_freebsd4_ia32_sigcode
8798c8b625SKonstantin Belousov__vdso_freebsd4_ia32_sigcode:
88ee844871SKonstantin Belousov#ifdef COMPAT_FREEBSD4
89d85631c4SPeter Wemm	calll	*IA32_SIGF_HANDLER(%esp)
90d85631c4SPeter Wemm	leal	IA32_SIGF_UC4(%esp),%eax/* get ucontext */
91d85631c4SPeter Wemm	pushl	%eax
92d85631c4SPeter Wemm	movl	$344,%eax		/* 4.x SYS_sigreturn */
93d85631c4SPeter Wemm	pushl	%eax			/* junk to fake return addr. */
94d85631c4SPeter Wemm	int	$0x80			/* enter kernel with args */
95d85631c4SPeter Wemm					/* on stack */
96d85631c4SPeter Wemm1:
97d85631c4SPeter Wemm	jmp	1b
98ee844871SKonstantin Belousov#else
99ee844871SKonstantin Belousov	ud2
100d85631c4SPeter Wemm#endif
101d85631c4SPeter Wemm
1027332c129SKonstantin Belousov	ALIGN_TEXT
10398c8b625SKonstantin Belousov	.globl	__vdso_ia32_osigcode
10498c8b625SKonstantin Belousov__vdso_ia32_osigcode:
105ee844871SKonstantin Belousov#ifdef COMPAT_43
1067332c129SKonstantin Belousov	calll	*IA32_SIGF_HANDLER(%esp)/* call signal handler */
1077332c129SKonstantin Belousov	leal	IA32_SIGF_SC(%esp),%eax	/* get sigcontext */
1087332c129SKonstantin Belousov	pushl	%eax
1097332c129SKonstantin Belousov	movl	$103,%eax		/* 3.x SYS_sigreturn */
1107332c129SKonstantin Belousov	pushl	%eax			/* junk to fake return addr. */
1117332c129SKonstantin Belousov	int	$0x80			/* enter kernel with args */
1127332c129SKonstantin Belousov1:
1137332c129SKonstantin Belousov	jmp	1b
114ee844871SKonstantin Belousov#else
115ee844871SKonstantin Belousov	ud2
116ee844871SKonstantin Belousov#endif
1177332c129SKonstantin Belousov
1181c23d0f7SKonstantin Belousov/*
119a37d4032SKonstantin Belousov * Our lcall $7,$0 handler remains in user mode (ring 3), since lcalls
120a37d4032SKonstantin Belousov * don't change the interrupt mask, so if this one went directly to the
121a37d4032SKonstantin Belousov * kernel then there would be a window with interrupts enabled in kernel
122a37d4032SKonstantin Belousov * mode, and all interrupt handlers would have to be almost as complicated
123a37d4032SKonstantin Belousov * as the NMI handler to support this.
1241c23d0f7SKonstantin Belousov *
125a37d4032SKonstantin Belousov * Instead, convert the lcall to an int0x80 call.  The kernel does most
126a37d4032SKonstantin Belousov * of the conversion by popping the lcall return values off the user
127a37d4032SKonstantin Belousov * stack and returning to them instead of to here, except when the
128a37d4032SKonstantin Belousov * conversion itself fails.  Adjusting the stack here is impossible for
129a37d4032SKonstantin Belousov * vfork() and harder for other syscalls.
1301c23d0f7SKonstantin Belousov */
1317332c129SKonstantin Belousov	ALIGN_TEXT
13298c8b625SKonstantin Belousov	.globl	__vdso_lcall_tramp
13398c8b625SKonstantin Belousov__vdso_lcall_tramp:
134ee844871SKonstantin Belousov#ifdef COMPAT_43
1357332c129SKonstantin Belousov	int	$0x80
136a37d4032SKonstantin Belousov1:	jmp	1b
137ee844871SKonstantin Belousov#else
138ee844871SKonstantin Belousov	ud2
1397332c129SKonstantin Belousov#endif
14098c8b625SKonstantin Belousov	.p2align 1
141