Statistics
| Branch: | Revision:

root / hw / hw.h @ b6c4f71f

History | View | Annotate | Download (6.6 kB)

1
/* Declarations for use by hardware emulation.  */
2
#ifndef QEMU_HW_H
3
#define QEMU_HW_H
4

    
5
#include "qemu-common.h"
6
#include "irq.h"
7

    
8
/* VM Load/Save */
9

    
10
/* This function writes a chunk of data to a file at the given position.
11
 * The pos argument can be ignored if the file is only being used for
12
 * streaming.  The handler should try to write all of the data it can.
13
 */
14
typedef void (QEMUFilePutBufferFunc)(void *opaque, const uint8_t *buf,
15
                                     int64_t pos, int size);
16

    
17
/* Read a chunk of data from a file at the given position.  The pos argument
18
 * can be ignored if the file is only be used for streaming.  The number of
19
 * bytes actually read should be returned.
20
 */
21
typedef int (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf,
22
                                    int64_t pos, int size);
23

    
24
/* Close a file and return an error code */
25
typedef int (QEMUFileCloseFunc)(void *opaque);
26

    
27
/* Called to determine if the file has exceeded it's bandwidth allocation.  The
28
 * bandwidth capping is a soft limit, not a hard limit.
29
 */
30
typedef int (QEMUFileRateLimit)(void *opaque);
31

    
32
QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,
33
                         QEMUFileGetBufferFunc *get_buffer,
34
                         QEMUFileCloseFunc *close,
35
                         QEMUFileRateLimit *rate_limit);
36
QEMUFile *qemu_fopen(const char *filename, const char *mode);
37
QEMUFile *qemu_fopen_fd(int fd);
38
void qemu_fflush(QEMUFile *f);
39
int qemu_fclose(QEMUFile *f);
40
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
41
void qemu_put_byte(QEMUFile *f, int v);
42

    
43
static inline void qemu_put_ubyte(QEMUFile *f, unsigned int v)
44
{
45
    qemu_put_byte(f, (int)v);
46
}
47

    
48
#define qemu_put_sbyte qemu_put_byte
49

    
50
void qemu_put_be16(QEMUFile *f, unsigned int v);
51
void qemu_put_be32(QEMUFile *f, unsigned int v);
52
void qemu_put_be64(QEMUFile *f, uint64_t v);
53
int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size);
54
int qemu_get_byte(QEMUFile *f);
55

    
56
static inline unsigned int qemu_get_ubyte(QEMUFile *f)
57
{
58
    return (unsigned int)qemu_get_byte(f);
59
}
60

    
61
#define qemu_get_sbyte qemu_get_byte
62

    
63
unsigned int qemu_get_be16(QEMUFile *f);
64
unsigned int qemu_get_be32(QEMUFile *f);
65
uint64_t qemu_get_be64(QEMUFile *f);
66
int qemu_file_rate_limit(QEMUFile *f);
67

    
68
/* Try to send any outstanding data.  This function is useful when output is
69
 * halted due to rate limiting or EAGAIN errors occur as it can be used to
70
 * resume output. */
