1 #ifndef __STREAM_FORMAT__H
2 #define __STREAM_FORMAT__H
3 
4 /*
5  * C structures for the Migration v2 stream format.
6  * See docs/specs/libxc-migration-stream.pandoc
7  */
8 
9 #include <inttypes.h>
10 
11 /*
12  * Image Header
13  */
14 struct xc_sr_ihdr
15 {
16     uint64_t marker;
17     uint32_t id;
18     uint32_t version;
19     uint16_t options;
20     uint16_t _res1;
21     uint32_t _res2;
22 };
23 
24 #define IHDR_MARKER  0xffffffffffffffffULL
25 #define IHDR_ID      0x58454E46U
26 
27 #define _IHDR_OPT_ENDIAN 0
28 #define IHDR_OPT_LITTLE_ENDIAN (0 << _IHDR_OPT_ENDIAN)
29 #define IHDR_OPT_BIG_ENDIAN    (1 << _IHDR_OPT_ENDIAN)
30 
31 /*
32  * Domain Header
33  */
34 struct xc_sr_dhdr
35 {
36     uint32_t type;
37     uint16_t page_shift;
38     uint16_t _res1;
39     uint32_t xen_major;
40     uint32_t xen_minor;
41 };
42 
43 #define DHDR_TYPE_X86_PV  0x00000001U
44 #define DHDR_TYPE_X86_HVM 0x00000002U
45 
46 /*
47  * Record Header
48  */
49 struct xc_sr_rhdr
50 {
51     uint32_t type;
52     uint32_t length;
53 };
54 
55 /* All records must be aligned up to an 8 octet boundary */
56 #define REC_ALIGN_ORDER               (3U)
57 /* Somewhat arbitrary - 128MB */
58 #define REC_LENGTH_MAX                (128U << 20)
59 
60 #define REC_TYPE_END                        0x00000000U
61 #define REC_TYPE_PAGE_DATA                  0x00000001U
62 #define REC_TYPE_X86_PV_INFO                0x00000002U
63 #define REC_TYPE_X86_PV_P2M_FRAMES          0x00000003U
64 #define REC_TYPE_X86_PV_VCPU_BASIC          0x00000004U
65 #define REC_TYPE_X86_PV_VCPU_EXTENDED       0x00000005U
66 #define REC_TYPE_X86_PV_VCPU_XSAVE          0x00000006U
67 #define REC_TYPE_SHARED_INFO                0x00000007U
68 #define REC_TYPE_X86_TSC_INFO               0x00000008U
69 #define REC_TYPE_HVM_CONTEXT                0x00000009U
70 #define REC_TYPE_HVM_PARAMS                 0x0000000aU
71 #define REC_TYPE_TOOLSTACK                  0x0000000bU
72 #define REC_TYPE_X86_PV_VCPU_MSRS           0x0000000cU
73 #define REC_TYPE_VERIFY                     0x0000000dU
74 #define REC_TYPE_CHECKPOINT                 0x0000000eU
75 #define REC_TYPE_CHECKPOINT_DIRTY_PFN_LIST  0x0000000fU
76 #define REC_TYPE_STATIC_DATA_END            0x00000010U
77 #define REC_TYPE_X86_CPUID_POLICY           0x00000011U
78 #define REC_TYPE_X86_MSR_POLICY             0x00000012U
79 
80 #define REC_TYPE_OPTIONAL             0x80000000U
81 
82 /* PAGE_DATA */
83 struct xc_sr_rec_page_data_header
84 {
85     uint32_t count;
86     uint32_t _res1;
87     uint64_t pfn[0];
88 };
89 
90 #define PAGE_DATA_PFN_MASK  0x000fffffffffffffULL
91 #define PAGE_DATA_TYPE_MASK 0xf000000000000000ULL
92 
93 /* X86_PV_INFO */
94 struct xc_sr_rec_x86_pv_info
95 {
96     uint8_t guest_width;
97     uint8_t pt_levels;
98     uint8_t _res[6];
99 };
100 
101 /* X86_PV_P2M_FRAMES */
102 struct xc_sr_rec_x86_pv_p2m_frames
103 {
104     uint32_t start_pfn;
105     uint32_t end_pfn;
106     uint64_t p2m_pfns[0];
107 };
108 
109 /* X86_PV_VCPU_{BASIC,EXTENDED,XSAVE,MSRS} */
110 struct xc_sr_rec_x86_pv_vcpu_hdr
111 {
112     uint32_t vcpu_id;
113     uint32_t _res1;
114     uint8_t context[0];
115 };
116 
117 /* X86_TSC_INFO */
118 struct xc_sr_rec_x86_tsc_info
119 {
120     uint32_t mode;
121     uint32_t khz;
122     uint64_t nsec;
123     uint32_t incarnation;
124     uint32_t _res1;
125 };
126 
127 /* HVM_PARAMS */
128 struct xc_sr_rec_hvm_params_entry
129 {
130     uint64_t index;
131     uint64_t value;
132 };
133 
134 struct xc_sr_rec_hvm_params
135 {
136     uint32_t count;
137     uint32_t _res1;
138     struct xc_sr_rec_hvm_params_entry param[0];
139 };
140 
141 #endif
142 /*
143  * Local variables:
144  * mode: C
145  * c-file-style: "BSD"
146  * c-basic-offset: 4
147  * tab-width: 4
148  * indent-tabs-mode: nil
149  * End:
150  */
151