1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Early IDT handler entry points
4 *
5 * Copyright (C) 2019 SUSE
6 *
7 * Author: Joerg Roedel <jroedel@suse.de>
8 */
9
10#include <asm/segment.h>
11
12/* For ORIG_RAX */
13#include "../../entry/calling.h"
14
15.macro EXCEPTION_HANDLER name function error_code=0
16SYM_FUNC_START(\name)
17
18	/* Build pt_regs */
19	.if \error_code == 0
20	pushq   $0
21	.endif
22
23	pushq   %rdi
24	pushq   %rsi
25	pushq   %rdx
26	pushq   %rcx
27	pushq   %rax
28	pushq   %r8
29	pushq   %r9
30	pushq   %r10
31	pushq   %r11
32	pushq   %rbx
33	pushq   %rbp
34	pushq   %r12
35	pushq   %r13
36	pushq   %r14
37	pushq   %r15
38
39	/* Call handler with pt_regs */
40	movq    %rsp, %rdi
41	/* Error code is second parameter */
42	movq	ORIG_RAX(%rsp), %rsi
43	call    \function
44
45	/* Restore regs */
46	popq    %r15
47	popq    %r14
48	popq    %r13
49	popq    %r12
50	popq    %rbp
51	popq    %rbx
52	popq    %r11
53	popq    %r10
54	popq    %r9
55	popq    %r8
56	popq    %rax
57	popq    %rcx
58	popq    %rdx
59	popq    %rsi
60	popq    %rdi
61
62	/* Remove error code and return */
63	addq    $8, %rsp
64
65	iretq
66SYM_FUNC_END(\name)
67	.endm
68
69	.text
70	.code64
71
72EXCEPTION_HANDLER	boot_page_fault do_boot_page_fault error_code=1
73EXCEPTION_HANDLER	boot_nmi_trap do_boot_nmi_trap error_code=0
74
75#ifdef CONFIG_AMD_MEM_ENCRYPT
76EXCEPTION_HANDLER	boot_stage1_vc do_vc_no_ghcb		error_code=1
77EXCEPTION_HANDLER	boot_stage2_vc do_boot_stage2_vc	error_code=1
78#endif
79