71
void qemu_file_put_notify(QEMUFile *f);
72

    
73
static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv)
74
{
75
    qemu_put_be64(f, *pv);
76
}
77

    
78
static inline void qemu_put_be32s(QEMUFile *f, const uint32_t *pv)
79
{
80
    qemu_put_be32(f, *pv);
81
}
82

    
83
static inline void qemu_put_be16s(QEMUFile *f, const uint16_t *pv)
84
{
85
    qemu_put_be16(f, *pv);
86
}
87

    
88
static inline void qemu_put_8s(QEMUFile *f, const uint8_t *pv)
89
{
90
    qemu_put_byte(f, *pv);
91
}
92

    
93
static inline void qemu_get_be64s(QEMUFile *f, uint64_t *pv)
94
{
95
    *pv = qemu_get_be64(f);
96
}
97

    
98
static inline void qemu_get_be32s(QEMUFile *f, uint32_t *pv)
99
{
100
    *pv = qemu_get_be32(f);
101
}
102

    
103
static inline void qemu_get_be16s(QEMUFile *f, uint16_t *pv)
104
{
105
    *pv = qemu_get_be16(f);
106
}
107

    
108
static inline void qemu_get_8s(QEMUFile *f, uint8_t *pv)
109
{
110
    *pv = qemu_get_byte(f);
111
}
112

    
113
// Signed versions for type safety
114
static inline void qemu_put_sbuffer(QEMUFile *f, const int8_t *buf, int size)
115
{
116
    qemu_put_buffer(f, (const uint8_t *)buf, size);
117
}
118

    
119
static inline void qemu_put_sbe16(QEMUFile *f, int v)
120
{
121
    qemu_put_be16(f, (unsigned int)v);
122
}
123

    
124
static inline void qemu_put_sbe32(QEMUFile *f, int v)
125
{
126
    qemu_put_be32(f, (unsigned int)v);
127
}
128

    
129
static inline void qemu_put_sbe64(QEMUFile *f, int64_t v)
130
{
131
    qemu_put_be64(f, (uint64_t)v);
132
}
133

    
134
static inline size_t qemu_get_sbuffer(QEMUFile *f, int8_t *buf, int size)
135
{
136
    return qemu_get_buffer(f, (uint8_t *)buf, size);
137
}
138

    
139
static inline int qemu_get_sbe16(QEMUFile *f)
140
{
141
    return (int)qemu_get_be16(f);
142
}
143

    
144
static inline int qemu_get_sbe32(QEMUFile *f)
145
{
146
    return (int)qemu_get_be32(f);
147
}
148

    
149
static inline int64_t qemu_get_sbe64(QEMUFile *f)
150
{
151
    return (int64_t)qemu_get_be64(f);
152
}
153

    
154
static inline void qemu_put_s8s(QEMUFile *f, const int8_t *pv)
155
{
156
    qemu_put_8s(f, (const uint8_t *)pv);
157
}
158

    
159
static inline void qemu_put_sbe16s(QEMUFile *f, const int16_t *pv)
160
{
161
    qemu_put_be16s(f, (const uint16_t *)pv);
162
}
163

    
164
static inline void qemu_put_sbe32s(QEMUFile *f, const int32_t *pv)
165
{
166
    qemu_put_be32s(f, (const uint32_t *)pv);
167
}
168

    
169
static inline void qemu_put_sbe64s(QEMUFile *f, const int64_t *pv)
170
{
171
    qemu_put_be64s(f, (const uint64_t *)pv);
172
}
173

    
174
static inline void qemu_get_s8s(QEMUFile *f, int8_t *pv)
175
{
176
    qemu_get_8s(f, (uint8_t *)pv);
177
}
178

    
179
static inline void qemu_get_sbe16s(QEMUFile *f, int16_t *pv)
180
{
181
    qemu_get_be16s(f, (uint16_t *)pv);
182
}
183

    
184
static inline void qemu_get_sbe32s(QEMUFile *f, int32_t *pv)
185
{
186
    qemu_get_be32s(f, (uint32_t *)pv);
187
}
188

    
189
static inline void qemu_get_sbe64s(QEMUFile *f, int64_t *pv)
190
{
191
    qemu_get_be64s(f, (uint64_t *)pv);
192
}
193

    
194
#ifdef NEED_CPU_H
195
#if TARGET_LONG_BITS == 64
196
#define qemu_put_betl qemu_put_be64
197
#define qemu_get_betl qemu_get_be64
198
#define qemu_put_betls qemu_put_be64s
199
#define qemu_get_betls qemu_get_be64s
200
#define qemu_put_sbetl qemu_put_sbe64
201
#define qemu_get_sbetl qemu_get_sbe64
202
#define qemu_put_sbetls qemu_put_sbe64s
203
#define qemu_get_sbetls qemu_get_sbe64s
204
#else
205
#define qemu_put_betl qemu_put_be32
206
#define qemu_get_betl qemu_get_be32
207
#define qemu_put_betls qemu_put_be32s
208
#define qemu_get_betls qemu_get_be32s
209
#define qemu_put_sbetl qemu_put_sbe32
210
#define qemu_get_sbetl qemu_get_sbe32
211
#define qemu_put_sbetls qemu_put_sbe32s
212
#define qemu_get_sbetls qemu_get_sbe32s
213
#endif
214
#endif
215

    
216
int64_t qemu_ftell(QEMUFile *f);
217
int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence);
218

    
219
typedef void SaveStateHandler(QEMUFile *f, void *opaque);
220
typedef int LoadStateHandler(QEMUFile *f, void *opaque, int version_id);
221

    
222
int register_savevm(const char *idstr,
223
                    int instance_id,
224
                    int version_id,
225
                    SaveStateHandler *save_state,
226
                    LoadStateHandler *load_state,
227
                    void *opaque);
228

    
229
typedef void QEMUResetHandler(void *opaque);
230

    
231
void qemu_register_reset(QEMUResetHandler *func, void *opaque);
232

    
233
/* handler to set the boot_device for a specific type of QEMUMachine */
234
/* return 0 if success */
235
typedef int QEMUBootSetHandler(void *opaque, const char *boot_device);
236
void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque);
237

    
238
/* These should really be in isa.h, but are here to make pc.h happy.  */
239
typedef void (IOPortWriteFunc)(void *opaque, uint32_t address, uint32_t data);
240
typedef uint32_t (IOPortReadFunc)(void *opaque, uint32_t address);
241

    
242
#endif