Re: [PATCH 1/6] x86/tdx: Support hypercalls for TDX guests on Hyper-V
From: Sathyanarayanan Kuppuswamy
<sathyanarayanan.kuppuswamy@linux.intel.com>
Date: 2022-11-23 03:52:19
Also in:
linux-arch, lkml
On 11/22/22 5:37 PM, Dexuan Cui wrote:
quoted
From: Dave Hansen <redacted> Sent: Monday, November 21, 2022 12:39 PM [...] On 11/21/22 11:51, Dexuan Cui wrote:quoted
__tdx_hypercall() doesn't work for a TDX guest running on Hyper-V, because Hyper-V uses a different calling convention, so add the new function __tdx_ms_hv_hypercall().Other than R10 being variable here and fixed for __tdx_hypercall(), this looks *EXACTLY* the same as __tdx_hypercall(), or at least a strict subset of what __tdx_hypercall() can do. Did I miss something?The existing asm code for __tdx_hypercall() passes through R10~R15 (see TDVMCALL_EXPOSE_REGS_MASK) to the (KVM) hypervisor. Unluckily, for Hyper-V, we need to pass through RDX, R8, R10 and R11 to Hyper-V, so I don't think I can use the existing __tdx_hypercall() ?quoted
quoted
Another way of saying this: It seems like you could do this with a newversion of _tdx_hypercall() (and all in C) instead of a new __tdx_hypercall().I don't think the current TDVMCALL_EXPOSE_REGS_MASK allows me to pass through RDX and R8 to Hyper-V.
Because TDVMCALLs defined in the GHCI specification only use registers R10-R15, only those registers are currently exposed. However, the TDVMCALL ABI allows the use of input registers such as RBX, RBP, RDI, RSI, R8 or R9. Instead of creating a new variant of __tdx_hypercall() to handle your use case, perhaps you can add the registers you require to the TDVMCALL EXPOSE REGS MASK. You just need to make sure they are zeroed out for other users of __tdx_hypercall().
PS, the comment before __tdx_hypercall() contains this line: "* RBX, RBP, RDI, RSI - Used to pass VMCALL sub function specific arguments." But it looks like currently RBX an RBP are not used at all in arch/x86/coco/tdx/tdcall.S ?
-- Sathyanarayanan Kuppuswamy Linux Kernel Developer