Skip to content
Permalink
Browse files
x86/tdx: Add SetupEventNotifyInterrupt TDX hypercall support
SetupEventNotifyInterrupt TDX hypercall is used by guest TD to specify
which interrupt vector to use as an event-notify vector to the VMM.
Such registered vector is also used by Host VMM to notify about
completion of GetQuote requests to the Guest TD.

Add tdx_hcall_set_notify_intr() helper function to implement the
SetupEventNotifyInterrupt hypercall.

This will be used by the TD quote driver.

Details about the SetupEventNotifyInterrupt TDVMCALL can be found in
TDX Guest-Host Communication Interface (GHCI) Specification, sec 3.5
"VP.VMCALL<SetupEventNotifyInterrupt>".

Reviewed-by: Tony Luck <tony.luck@intel.com>
Reviewed-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
  • Loading branch information
Kuppuswamy Sathyanarayanan authored and kiryl committed Jan 10, 2022
1 parent 8158c57 commit eff3229d99a6ea4b75fa0656fca38ac6db67ca7d
Showing 1 changed file with 32 additions and 0 deletions.
@@ -24,6 +24,7 @@
/* TDX hypercall Leaf IDs */
#define TDVMCALL_MAP_GPA 0x10001
#define TDVMCALL_GET_QUOTE 0x10002
#define TDVMCALL_SETUP_NOTIFY_INTR 0x10004

/* See Exit Qualification for I/O Instructions in VMX documentation */
#define VE_IS_IO_IN(exit_qual) (((exit_qual) & 8) ? 1 : 0)
@@ -213,6 +214,37 @@ int tdx_hcall_get_quote(u64 data)
}
EXPORT_SYMBOL_GPL(tdx_hcall_get_quote);

/*
* tdx_hcall_set_notify_intr() - Setup Event Notify Interrupt Vector.
*
* @vector : Vector address to be used for notification.
*
* return 0 on success or failure error number.
*/
int tdx_hcall_set_notify_intr(u8 vector)
{
u64 ret;

/* Minimum vector value allowed is 32 */
if (vector < 32)
return -EINVAL;

/*
* Register callback vector address with VMM. More details
* about the ABI can be found in TDX Guest-Host-Communication
* Interface (GHCI), sec 3.5.
*/
ret = _trace_tdx_hypercall(TDVMCALL_SETUP_NOTIFY_INTR, vector, 0, 0, 0,
NULL);

if (ret == TDVMCALL_SUCCESS)
return 0;
else if (ret == TDCALL_INVALID_OPERAND)
return -EINVAL;

return -EIO;
}

static void tdx_get_info(void)
{
struct tdx_module_output out;

0 comments on commit eff3229

Please sign in to comment.