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