1*40da501dSIsaku Yamahata /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*40da501dSIsaku Yamahata 3*40da501dSIsaku Yamahata #ifndef QEMU_I386_TDX_QUOTE_GENERATOR_H 4*40da501dSIsaku Yamahata #define QEMU_I386_TDX_QUOTE_GENERATOR_H 5*40da501dSIsaku Yamahata 6*40da501dSIsaku Yamahata #include "qom/object_interfaces.h" 7*40da501dSIsaku Yamahata #include "io/channel-socket.h" 8*40da501dSIsaku Yamahata #include "exec/hwaddr.h" 9*40da501dSIsaku Yamahata 10*40da501dSIsaku Yamahata #define TDX_GET_QUOTE_STRUCTURE_VERSION 1ULL 11*40da501dSIsaku Yamahata 12*40da501dSIsaku Yamahata #define TDX_VP_GET_QUOTE_SUCCESS 0ULL 13*40da501dSIsaku Yamahata #define TDX_VP_GET_QUOTE_IN_FLIGHT (-1ULL) 14*40da501dSIsaku Yamahata #define TDX_VP_GET_QUOTE_ERROR 0x8000000000000000ULL 15*40da501dSIsaku Yamahata #define TDX_VP_GET_QUOTE_QGS_UNAVAILABLE 0x8000000000000001ULL 16*40da501dSIsaku Yamahata 17*40da501dSIsaku Yamahata /* Limit to avoid resource starvation. */ 18*40da501dSIsaku Yamahata #define TDX_GET_QUOTE_MAX_BUF_LEN (128 * 1024) 19*40da501dSIsaku Yamahata #define TDX_MAX_GET_QUOTE_REQUEST 16 20*40da501dSIsaku Yamahata 21*40da501dSIsaku Yamahata #define TDX_GET_QUOTE_HDR_SIZE 24 22*40da501dSIsaku Yamahata 23*40da501dSIsaku Yamahata /* Format of pages shared with guest. */ 24*40da501dSIsaku Yamahata struct tdx_get_quote_header { 25*40da501dSIsaku Yamahata /* Format version: must be 1 in little endian. */ 26*40da501dSIsaku Yamahata uint64_t structure_version; 27*40da501dSIsaku Yamahata 28*40da501dSIsaku Yamahata /* 29*40da501dSIsaku Yamahata * GetQuote status code in little endian: 30*40da501dSIsaku Yamahata * Guest must set error_code to 0 to avoid information leak. 31*40da501dSIsaku Yamahata * Qemu sets this before interrupting guest. 32*40da501dSIsaku Yamahata */ 33*40da501dSIsaku Yamahata uint64_t error_code; 34*40da501dSIsaku Yamahata 35*40da501dSIsaku Yamahata /* 36*40da501dSIsaku Yamahata * in-message size in little endian: The message will follow this header. 37*40da501dSIsaku Yamahata * The in-message will be send to QGS. 38*40da501dSIsaku Yamahata */ 39*40da501dSIsaku Yamahata uint32_t in_len; 40*40da501dSIsaku Yamahata 41*40da501dSIsaku Yamahata /* 42*40da501dSIsaku Yamahata * out-message size in little endian: 43*40da501dSIsaku Yamahata * On request, out_len must be zero to avoid information leak. 44*40da501dSIsaku Yamahata * On return, message size from QGS. Qemu overwrites this field. 45*40da501dSIsaku Yamahata * The message will follows this header. The in-message is overwritten. 46*40da501dSIsaku Yamahata */ 47*40da501dSIsaku Yamahata uint32_t out_len; 48*40da501dSIsaku Yamahata 49*40da501dSIsaku Yamahata /* 50*40da501dSIsaku Yamahata * Message buffer follows. 51*40da501dSIsaku Yamahata * Guest sets message that will be send to QGS. If out_len > in_len, guest 52*40da501dSIsaku Yamahata * should zero remaining buffer to avoid information leak. 53*40da501dSIsaku Yamahata * Qemu overwrites this buffer with a message returned from QGS. 54*40da501dSIsaku Yamahata */ 55*40da501dSIsaku Yamahata }; 56*40da501dSIsaku Yamahata 57*40da501dSIsaku Yamahata typedef struct TdxGenerateQuoteTask { 58*40da501dSIsaku Yamahata hwaddr buf_gpa; 59*40da501dSIsaku Yamahata hwaddr payload_gpa; 60*40da501dSIsaku Yamahata uint64_t payload_len; 61*40da501dSIsaku Yamahata 62*40da501dSIsaku Yamahata char *send_data; 63*40da501dSIsaku Yamahata uint64_t send_data_size; 64*40da501dSIsaku Yamahata uint64_t send_data_sent; 65*40da501dSIsaku Yamahata 66*40da501dSIsaku Yamahata char *receive_buf; 67*40da501dSIsaku Yamahata uint64_t receive_buf_received; 68*40da501dSIsaku Yamahata 69*40da501dSIsaku Yamahata uint64_t status_code; 70*40da501dSIsaku Yamahata struct tdx_get_quote_header hdr; 71*40da501dSIsaku Yamahata 72*40da501dSIsaku Yamahata QIOChannelSocket *sioc; 73*40da501dSIsaku Yamahata guint watch; 74*40da501dSIsaku Yamahata QEMUTimer timer; 75*40da501dSIsaku Yamahata 76*40da501dSIsaku Yamahata void (*completion)(struct TdxGenerateQuoteTask *task); 77*40da501dSIsaku Yamahata void *opaque; 78*40da501dSIsaku Yamahata } TdxGenerateQuoteTask; 79*40da501dSIsaku Yamahata 80*40da501dSIsaku Yamahata void tdx_generate_quote(TdxGenerateQuoteTask *task, SocketAddress *qg_sock_addr); 81*40da501dSIsaku Yamahata 82*40da501dSIsaku Yamahata #endif /* QEMU_I386_TDX_QUOTE_GENERATOR_H */ 83