xref: /qemu/target/i386/kvm/tdx-quote-generator.h (revision 43ba160cb4bbb193560eb0d2d7decc4b5fc599fe)
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