1
/* Common header file that is included by all of qemu. */
6
#include "config-host.h"
8
#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
10
typedef struct QEMUTimer QEMUTimer;
11
typedef struct QEMUFile QEMUFile;
12
typedef struct QEMUBH QEMUBH;
13
typedef struct DeviceState DeviceState;
16
typedef struct Monitor Monitor;
18
/* we put basic includes here to avoid repeating them in device drivers */
38
#include "qemu-os-win32.h"
42
#include "qemu-os-posix.h"
52
#define MAP_ANONYMOUS MAP_ANON
55
#define ENOMEDIUM ENODEV
61
#define TIME_MAX LONG_MAX
71
* Use the same value as Linux for now.
78
typedef int (*fprintf_function)(FILE *f, const char *fmt, ...)
83
#define lseek _lseeki64
84
int qemu_ftruncate64(int, int64_t);
85
#define ftruncate qemu_ftruncate64
87
static inline char *realpath(const char *path, char *resolved_path)
89
_fullpath(resolved_path, path, _MAX_PATH);
94
/* FIXME: Remove NEED_CPU_H. */
104
#endif /* !defined(NEED_CPU_H) */
106
/* main function, renamed */
107
#if defined(CONFIG_COCOA)
108
int qemu_main(int argc, char **argv, char **envp);
112
typedef void QEMUBHFunc(void *opaque);
114
void async_context_push(void);
115
void async_context_pop(void);
116
int get_async_context_id(void);
118
QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque);
119
void qemu_bh_schedule(QEMUBH *bh);
120
/* Bottom halfs that are scheduled from a bottom half handler are instantly
121
* invoked. This can create an infinite loop if a bottom half handler
122
* schedules itself. qemu_bh_schedule_idle() avoids this infinite loop by
123
* ensuring that the bottom half isn't executed until the next main loop
126
void qemu_bh_schedule_idle(QEMUBH *bh);
127
void qemu_bh_cancel(QEMUBH *bh);
128
void qemu_bh_delete(QEMUBH *bh);
129
int qemu_bh_poll(void);
130
void qemu_bh_update_timeout(int *timeout);
132
void qemu_get_timedate(struct tm *tm, int offset);
133
int qemu_timedate_diff(struct tm *tm);
136
void pstrcpy(char *buf, int buf_size, const char *str);
137
char *pstrcat(char *buf, int buf_size, const char *s);
138
int strstart(const char *str, const char *val, const char **ptr);
139
int stristart(const char *str, const char *val, const char **ptr);
140
int qemu_strnlen(const char *s, int max_len);
141
time_t mktimegm(struct tm *tm);
143
int qemu_fdatasync(int fd);
144
int fcntl_setfl(int fd, int flag);
147
* strtosz() suffixes used to specify the default treatment of an
148
* argument passed to strtosz() without an explicit suffix.
149
* These should be defined using upper case characters in the range
150
* A-Z, as strtosz() will use qemu_toupper() on the given argument
151
* prior to comparison.
153
#define STRTOSZ_DEFSUFFIX_TB 'T'
154
#define STRTOSZ_DEFSUFFIX_GB 'G'
155
#define STRTOSZ_DEFSUFFIX_MB 'M'
156
#define STRTOSZ_DEFSUFFIX_KB 'K'
157
#define STRTOSZ_DEFSUFFIX_B 'B'
158
int64_t strtosz(const char *nptr, char **end);
159
int64_t strtosz_suffix(const char *nptr, char **end, const char default_suffix);
162
void init_paths(const char *prefix);
163
const char *path(const char *pathname);
165
#define qemu_isalnum(c) isalnum((unsigned char)(c))
166
#define qemu_isalpha(c) isalpha((unsigned char)(c))
167
#define qemu_iscntrl(c) iscntrl((unsigned char)(c))
168
#define qemu_isdigit(c) isdigit((unsigned char)(c))
169
#define qemu_isgraph(c) isgraph((unsigned char)(c))
170
#define qemu_islower(c) islower((unsigned char)(c))
171
#define qemu_isprint(c) isprint((unsigned char)(c))
172
#define qemu_ispunct(c) ispunct((unsigned char)(c))
173
#define qemu_isspace(c) isspace((unsigned char)(c))
174
#define qemu_isupper(c) isupper((unsigned char)(c))
175
#define qemu_isxdigit(c) isxdigit((unsigned char)(c))
176
#define qemu_tolower(c) tolower((unsigned char)(c))
177
#define qemu_toupper(c) toupper((unsigned char)(c))
178
#define qemu_isascii(c) isascii((unsigned char)(c))
179
#define qemu_toascii(c) toascii((unsigned char)(c))
181
void *qemu_oom_check(void *ptr);
182
void *qemu_malloc(size_t size);
183
void *qemu_realloc(void *ptr, size_t size);
184
void *qemu_mallocz(size_t size);
185
void qemu_free(void *ptr);
186
char *qemu_strdup(const char *str);
187
char *qemu_strndup(const char *str, size_t size);
189
void qemu_mutex_lock_iothread(void);
190
void qemu_mutex_unlock_iothread(void);
192
int qemu_open(const char *name, int flags, ...);
193
ssize_t qemu_write_full(int fd, const void *buf, size_t count)
194
QEMU_WARN_UNUSED_RESULT;
195
void qemu_set_cloexec(int fd);
198
int qemu_add_child_watch(pid_t pid);
199
int qemu_eventfd(int pipefd[2]);
200
int qemu_pipe(int pipefd[2]);
204
#define qemu_recv(sockfd, buf, len, flags) recv(sockfd, (void *)buf, len, flags)
206
#define qemu_recv(sockfd, buf, len, flags) recv(sockfd, buf, len, flags)
209
/* Error handling. */
211
void QEMU_NORETURN hw_error(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
214
typedef void IOReadHandler(void *opaque, const uint8_t *buf, int size);
215
typedef int IOCanReadHandler(void *opaque);
216
typedef void IOHandler(void *opaque);
218
void qemu_iohandler_fill(int *pnfds, fd_set *readfds, fd_set *writefds, fd_set *xfds);
219
void qemu_iohandler_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds, int rc);
221
struct ParallelIOArg {
226
typedef int (*DMA_transfer_handler) (void *opaque, int nchan, int pos, int size);
228
/* A load of opaque types so that device init declarations don't have to
229
pull in all the real definitions. */
230
typedef struct NICInfo NICInfo;
231
typedef struct HCIInfo HCIInfo;
232
typedef struct AudioState AudioState;
233
typedef struct BlockDriverState BlockDriverState;
234
typedef struct DriveInfo DriveInfo;
235
typedef struct DisplayState DisplayState;
236
typedef struct DisplayChangeListener DisplayChangeListener;
237
typedef struct DisplaySurface DisplaySurface;
238
typedef struct DisplayAllocator DisplayAllocator;
239
typedef struct PixelFormat PixelFormat;
240
typedef struct TextConsole TextConsole;
241
typedef TextConsole QEMUConsole;
242
typedef struct CharDriverState CharDriverState;
243
typedef struct MACAddr MACAddr;
244
typedef struct VLANState VLANState;
245
typedef struct VLANClientState VLANClientState;
246
typedef struct i2c_bus i2c_bus;
247
typedef struct i2c_slave i2c_slave;
248
typedef struct SMBusDevice SMBusDevice;
249
typedef struct PCIHostState PCIHostState;
250
typedef struct PCIExpressHost PCIExpressHost;
251
typedef struct PCIBus PCIBus;
252
typedef struct PCIDevice PCIDevice;
253
typedef struct PCIExpressDevice PCIExpressDevice;
254
typedef struct PCIBridge PCIBridge;
255
typedef struct PCIEAERMsg PCIEAERMsg;
256
typedef struct PCIEAERLog PCIEAERLog;
257
typedef struct PCIEAERErr PCIEAERErr;
258
typedef struct PCIEPort PCIEPort;
259
typedef struct PCIESlot PCIESlot;
260
typedef struct SerialState SerialState;
261
typedef struct IRQState *qemu_irq;
262
typedef struct PCMCIACardState PCMCIACardState;
263
typedef struct MouseTransformInfo MouseTransformInfo;
264
typedef struct uWireSlave uWireSlave;
265
typedef struct I2SCodec I2SCodec;
266
typedef struct SSIBus SSIBus;
267
typedef struct EventNotifier EventNotifier;
268
typedef struct VirtIODevice VirtIODevice;
270
typedef uint64_t pcibus_t;
272
void cpu_exec_init_all(unsigned long tb_size);
275
void cpu_save(QEMUFile *f, void *opaque);
276
int cpu_load(QEMUFile *f, void *opaque, int version_id);
278
/* Force QEMU to stop what it's doing and service IO */
279
void qemu_service_io(void);
281
/* Force QEMU to process pending events */
282
void qemu_notify_event(void);
285
void qemu_cpu_kick(void *env);
286
void qemu_cpu_kick_self(void);
287
int qemu_cpu_is_self(void *env);
288
bool all_cpu_threads_idle(void);
291
struct qemu_work_item {
292
struct qemu_work_item *next;
293
void (*func)(void *data);
298
#ifdef CONFIG_USER_ONLY
299
#define qemu_init_vcpu(env) do { } while (0)
301
void qemu_init_vcpu(void *env);
304
typedef struct QEMUIOVector {
311
void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint);
312
void qemu_iovec_init_external(QEMUIOVector *qiov, struct iovec *iov, int niov);
313
void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len);
314
void qemu_iovec_copy(QEMUIOVector *dst, QEMUIOVector *src, uint64_t skip,
316
void qemu_iovec_concat(QEMUIOVector *dst, QEMUIOVector *src, size_t size);
317
void qemu_iovec_destroy(QEMUIOVector *qiov);
318
void qemu_iovec_reset(QEMUIOVector *qiov);
319
void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf);
320
void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t count);
321
void qemu_iovec_memset(QEMUIOVector *qiov, int c, size_t count);
322
void qemu_iovec_memset_skip(QEMUIOVector *qiov, int c, size_t count,
325
void qemu_progress_init(int enabled, float min_skip);
326
void qemu_progress_end(void);
327
void qemu_progress_print(float delta, int max);
329
#define QEMU_FILE_TYPE_BIOS 0
330
#define QEMU_FILE_TYPE_KEYMAP 1
331
char *qemu_find_file(int type, const char *name);
333
/* OS specific functions */
334
void os_setup_early_signal_handling(void);
335
char *os_find_datadir(const char *argv0);
336
void os_parse_cmd_args(int index, const char *optarg);
337
void os_pidfile_error(void);
339
/* Convert a byte between binary and BCD. */
340
static inline uint8_t to_bcd(uint8_t val)
342
return ((val / 10) << 4) | (val % 10);
345
static inline uint8_t from_bcd(uint8_t val)
347
return ((val >> 4) * 10) + (val & 0x0f);
350
/* compute with 96 bit intermediate result: (a*b)/c */
351
static inline uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
356
#ifdef HOST_WORDS_BIGENDIAN
366
rl = (uint64_t)u.l.low * (uint64_t)b;
367
rh = (uint64_t)u.l.high * (uint64_t)b;
370
res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;