1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#ifndef MIGRATION_QEMU_FILE_H
26#define MIGRATION_QEMU_FILE_H
27
28
29
30
31
32typedef ssize_t (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf,
33 int64_t pos, size_t size);
34
35
36
37
38
39
40
41
42typedef int (QEMUFileCloseFunc)(void *opaque);
43
44
45
46typedef int (QEMUFileGetFD)(void *opaque);
47
48
49
50typedef int (QEMUFileSetBlocking)(void *opaque, bool enabled);
51
52
53
54
55
56typedef ssize_t (QEMUFileWritevBufferFunc)(void *opaque, struct iovec *iov,
57 int iovcnt, int64_t pos);
58
59
60
61
62
63
64
65typedef int (QEMURamHookFunc)(QEMUFile *f, void *opaque, uint64_t flags,
66 void *data);
67
68
69
70
71#define RAM_CONTROL_SETUP 0
72#define RAM_CONTROL_ROUND 1
73#define RAM_CONTROL_HOOK 2
74#define RAM_CONTROL_FINISH 3
75#define RAM_CONTROL_BLOCK_REG 4
76
77
78
79
80
81typedef size_t (QEMURamSaveFunc)(QEMUFile *f, void *opaque,
82 ram_addr_t block_offset,
83 ram_addr_t offset,
84 size_t size,
85 uint64_t *bytes_sent);
86
87
88
89
90typedef QEMUFile *(QEMURetPathFunc)(void *opaque);
91
92
93
94
95
96
97
98typedef int (QEMUFileShutdownFunc)(void *opaque, bool rd, bool wr);
99
100typedef struct QEMUFileOps {
101 QEMUFileGetBufferFunc *get_buffer;
102 QEMUFileCloseFunc *close;
103 QEMUFileSetBlocking *set_blocking;
104 QEMUFileWritevBufferFunc *writev_buffer;
105 QEMURetPathFunc *get_return_path;
106 QEMUFileShutdownFunc *shut_down;
107} QEMUFileOps;
108
109typedef struct QEMUFileHooks {
110 QEMURamHookFunc *before_ram_iterate;
111 QEMURamHookFunc *after_ram_iterate;
112 QEMURamHookFunc *hook_ram_load;
113 QEMURamSaveFunc *save_page;
114} QEMUFileHooks;
115
116QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops);
117void qemu_file_set_hooks(QEMUFile *f, const QEMUFileHooks *hooks);
118int qemu_get_fd(QEMUFile *f);
119int qemu_fclose(QEMUFile *f);
120int64_t qemu_ftell(QEMUFile *f);
121int64_t qemu_ftell_fast(QEMUFile *f);
122
123
124
125
126void qemu_put_buffer_async(QEMUFile *f, const uint8_t *buf, size_t size,
127 bool may_free);
128bool qemu_file_mode_is_not_valid(const char *mode);
129bool qemu_file_is_writable(QEMUFile *f);
130
131#include "migration/qemu-file-types.h"
132
133size_t qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t size, size_t offset);
134size_t qemu_get_buffer_in_place(QEMUFile *f, uint8_t **buf, size_t size);
135ssize_t qemu_put_compression_data(QEMUFile *f, const uint8_t *p, size_t size,
136 int level);
137int qemu_put_qemu_file(QEMUFile *f_des, QEMUFile *f_src);
138
139
140
141
142
143
144int qemu_peek_byte(QEMUFile *f, int offset);
145void qemu_file_skip(QEMUFile *f, int size);
146void qemu_update_position(QEMUFile *f, size_t size);
147void qemu_file_reset_rate_limit(QEMUFile *f);
148void qemu_file_set_rate_limit(QEMUFile *f, int64_t new_rate);
149int64_t qemu_file_get_rate_limit(QEMUFile *f);
150int qemu_file_get_error(QEMUFile *f);
151void qemu_file_set_error(QEMUFile *f, int ret);
152int qemu_file_shutdown(QEMUFile *f);
153QEMUFile *qemu_file_get_return_path(QEMUFile *f);
154void qemu_fflush(QEMUFile *f);
155void qemu_file_set_blocking(QEMUFile *f, bool block);
156
157size_t qemu_get_counted_string(QEMUFile *f, char buf[256]);
158
159void ram_control_before_iterate(QEMUFile *f, uint64_t flags);
160void ram_control_after_iterate(QEMUFile *f, uint64_t flags);
161void ram_control_load_hook(QEMUFile *f, uint64_t flags, void *data);
162
163
164
165
166
167
168#define RAM_SAVE_FLAG_HOOK 0x80
169
170#define RAM_SAVE_CONTROL_NOT_SUPP -1000
171#define RAM_SAVE_CONTROL_DELAYED -2000
172
173size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset,
174 ram_addr_t offset, size_t size,
175 uint64_t *bytes_sent);
176
177#endif
178