xref: /kernel/linux/linux-6.6/arch/x86/include/asm/tdx.h (revision 62306a36)
1/* SPDX-License-Identifier: GPL-2.0 */
2/* Copyright (C) 2021-2022 Intel Corporation */
3#ifndef _ASM_X86_TDX_H
4#define _ASM_X86_TDX_H
5
6#include <linux/init.h>
7#include <linux/bits.h>
8
9#include <asm/errno.h>
10#include <asm/ptrace.h>
11#include <asm/shared/tdx.h>
12
13/*
14 * SW-defined error codes.
15 *
16 * Bits 47:40 == 0xFF indicate Reserved status code class that never used by
17 * TDX module.
18 */
19#define TDX_ERROR			_BITUL(63)
20#define TDX_SW_ERROR			(TDX_ERROR | GENMASK_ULL(47, 40))
21#define TDX_SEAMCALL_VMFAILINVALID	(TDX_SW_ERROR | _UL(0xFFFF0000))
22
23#ifndef __ASSEMBLY__
24
25/*
26 * Used by the #VE exception handler to gather the #VE exception
27 * info from the TDX module. This is a software only structure
28 * and not part of the TDX module/VMM ABI.
29 */
30struct ve_info {
31	u64 exit_reason;
32	u64 exit_qual;
33	/* Guest Linear (virtual) Address */
34	u64 gla;
35	/* Guest Physical Address */
36	u64 gpa;
37	u32 instr_len;
38	u32 instr_info;
39};
40
41#ifdef CONFIG_INTEL_TDX_GUEST
42
43void __init tdx_early_init(void);
44
45void tdx_get_ve_info(struct ve_info *ve);
46
47bool tdx_handle_virt_exception(struct pt_regs *regs, struct ve_info *ve);
48
49void tdx_safe_halt(void);
50
51bool tdx_early_handle_ve(struct pt_regs *regs);
52
53int tdx_mcall_get_report0(u8 *reportdata, u8 *tdreport);
54
55#else
56
57static inline void tdx_early_init(void) { };
58static inline void tdx_safe_halt(void) { };
59
60static inline bool tdx_early_handle_ve(struct pt_regs *regs) { return false; }
61
62#endif /* CONFIG_INTEL_TDX_GUEST */
63
64#if defined(CONFIG_KVM_GUEST) && defined(CONFIG_INTEL_TDX_GUEST)
65long tdx_kvm_hypercall(unsigned int nr, unsigned long p1, unsigned long p2,
66		       unsigned long p3, unsigned long p4);
67#else
68static inline long tdx_kvm_hypercall(unsigned int nr, unsigned long p1,
69				     unsigned long p2, unsigned long p3,
70				     unsigned long p4)
71{
72	return -ENODEV;
73}
74#endif /* CONFIG_INTEL_TDX_GUEST && CONFIG_KVM_GUEST */
75#endif /* !__ASSEMBLY__ */
76#endif /* _ASM_X86_TDX_H */
77