Skip to content

Commit

Permalink
x86/tdx: Add SetupEventNotifyInterrupt TDX hypercall support
Browse files Browse the repository at this point in the history
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 eff3229
Showing 1 changed file with 32 additions and 0 deletions.
32 changes: 32 additions & 0 deletions arch/x86/kernel/tdx.c
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit eff3229

Please sign in to comment.