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 #define IHDR_VERSION 2
27 
28 #define _IHDR_OPT_ENDIAN 0
29 #define IHDR_OPT_LITTLE_ENDIAN (0 << _IHDR_OPT_ENDIAN)
30 #define IHDR_OPT_BIG_ENDIAN    (1 << _IHDR_OPT_ENDIAN)
31 
32 /*
33  * Domain Header
34  */
35 struct xc_sr_dhdr
36 {
37     uint32_t type;
38     uint16_t page_shift;
39     uint16_t _res1;
40     uint32_t xen_major;
41     uint32_t xen_minor;
42 };
43 
44 #define DHDR_TYPE_X86_PV  0x00000001U
45 #define DHDR_TYPE_X86_HVM 0x00000002U
46 #define DHDR_TYPE_X86_PVH 0x00000003U
47 #define DHDR_TYPE_ARM     0x00000004U
48 
49 /*
50  * Record Header
51  */
52 struct xc_sr_rhdr
53 {
54     uint32_t type;
55     uint32_t length;
56 };
57 
58 /* All records must be aligned up to an 8 octet boundary */
59 #define REC_ALIGN_ORDER               (3U)
60 /* Somewhat arbitrary - 128MB */
61 #define REC_LENGTH_MAX                (128U << 20)
62 
63 #define REC_TYPE_END                        0x00000000U
64 #define REC_TYPE_PAGE_DATA                  0x00000001U
65 #define REC_TYPE_X86_PV_INFO                0x00000002U
66 #define REC_TYPE_X86_PV_P2M_FRAMES          0x00000003U
67 #define REC_TYPE_X86_PV_VCPU_BASIC          0x00000004U
68 #define REC_TYPE_X86_PV_VCPU_EXTENDED       0x00000005U
69 #define REC_TYPE_X86_PV_VCPU_XSAVE          0x00000006U
70 #define REC_TYPE_SHARED_INFO                0x00000007U
71 #define REC_TYPE_TSC_INFO                   0x00000008U
72 #define REC_TYPE_HVM_CONTEXT                0x00000009U
73 #define REC_TYPE_HVM_PARAMS                 0x0000000aU
74 #define REC_TYPE_TOOLSTACK                  0x0000000bU
75 #define REC_TYPE_X86_PV_VCPU_MSRS           0x0000000cU
76 #define REC_TYPE_VERIFY                     0x0000000dU
77 #define REC_TYPE_CHECKPOINT                 0x0000000eU
78 #define REC_TYPE_CHECKPOINT_DIRTY_PFN_LIST  0x0000000fU
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 /* TSC_INFO */
118 struct xc_sr_rec_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