}
  EXPORT_SYMBOL_GPL(tdx_mcall_get_report0);
  
+ /**
+  * tdx_hcall_get_quote() - Wrapper to request TD Quote using GetQuote
+  *                         hypercall.
+  * @buf: Address of the directly mapped shared kernel buffer which
+  *       contains TDREPORT. The same buffer will be used by VMM to
+  *       store the generated TD Quote output.
+  * @size: size of the tdquote buffer (4KB-aligned).
+  *
+  * Refer to section titled "TDG.VP.VMCALL<GetQuote>" in the TDX GHCI
+  * v1.0 specification for more information on GetQuote hypercall.
+  * It is used in the TDX guest driver module to get the TD Quote.
+  *
+  * Return 0 on success or error code on failure.
+  */
+ u64 tdx_hcall_get_quote(u8 *buf, size_t size)
+ {
+       /* Since buf is a shared memory, set the shared (decrypted) bits */
+       return _tdx_hypercall(TDVMCALL_GET_QUOTE, cc_mkdec(virt_to_phys(buf)), size, 0, 0);
+ }
+ EXPORT_SYMBOL_GPL(tdx_hcall_get_quote);
+ 
  static void __noreturn tdx_panic(const char *msg)
  {
 -      struct tdx_hypercall_args args = {
 +      struct tdx_module_args args = {
                .r10 = TDX_HYPERCALL_STANDARD,
                .r11 = TDVMCALL_REPORT_FATAL_ERROR,
                .r12 = 0, /* Error code: 0 is Panic */
 
  
  /* TDX hypercall Leaf IDs */
  #define TDVMCALL_MAP_GPA              0x10001
+ #define TDVMCALL_GET_QUOTE            0x10002
  #define TDVMCALL_REPORT_FATAL_ERROR   0x10003
  
 +#define TDVMCALL_STATUS_RETRY         1
 +
 +/*
 + * Bitmasks of exposed registers (with VMM).
 + */
 +#define TDX_RDX               BIT(2)
 +#define TDX_RBX               BIT(3)
 +#define TDX_RSI               BIT(6)
 +#define TDX_RDI               BIT(7)
 +#define TDX_R8                BIT(8)
 +#define TDX_R9                BIT(9)
 +#define TDX_R10               BIT(10)
 +#define TDX_R11               BIT(11)
 +#define TDX_R12               BIT(12)
 +#define TDX_R13               BIT(13)
 +#define TDX_R14               BIT(14)
 +#define TDX_R15               BIT(15)
 +
 +/*
 + * These registers are clobbered to hold arguments for each
 + * TDVMCALL. They are safe to expose to the VMM.
 + * Each bit in this mask represents a register ID. Bit field
 + * details can be found in TDX GHCI specification, section
 + * titled "TDCALL [TDG.VP.VMCALL] leaf".
 + */
 +#define TDVMCALL_EXPOSE_REGS_MASK     \
 +      (TDX_RDX | TDX_RBX | TDX_RSI | TDX_RDI | TDX_R8  | TDX_R9  | \
 +       TDX_R10 | TDX_R11 | TDX_R12 | TDX_R13 | TDX_R14 | TDX_R15)
 +
  #ifndef __ASSEMBLY__
  
 +#include <linux/compiler_attributes.h>
 +
  /*
 - * Used in __tdx_hypercall() to pass down and get back registers' values of
 - * the TDCALL instruction when requesting services from the VMM.
 - *
 - * This is a software only structure and not part of the TDX module/VMM ABI.
 + * Used in __tdcall*() to gather the input/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_hypercall_args {
 +struct tdx_module_args {
 +      /* callee-clobbered */
 +      u64 rcx;
 +      u64 rdx;
        u64 r8;
        u64 r9;
 +      /* extra callee-clobbered */
        u64 r10;
        u64 r11;
 +      /* callee-saved + rdi/rsi */
        u64 r12;
        u64 r13;
        u64 r14;