mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-22 14:36:38 -05:00
x86/tdx: Make _tdx_hypercall() and __tdx_module_call() available in boot stub
Memory acceptance requires a hypercall and one or multiple module calls. Make helpers for the calls available in boot stub. It has to accept memory where kernel image and initrd are placed. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com> Link: https://lore.kernel.org/r/20230606142637.5171-8-kirill.shutemov@linux.intel.com
This commit is contained in:
committed by
Borislav Petkov (AMD)
parent
c211c19e80
commit
ff40b5769a
@@ -14,20 +14,6 @@
|
||||
#include <asm/insn-eval.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
/* TDX module Call Leaf IDs */
|
||||
#define TDX_GET_INFO 1
|
||||
#define TDX_GET_VEINFO 3
|
||||
#define TDX_GET_REPORT 4
|
||||
#define TDX_ACCEPT_PAGE 6
|
||||
#define TDX_WR 8
|
||||
|
||||
/* TDCS fields. To be used by TDG.VM.WR and TDG.VM.RD module calls */
|
||||
#define TDCS_NOTIFY_ENABLES 0x9100000000000010
|
||||
|
||||
/* TDX hypercall Leaf IDs */
|
||||
#define TDVMCALL_MAP_GPA 0x10001
|
||||
#define TDVMCALL_REPORT_FATAL_ERROR 0x10003
|
||||
|
||||
/* MMIO direction */
|
||||
#define EPT_READ 0
|
||||
#define EPT_WRITE 1
|
||||
@@ -51,24 +37,6 @@
|
||||
|
||||
#define TDREPORT_SUBTYPE_0 0
|
||||
|
||||
/*
|
||||
* Wrapper for standard use of __tdx_hypercall with no output aside from
|
||||
* return code.
|
||||
*/
|
||||
static inline u64 _tdx_hypercall(u64 fn, u64 r12, u64 r13, u64 r14, u64 r15)
|
||||
{
|
||||
struct tdx_hypercall_args args = {
|
||||
.r10 = TDX_HYPERCALL_STANDARD,
|
||||
.r11 = fn,
|
||||
.r12 = r12,
|
||||
.r13 = r13,
|
||||
.r14 = r14,
|
||||
.r15 = r15,
|
||||
};
|
||||
|
||||
return __tdx_hypercall(&args);
|
||||
}
|
||||
|
||||
/* Called from __tdx_hypercall() for unrecoverable failure */
|
||||
noinstr void __tdx_hypercall_failed(void)
|
||||
{
|
||||
|
||||
@@ -10,6 +10,20 @@
|
||||
#define TDX_CPUID_LEAF_ID 0x21
|
||||
#define TDX_IDENT "IntelTDX "
|
||||
|
||||
/* TDX module Call Leaf IDs */
|
||||
#define TDX_GET_INFO 1
|
||||
#define TDX_GET_VEINFO 3
|
||||
#define TDX_GET_REPORT 4
|
||||
#define TDX_ACCEPT_PAGE 6
|
||||
#define TDX_WR 8
|
||||
|
||||
/* TDCS fields. To be used by TDG.VM.WR and TDG.VM.RD module calls */
|
||||
#define TDCS_NOTIFY_ENABLES 0x9100000000000010
|
||||
|
||||
/* TDX hypercall Leaf IDs */
|
||||
#define TDVMCALL_MAP_GPA 0x10001
|
||||
#define TDVMCALL_REPORT_FATAL_ERROR 0x10003
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/*
|
||||
@@ -37,8 +51,45 @@ struct tdx_hypercall_args {
|
||||
u64 __tdx_hypercall(struct tdx_hypercall_args *args);
|
||||
u64 __tdx_hypercall_ret(struct tdx_hypercall_args *args);
|
||||
|
||||
/*
|
||||
* Wrapper for standard use of __tdx_hypercall with no output aside from
|
||||
* return code.
|
||||
*/
|
||||
static inline u64 _tdx_hypercall(u64 fn, u64 r12, u64 r13, u64 r14, u64 r15)
|
||||
{
|
||||
struct tdx_hypercall_args args = {
|
||||
.r10 = TDX_HYPERCALL_STANDARD,
|
||||
.r11 = fn,
|
||||
.r12 = r12,
|
||||
.r13 = r13,
|
||||
.r14 = r14,
|
||||
.r15 = r15,
|
||||
};
|
||||
|
||||
return __tdx_hypercall(&args);
|
||||
}
|
||||
|
||||
|
||||
/* Called from __tdx_hypercall() for unrecoverable failure */
|
||||
void __tdx_hypercall_failed(void);
|
||||
|
||||
/*
|
||||
* Used in __tdx_module_call() to gather the output registers' values of the
|
||||
* TDCALL instruction when requesting services from the TDX module. This is a
|
||||
* software only structure and not part of the TDX module/VMM ABI
|
||||
*/
|
||||
struct tdx_module_output {
|
||||
u64 rcx;
|
||||
u64 rdx;
|
||||
u64 r8;
|
||||
u64 r9;
|
||||
u64 r10;
|
||||
u64 r11;
|
||||
};
|
||||
|
||||
/* Used to communicate with the TDX module */
|
||||
u64 __tdx_module_call(u64 fn, u64 rcx, u64 rdx, u64 r8, u64 r9,
|
||||
struct tdx_module_output *out);
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif /* _ASM_X86_SHARED_TDX_H */
|
||||
|
||||
@@ -20,21 +20,6 @@
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/*
|
||||
* Used to gather the output registers values of the TDCALL and SEAMCALL
|
||||
* instructions when requesting services from the TDX module.
|
||||
*
|
||||
* This is a software only structure and not part of the TDX module/VMM ABI.
|
||||
*/
|
||||
struct tdx_module_output {
|
||||
u64 rcx;
|
||||
u64 rdx;
|
||||
u64 r8;
|
||||
u64 r9;
|
||||
u64 r10;
|
||||
u64 r11;
|
||||
};
|
||||
|
||||
/*
|
||||
* Used by the #VE exception handler to gather the #VE exception
|
||||
* info from the TDX module. This is a software only structure
|
||||
@@ -55,10 +40,6 @@ struct ve_info {
|
||||
|
||||
void __init tdx_early_init(void);
|
||||
|
||||
/* Used to communicate with the TDX module */
|
||||
u64 __tdx_module_call(u64 fn, u64 rcx, u64 rdx, u64 r8, u64 r9,
|
||||
struct tdx_module_output *out);
|
||||
|
||||
void tdx_get_ve_info(struct ve_info *ve);
|
||||
|
||||
bool tdx_handle_virt_exception(struct pt_regs *regs, struct ve_info *ve);
|
||||
|
||||
Reference in New Issue
Block a user