xref: /openbmc/linux/arch/x86/boot/compressed/idt_handlers_64.S (revision 87832e937c808a7ebc41254b408362e3255c87c9)
164e68263SJoerg Roedel/* SPDX-License-Identifier: GPL-2.0-only */
264e68263SJoerg Roedel/*
364e68263SJoerg Roedel * Early IDT handler entry points
464e68263SJoerg Roedel *
564e68263SJoerg Roedel * Copyright (C) 2019 SUSE
664e68263SJoerg Roedel *
764e68263SJoerg Roedel * Author: Joerg Roedel <jroedel@suse.de>
864e68263SJoerg Roedel */
964e68263SJoerg Roedel
1064e68263SJoerg Roedel#include <asm/segment.h>
1164e68263SJoerg Roedel
1264e68263SJoerg Roedel/* For ORIG_RAX */
1364e68263SJoerg Roedel#include "../../entry/calling.h"
1464e68263SJoerg Roedel
1564e68263SJoerg Roedel.macro EXCEPTION_HANDLER name function error_code=0
1664e68263SJoerg RoedelSYM_FUNC_START(\name)
1764e68263SJoerg Roedel
1864e68263SJoerg Roedel	/* Build pt_regs */
1964e68263SJoerg Roedel	.if \error_code == 0
2064e68263SJoerg Roedel	pushq   $0
2164e68263SJoerg Roedel	.endif
2264e68263SJoerg Roedel
2364e68263SJoerg Roedel	pushq   %rdi
2464e68263SJoerg Roedel	pushq   %rsi
2564e68263SJoerg Roedel	pushq   %rdx
2664e68263SJoerg Roedel	pushq   %rcx
2764e68263SJoerg Roedel	pushq   %rax
2864e68263SJoerg Roedel	pushq   %r8
2964e68263SJoerg Roedel	pushq   %r9
3064e68263SJoerg Roedel	pushq   %r10
3164e68263SJoerg Roedel	pushq   %r11
3264e68263SJoerg Roedel	pushq   %rbx
3364e68263SJoerg Roedel	pushq   %rbp
3464e68263SJoerg Roedel	pushq   %r12
3564e68263SJoerg Roedel	pushq   %r13
3664e68263SJoerg Roedel	pushq   %r14
3764e68263SJoerg Roedel	pushq   %r15
3864e68263SJoerg Roedel
3964e68263SJoerg Roedel	/* Call handler with pt_regs */
4064e68263SJoerg Roedel	movq    %rsp, %rdi
4164e68263SJoerg Roedel	/* Error code is second parameter */
4264e68263SJoerg Roedel	movq	ORIG_RAX(%rsp), %rsi
4364e68263SJoerg Roedel	call    \function
4464e68263SJoerg Roedel
4564e68263SJoerg Roedel	/* Restore regs */
4664e68263SJoerg Roedel	popq    %r15
4764e68263SJoerg Roedel	popq    %r14
4864e68263SJoerg Roedel	popq    %r13
4964e68263SJoerg Roedel	popq    %r12
5064e68263SJoerg Roedel	popq    %rbp
5164e68263SJoerg Roedel	popq    %rbx
5264e68263SJoerg Roedel	popq    %r11
5364e68263SJoerg Roedel	popq    %r10
5464e68263SJoerg Roedel	popq    %r9
5564e68263SJoerg Roedel	popq    %r8
5664e68263SJoerg Roedel	popq    %rax
5764e68263SJoerg Roedel	popq    %rcx
5864e68263SJoerg Roedel	popq    %rdx
5964e68263SJoerg Roedel	popq    %rsi
6064e68263SJoerg Roedel	popq    %rdi
6164e68263SJoerg Roedel
6264e68263SJoerg Roedel	/* Remove error code and return */
6364e68263SJoerg Roedel	addq    $8, %rsp
6464e68263SJoerg Roedel
6564e68263SJoerg Roedel	iretq
6664e68263SJoerg RoedelSYM_FUNC_END(\name)
6764e68263SJoerg Roedel	.endm
6864e68263SJoerg Roedel
6964e68263SJoerg Roedel	.text
7064e68263SJoerg Roedel	.code64
718b0d3b3bSJoerg Roedel
728b0d3b3bSJoerg RoedelEXCEPTION_HANDLER	boot_page_fault do_boot_page_fault error_code=1
73*f77cb047SJun'ichi NomuraEXCEPTION_HANDLER	boot_nmi_trap do_boot_nmi_trap error_code=0
7429dcc60fSJoerg Roedel
7529dcc60fSJoerg Roedel#ifdef CONFIG_AMD_MEM_ENCRYPT
7629dcc60fSJoerg RoedelEXCEPTION_HANDLER	boot_stage1_vc do_vc_no_ghcb		error_code=1
77597cfe48SJoerg RoedelEXCEPTION_HANDLER	boot_stage2_vc do_boot_stage2_vc	error_code=1
7829dcc60fSJoerg Roedel#endif
79