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