1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#ifndef QEMU_FILE_H
25#define QEMU_FILE_H 1
26#include "exec/cpu-common.h"
27
28
29
30
31
32typedef int (QEMUFilePutBufferFunc)(void *opaque, const uint8_t *buf,
33 int64_t pos, int size);
34
35
36
37
38
39typedef int (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf,
40 int64_t pos, int size);
41
42
43
44
45
46
47
48
49typedef int (QEMUFileCloseFunc)(void *opaque);
50
51
52
53typedef int (QEMUFileGetFD)(void *opaque);
54
55
56
57
58typedef ssize_t (QEMUFileWritevBufferFunc)(void *opaque, struct iovec *iov,
59 int iovcnt, int64_t pos);
60
61
62
63
64
65typedef int (QEMURamHookFunc)(QEMUFile *f, void *opaque, uint64_t flags);
66
67
68
69
70#define RAM_CONTROL_SETUP 0
71#define RAM_CONTROL_ROUND 1
72#define RAM_CONTROL_HOOK 2
73#define RAM_CONTROL_FINISH 3
74
75
76
77
78
79typedef size_t (QEMURamSaveFunc)(QEMUFile *f, void *opaque,
80 ram_addr_t block_offset,
81 ram_addr_t offset,
82 size_t size,
83 int *bytes_sent);
84
85typedef struct QEMUFileOps {
86 QEMUFilePutBufferFunc *put_buffer;
87 QEMUFileGetBufferFunc *get_buffer;
88 QEMUFileCloseFunc *close;
89 QEMUFileGetFD *get_fd;
90 QEMUFileWritevBufferFunc *writev_buffer;
91 QEMURamHookFunc *before_ram_iterate;
92 QEMURamHookFunc *after_ram_iterate;
93 QEMURamHookFunc *hook_ram_load;
94 QEMURamSaveFunc *save_page;
95} QEMUFileOps;
96
97QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops);
98QEMUFile *qemu_fopen(const char *filename, const char *mode);
99QEMUFile *qemu_fdopen(int fd, const char *mode);
100QEMUFile *qemu_fopen_socket(int fd, const char *mode);
101QEMUFile *qemu_popen_cmd(const char *command, const char *mode);
102int qemu_get_fd(QEMUFile *f);
103int qemu_fclose(QEMUFile *f);
104int64_t qemu_ftell(QEMUFile *f);
105void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
106void qemu_put_byte(QEMUFile *f, int v);
107
108
109
110
111void qemu_put_buffer_async(QEMUFile *f, const uint8_t *buf, int size);
112bool qemu_file_mode_is_not_valid(const char *mode);
113
114static inline void qemu_put_ubyte(QEMUFile *f, unsigned int v)
115{
116 qemu_put_byte(f, (int)v);
117}
118
119#define qemu_put_sbyte qemu_put_byte
120
121void qemu_put_be16(QEMUFile *f, unsigned int v);
122void qemu_put_be32(QEMUFile *f, unsigned int v);
123void qemu_put_be64(QEMUFile *f, uint64_t v);
124int qemu_peek_buffer(QEMUFile *f, uint8_t *buf, int size, size_t offset);
125int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size);
126int qemu_peek_byte(QEMUFile *f, int offset);
127int qemu_get_byte(QEMUFile *f);
128void qemu_file_skip(QEMUFile *f, int size);
129void qemu_update_position(QEMUFile *f, size_t size);
130
131static inline unsigned int qemu_get_ubyte(QEMUFile *f)
132{
133 return (unsigned int)qemu_get_byte(f);
134}
135
136#define qemu_get_sbyte qemu_get_byte
137
138unsigned int qemu_get_be16(QEMUFile *f);
139unsigned int qemu_get_be32(QEMUFile *f);
140uint64_t qemu_get_be64(QEMUFile *f);
141
142int qemu_file_rate_limit(QEMUFile *f);
143void qemu_file_reset_rate_limit(QEMUFile *f);
144void qemu_file_set_rate_limit(QEMUFile *f, int64_t new_rate);
145int64_t qemu_file_get_rate_limit(QEMUFile *f);
146int qemu_file_get_error(QEMUFile *f);
147void qemu_file_set_error(QEMUFile *f, int ret);
148void qemu_fflush(QEMUFile *f);
149
150static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv)
151{
152 qemu_put_be64(f, *pv);
153}
154
155static inline void qemu_put_be32s(QEMUFile *f, const uint32_t *pv)
156{
157 qemu_put_be32(f, *pv);
158}
159
160static inline void qemu_put_be16s(QEMUFile *f, const uint16_t *pv)
161{
162 qemu_put_be16(f, *pv);
163}
164
165static inline void qemu_put_8s(QEMUFile *f, const uint8_t *pv)
166{
167 qemu_put_byte(f, *pv);
168}
169
170static inline void qemu_get_be64s(QEMUFile *f, uint64_t *pv)
171{
172 *pv = qemu_get_be64(f);
173}
174
175static inline void qemu_get_be32s(QEMUFile *f, uint32_t *pv)
176{
177 *pv = qemu_get_be32(f);
178}
179
180static inline void qemu_get_be16s(QEMUFile *f, uint16_t *pv)
181{
182 *pv = qemu_get_be16(f);
183}
184
185static inline void qemu_get_8s(QEMUFile *f, uint8_t *pv)
186{
187 *pv = qemu_get_byte(f);
188}
189
190
191static inline void qemu_put_sbuffer(QEMUFile *f, const int8_t *buf, int size)
192{
193 qemu_put_buffer(f, (const uint8_t *)buf, size);
194}
195
196static inline void qemu_put_sbe16(QEMUFile *f, int v)
197{
198 qemu_put_be16(f, (unsigned int)v);
199}
200
201static inline void qemu_put_sbe32(QEMUFile *f, int v)
202{
203 qemu_put_be32(f, (unsigned int)v);
204}
205
206static inline void qemu_put_sbe64(QEMUFile *f, int64_t v)
207{
208 qemu_put_be64(f, (uint64_t)v);
209}
210
211static inline size_t qemu_get_sbuffer(QEMUFile *f, int8_t *buf, int size)
212{
213 return qemu_get_buffer(f, (uint8_t *)buf, size);
214}
215
216static inline int qemu_get_sbe16(QEMUFile *f)
217{
218 return (int)qemu_get_be16(f);
219}
220
221static inline int qemu_get_sbe32(QEMUFile *f)
222{
223 return (int)qemu_get_be32(f);
224}
225
226static inline int64_t qemu_get_sbe64(QEMUFile *f)
227{
228 return (int64_t)qemu_get_be64(f);
229}
230
231static inline void qemu_put_s8s(QEMUFile *f, const int8_t *pv)
232{
233 qemu_put_8s(f, (const uint8_t *)pv);
234}
235
236static inline void qemu_put_sbe16s(QEMUFile *f, const int16_t *pv)
237{
238 qemu_put_be16s(f, (const uint16_t *)pv);
239}
240
241static inline void qemu_put_sbe32s(QEMUFile *f, const int32_t *pv)
242{
243 qemu_put_be32s(f, (const uint32_t *)pv);
244}
245
246static inline void qemu_put_sbe64s(QEMUFile *f, const int64_t *pv)
247{
248 qemu_put_be64s(f, (const uint64_t *)pv);
249}
250
251static inline void qemu_get_s8s(QEMUFile *f, int8_t *pv)
252{
253 qemu_get_8s(f, (uint8_t *)pv);
254}
255
256static inline void qemu_get_sbe16s(QEMUFile *f, int16_t *pv)
257{
258 qemu_get_be16s(f, (uint16_t *)pv);
259}
260
261static inline void qemu_get_sbe32s(QEMUFile *f, int32_t *pv)
262{
263 qemu_get_be32s(f, (uint32_t *)pv);
264}
265
266static inline void qemu_get_sbe64s(QEMUFile *f, int64_t *pv)
267{
268 qemu_get_be64s(f, (uint64_t *)pv);
269}
270#endif
271