xref: /freebsd/sys/amd64/ia32/ia32_exception.S (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1d85631c4SPeter Wemm/*-
2d85631c4SPeter Wemm * Copyright (c) 2003 Peter Wemm
3d85631c4SPeter Wemm * All rights reserved.
4d85631c4SPeter Wemm *
5d85631c4SPeter Wemm * Redistribution and use in source and binary forms, with or without
6d85631c4SPeter Wemm * modification, are permitted provided that the following conditions
7d85631c4SPeter Wemm * are met:
8d85631c4SPeter Wemm * 1. Redistributions of source code must retain the above copyright
9d85631c4SPeter Wemm *    notice, this list of conditions and the following disclaimer.
10d85631c4SPeter Wemm * 2. Redistributions in binary form must reproduce the above copyright
11d85631c4SPeter Wemm *    notice, this list of conditions and the following disclaimer in the
12d85631c4SPeter Wemm *    documentation and/or other materials provided with the distribution.
13d85631c4SPeter Wemm *
14d85631c4SPeter Wemm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15d85631c4SPeter Wemm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16d85631c4SPeter Wemm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17d85631c4SPeter Wemm * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18d85631c4SPeter Wemm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19d85631c4SPeter Wemm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20d85631c4SPeter Wemm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21d85631c4SPeter Wemm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22d85631c4SPeter Wemm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23d85631c4SPeter Wemm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24d85631c4SPeter Wemm * SUCH DAMAGE.
25d85631c4SPeter Wemm */
26d85631c4SPeter Wemm
27d85631c4SPeter Wemm#include <machine/asmacros.h>
28d85631c4SPeter Wemm
29fc2a8776SEd Maste#include "assym.inc"
30d85631c4SPeter Wemm
31d85631c4SPeter Wemm	.text
32d85631c4SPeter Wemm/*
33d85631c4SPeter Wemm * Call gate entry for FreeBSD ELF and Linux/NetBSD syscall (int 0x80)
34d85631c4SPeter Wemm *
35d85631c4SPeter Wemm * This is a SDT_SYSIDT entry point (unlike the i386 port) so that we
36d85631c4SPeter Wemm * can do a swapgs before enabling interrupts.  This is critical because
37d85631c4SPeter Wemm * if we took an interrupt before swapgs, the interrupt code would see
38d85631c4SPeter Wemm * that it originated in supervisor mode and skip the swapgs.
39d85631c4SPeter Wemm */
40d85631c4SPeter Wemm	SUPERALIGN_TEXT
41bd50262fSKonstantin BelousovIDTVEC(int0x80_syscall_pti)
42bd50262fSKonstantin Belousov	PTI_UENTRY has_err=0
43bd50262fSKonstantin Belousov	jmp	int0x80_syscall_common
44bd50262fSKonstantin Belousov	SUPERALIGN_TEXT
45d85631c4SPeter WemmIDTVEC(int0x80_syscall)
46d85631c4SPeter Wemm	swapgs
47bd50262fSKonstantin Belousovint0x80_syscall_common:
48d85631c4SPeter Wemm	pushq	$2			/* sizeof "int 0x80" */
49d85631c4SPeter Wemm	subq	$TF_ERR,%rsp		/* skip over tf_trapno */
50d85631c4SPeter Wemm	movq	%rdi,TF_RDI(%rsp)
51a2622e5dSKonstantin Belousov	movq	PCPU(CURPCB),%rdi
52ff265077SJohn Baldwin	andl	$~PCB_FULL_IRET,PCB_FLAGS(%rdi)
53bd50262fSKonstantin Belousov	SAVE_SEGS
54319117fdSKonstantin Belousov	movq	%rax,TF_RAX(%rsp)
55d85631c4SPeter Wemm	movq	%rdx,TF_RDX(%rsp)
56d85631c4SPeter Wemm	movq	%rcx,TF_RCX(%rsp)
57319117fdSKonstantin Belousov	call	handle_ibrs_entry
58319117fdSKonstantin Belousov	sti
59319117fdSKonstantin Belousov	movq	%rsi,TF_RSI(%rsp)
60d85631c4SPeter Wemm	movq	%r8,TF_R8(%rsp)
61d85631c4SPeter Wemm	movq	%r9,TF_R9(%rsp)
62d85631c4SPeter Wemm	movq	%rbx,TF_RBX(%rsp)
63d85631c4SPeter Wemm	movq	%rbp,TF_RBP(%rsp)
64d85631c4SPeter Wemm	movq	%r10,TF_R10(%rsp)
65d85631c4SPeter Wemm	movq	%r11,TF_R11(%rsp)
66d85631c4SPeter Wemm	movq	%r12,TF_R12(%rsp)
67d85631c4SPeter Wemm	movq	%r13,TF_R13(%rsp)
68d85631c4SPeter Wemm	movq	%r14,TF_R14(%rsp)
69d85631c4SPeter Wemm	movq	%r15,TF_R15(%rsp)
702c66cccaSKonstantin Belousov	movl	$TF_HASSEGS,TF_FLAGS(%rsp)
71*b3a7db3bSKonstantin Belousov	pushfq
72*b3a7db3bSKonstantin Belousov	andq	$~(PSL_D | PSL_AC),(%rsp)
73*b3a7db3bSKonstantin Belousov	popfq
74e5f8d409SKip Macy	movq	%rsp, %rdi
75d85631c4SPeter Wemm	call	ia32_syscall
76d85631c4SPeter Wemm	jmp	doreti
77