162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _ASM_X86_SHARED_TDX_H 362306a36Sopenharmony_ci#define _ASM_X86_SHARED_TDX_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/bits.h> 662306a36Sopenharmony_ci#include <linux/types.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#define TDX_HYPERCALL_STANDARD 0 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define TDX_CPUID_LEAF_ID 0x21 1162306a36Sopenharmony_ci#define TDX_IDENT "IntelTDX " 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* TDX module Call Leaf IDs */ 1462306a36Sopenharmony_ci#define TDX_GET_INFO 1 1562306a36Sopenharmony_ci#define TDX_GET_VEINFO 3 1662306a36Sopenharmony_ci#define TDX_GET_REPORT 4 1762306a36Sopenharmony_ci#define TDX_ACCEPT_PAGE 6 1862306a36Sopenharmony_ci#define TDX_WR 8 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* TDCS fields. To be used by TDG.VM.WR and TDG.VM.RD module calls */ 2162306a36Sopenharmony_ci#define TDCS_NOTIFY_ENABLES 0x9100000000000010 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* TDX hypercall Leaf IDs */ 2462306a36Sopenharmony_ci#define TDVMCALL_MAP_GPA 0x10001 2562306a36Sopenharmony_ci#define TDVMCALL_REPORT_FATAL_ERROR 0x10003 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* 3062306a36Sopenharmony_ci * Used in __tdx_hypercall() to pass down and get back registers' values of 3162306a36Sopenharmony_ci * the TDCALL instruction when requesting services from the VMM. 3262306a36Sopenharmony_ci * 3362306a36Sopenharmony_ci * This is a software only structure and not part of the TDX module/VMM ABI. 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_cistruct tdx_hypercall_args { 3662306a36Sopenharmony_ci u64 r8; 3762306a36Sopenharmony_ci u64 r9; 3862306a36Sopenharmony_ci u64 r10; 3962306a36Sopenharmony_ci u64 r11; 4062306a36Sopenharmony_ci u64 r12; 4162306a36Sopenharmony_ci u64 r13; 4262306a36Sopenharmony_ci u64 r14; 4362306a36Sopenharmony_ci u64 r15; 4462306a36Sopenharmony_ci u64 rdi; 4562306a36Sopenharmony_ci u64 rsi; 4662306a36Sopenharmony_ci u64 rbx; 4762306a36Sopenharmony_ci u64 rdx; 4862306a36Sopenharmony_ci}; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* Used to request services from the VMM */ 5162306a36Sopenharmony_ciu64 __tdx_hypercall(struct tdx_hypercall_args *args); 5262306a36Sopenharmony_ciu64 __tdx_hypercall_ret(struct tdx_hypercall_args *args); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* 5562306a36Sopenharmony_ci * Wrapper for standard use of __tdx_hypercall with no output aside from 5662306a36Sopenharmony_ci * return code. 5762306a36Sopenharmony_ci */ 5862306a36Sopenharmony_cistatic inline u64 _tdx_hypercall(u64 fn, u64 r12, u64 r13, u64 r14, u64 r15) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci struct tdx_hypercall_args args = { 6162306a36Sopenharmony_ci .r10 = TDX_HYPERCALL_STANDARD, 6262306a36Sopenharmony_ci .r11 = fn, 6362306a36Sopenharmony_ci .r12 = r12, 6462306a36Sopenharmony_ci .r13 = r13, 6562306a36Sopenharmony_ci .r14 = r14, 6662306a36Sopenharmony_ci .r15 = r15, 6762306a36Sopenharmony_ci }; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci return __tdx_hypercall(&args); 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/* Called from __tdx_hypercall() for unrecoverable failure */ 7462306a36Sopenharmony_civoid __tdx_hypercall_failed(void); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* 7762306a36Sopenharmony_ci * Used in __tdx_module_call() to gather the output registers' values of the 7862306a36Sopenharmony_ci * TDCALL instruction when requesting services from the TDX module. This is a 7962306a36Sopenharmony_ci * software only structure and not part of the TDX module/VMM ABI 8062306a36Sopenharmony_ci */ 8162306a36Sopenharmony_cistruct tdx_module_output { 8262306a36Sopenharmony_ci u64 rcx; 8362306a36Sopenharmony_ci u64 rdx; 8462306a36Sopenharmony_ci u64 r8; 8562306a36Sopenharmony_ci u64 r9; 8662306a36Sopenharmony_ci u64 r10; 8762306a36Sopenharmony_ci u64 r11; 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* Used to communicate with the TDX module */ 9162306a36Sopenharmony_ciu64 __tdx_module_call(u64 fn, u64 rcx, u64 rdx, u64 r8, u64 r9, 9262306a36Sopenharmony_ci struct tdx_module_output *out); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cibool tdx_accept_memory(phys_addr_t start, phys_addr_t end); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/* 9762306a36Sopenharmony_ci * The TDG.VP.VMCALL-Instruction-execution sub-functions are defined 9862306a36Sopenharmony_ci * independently from but are currently matched 1:1 with VMX EXIT_REASONs. 9962306a36Sopenharmony_ci * Reusing the KVM EXIT_REASON macros makes it easier to connect the host and 10062306a36Sopenharmony_ci * guest sides of these calls. 10162306a36Sopenharmony_ci */ 10262306a36Sopenharmony_cistatic __always_inline u64 hcall_func(u64 exit_reason) 10362306a36Sopenharmony_ci{ 10462306a36Sopenharmony_ci return exit_reason; 10562306a36Sopenharmony_ci} 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#endif /* !__ASSEMBLY__ */ 10862306a36Sopenharmony_ci#endif /* _ASM_X86_SHARED_TDX_H */ 109