Statistics
| Branch: | Revision:

root / qemu-common.h @ 0428527c

History | View | Annotate | Download (8.3 kB)

1
/* Common header file that is included by all of qemu.  */
2
#ifndef QEMU_COMMON_H
3
#define QEMU_COMMON_H
4

    
5
#include "config-host.h"
6

    
7
#define QEMU_NORETURN __attribute__ ((__noreturn__))
8
#ifdef CONFIG_GCC_ATTRIBUTE_WARN_UNUSED_RESULT
9
#define QEMU_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
10
#else
11
#define QEMU_WARN_UNUSED_RESULT
12
#endif
13

    
14
#define QEMU_BUILD_BUG_ON(x) typedef char __build_bug_on__##__LINE__[(x)?-1:1];
15

    
16
typedef struct QEMUTimer QEMUTimer;
17
typedef struct QEMUFile QEMUFile;
18
typedef struct QEMUBH QEMUBH;
19
typedef struct DeviceState DeviceState;
20

    
21
/* Hack around the mess dyngen-exec.h causes: We need QEMU_NORETURN in files that
22
   cannot include the following headers without conflicts. This condition has
23
   to be removed once dyngen is gone. */
24
#ifndef __DYNGEN_EXEC_H__
25

    
26
/* we put basic includes here to avoid repeating them in device drivers */
27
#include <stdlib.h>
28
#include <stdio.h>
29
#include <stdarg.h>
30
#include <stdbool.h>
31
#include <string.h>
32
#include <strings.h>
33
#include <inttypes.h>
34
#include <limits.h>
35
#include <time.h>
36
#include <ctype.h>
37
#include <errno.h>
38
#include <unistd.h>
39
#include <fcntl.h>
40
#include <sys/stat.h>
41
#include <assert.h>
42

    
43
#ifndef O_LARGEFILE
44
#define O_LARGEFILE 0
45
#endif
46
#ifndef O_BINARY
47
#define O_BINARY 0
48
#endif
49
#ifndef MAP_ANONYMOUS
50
#define MAP_ANONYMOUS MAP_ANON
51
#endif
52
#ifndef ENOMEDIUM
53
#define ENOMEDIUM ENODEV
54
#endif
55
#if !defined(ENOTSUP)
56
#define ENOTSUP 4096
57
#endif
58

    
59
#ifndef CONFIG_IOVEC
60
#define CONFIG_IOVEC
61
struct iovec {
62
    void *iov_base;
63
    size_t iov_len;
64
};
65
/*
66
 * Use the same value as Linux for now.
67
 */
68
#define IOV_MAX                1024
69
#else
70
#include <sys/uio.h>
71
#endif
72

    
73
#ifdef _WIN32
74
#define fsync _commit
75
#define lseek _lseeki64
76
extern int qemu_ftruncate64(int, int64_t);
77
#define ftruncate qemu_ftruncate64
78

    
79
static inline char *realpath(const char *path, char *resolved_path)
80
{
81
    _fullpath(resolved_path, path, _MAX_PATH);
82
    return resolved_path;
83
}
84

    
85
#define PRId64 "I64d"
86
#define PRIx64 "I64x"
87
#define PRIu64 "I64u"
88
#define PRIo64 "I64o"
89
#endif
90

    
91
/* FIXME: Remove NEED_CPU_H.  */
92
#ifndef NEED_CPU_H
93

    
94
#include <setjmp.h>
95
#include "osdep.h"
96
#include "bswap.h"
97

    
98
#else
99

    
100
#include "cpu.h"
101

    
102
#endif /* !defined(NEED_CPU_H) */
103

    
104
/* bottom halves */
105
typedef void QEMUBHFunc(void *opaque);
106

    
107
void async_context_push(void);
108
void async_context_pop(void);
109
int get_async_context_id(void);
110

    
111
QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque);
112
void qemu_bh_schedule(QEMUBH *bh);
113
/* Bottom halfs that are scheduled from a bottom half handler are instantly
114
 * invoked.  This can create an infinite loop if a bottom half handler
115
 * schedules itself.  qemu_bh_schedule_idle() avoids this infinite loop by
116
 * ensuring that the bottom half isn't executed until the next main loop
117
 * iteration.
118
 */
119
void qemu_bh_schedule_idle(QEMUBH *bh);
120
void qemu_bh_cancel(QEMUBH *bh);
121
void qemu_bh_delete(QEMUBH *bh);
122
int qemu_bh_poll(void);
123
void qemu_bh_update_timeout(int *timeout);
124

    
125
uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c);
126

    
127
void qemu_get_timedate(struct tm *tm, int offset);
128
int qemu_timedate_diff(struct tm *tm);
129

    
130
/* cutils.c */
131
void pstrcpy(char *buf, int buf_size, const char *str);
132
char *pstrcat(char *buf, int buf_size, const char *s);
133
int strstart(const char *str, const char *val, const char **ptr);
134
int stristart(const char *str, const char *val, const char **ptr);
135
int qemu_strnlen(const char *s, int max_len);
136
time_t mktimegm(struct tm *tm);
137
int qemu_fls(int i);
138
int qemu_fdatasync(int fd);
139
int fcntl_setfl(int fd, int flag);
140

    
141
/* path.c */
142
void init_paths(const char *prefix);
143
const char *path(const char *pathname);
144

    
145
#define qemu_isalnum(c)                isalnum((unsigned char)(c))
146
#define qemu_isalpha(c)                isalpha((unsigned char)(c))
147
#define qemu_iscntrl(c)                iscntrl((unsigned char)(c))
148
#define qemu_isdigit(c)                isdigit((unsigned char)(c))
149
#define qemu_isgraph(c)                isgraph((unsigned char)(c))
150
#define qemu_islower(c)                islower((unsigned char)(c))
151
#define qemu_isprint(c)                isprint((unsigned char)(c))
152
#define qemu_ispunct(c)                ispunct((unsigned char)(c))
153
#define qemu_isspace(c)                isspace((unsigned char)(c))
154
#define qemu_isupper(c)                isupper((unsigned char)(c))
155
#define qemu_isxdigit(c)        isxdigit((unsigned char)(c))
156
#define qemu_tolower(c)                tolower((unsigned char)(c))
157
#define qemu_toupper(c)                toupper((unsigned char)(c))
158
#define qemu_isascii(c)                isascii((unsigned char)(c))
159
#define qemu_toascii(c)                toascii((unsigned char)(c))
160

    
161
void *qemu_malloc(size_t size);
162
void *qemu_realloc(void *ptr, size_t size);
163
void *qemu_mallocz(size_t size);
164
void qemu_free(void *ptr);
165
char *qemu_strdup(const char *str);
166
char *qemu_strndup(const char *str, size_t size);
167

    
168
void qemu_mutex_lock_iothread(void);
169
void qemu_mutex_unlock_iothread(void);
170

    
171
int qemu_open(const char *name, int flags, ...);
172
ssize_t qemu_write_full(int fd, const void *buf, size_t count)
173
    QEMU_WARN_UNUSED_RESULT;
174
void qemu_set_cloexec(int fd);
175

    
176
#ifndef _WIN32
177
int qemu_eventfd(int pipefd[2]);
178
int qemu_pipe(int pipefd[2]);
179
#endif
180

    
181
/* Error handling.  */
182

    
183
void QEMU_NORETURN hw_error(const char *fmt, ...)
184
    __attribute__ ((__format__ (__printf__, 1, 2)));
185

    
186
/* IO callbacks.  */
187
typedef void IOReadHandler(void *opaque, const uint8_t *buf, int size);
188
typedef int IOCanReadHandler(void *opaque);
189
typedef void IOHandler(void *opaque);
190

    
191
struct ParallelIOArg {
192
    void *buffer;
193
    int count;
194
};
195

    
196
typedef int (*DMA_transfer_handler) (void *opaque, int nchan, int pos, int size);
197

    
198
/* A load of opaque types so that device init declarations don't have to
199
   pull in all the real definitions.  */
200
typedef struct NICInfo NICInfo;
201
typedef struct HCIInfo HCIInfo;
202
typedef struct AudioState AudioState;
203
typedef struct BlockDriverState BlockDriverState;
204
typedef struct DisplayState DisplayState;
205
typedef struct DisplayChangeListener DisplayChangeListener;
206
typedef struct DisplaySurface DisplaySurface;
207
typedef struct DisplayAllocator DisplayAllocator;
208
typedef struct PixelFormat PixelFormat;
209
typedef struct TextConsole TextConsole;
210
typedef TextConsole QEMUConsole;
211
typedef struct CharDriverState CharDriverState;
212
typedef struct MACAddr MACAddr;
213
typedef struct VLANState VLANState;
214
typedef struct VLANClientState VLANClientState;
215
typedef struct i2c_bus i2c_bus;
216
typedef struct i2c_slave i2c_slave;
217
typedef struct SMBusDevice SMBusDevice;
218
typedef struct PCIHostState PCIHostState;
219
typedef struct PCIExpressHost PCIExpressHost;
220
typedef struct PCIBus PCIBus;
221
typedef struct PCIDevice PCIDevice;
222
typedef struct PCIExpressDevice PCIExpressDevice;
223
typedef struct PCIBridge PCIBridge;
224
typedef struct SerialState SerialState;
225
typedef struct IRQState *qemu_irq;
226
typedef struct PCMCIACardState PCMCIACardState;
227
typedef struct MouseTransformInfo MouseTransformInfo;
228
typedef struct uWireSlave uWireSlave;
229
typedef struct I2SCodec I2SCodec;
230
typedef struct SSIBus SSIBus;
231
typedef struct EventNotifier EventNotifier;
232
typedef struct VirtIODevice VirtIODevice;
233

    
234
typedef uint64_t pcibus_t;
235

    
236
void cpu_exec_init_all(unsigned long tb_size);
237

    
238
/* CPU save/load.  */
239
void cpu_save(QEMUFile *f, void *opaque);
240
int cpu_load(QEMUFile *f, void *opaque, int version_id);
241

    
242
/* Force QEMU to stop what it's doing and service IO */
243
void qemu_service_io(void);
244

    
245
/* Force QEMU to process pending events */
246
void qemu_notify_event(void);
247

    
248
/* Unblock cpu */
249
void qemu_cpu_kick(void *env);
250
int qemu_cpu_self(void *env);
251

    
252
/* work queue */
253
struct qemu_work_item {
254
    struct qemu_work_item *next;
255
    void (*func)(void *data);
256
    void *data;
257
    int done;
258
};
259

    
260
#ifdef CONFIG_USER_ONLY
261
#define qemu_init_vcpu(env) do { } while (0)
262
#else
263
void qemu_init_vcpu(void *env);
264
#endif
265

    
266
typedef struct QEMUIOVector {
267
    struct iovec *iov;
268
    int niov;
269
    int nalloc;
270
    size_t size;
271
} QEMUIOVector;
272

    
273
void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint);
274
void qemu_iovec_init_external(QEMUIOVector *qiov, struct iovec *iov, int niov);
275
void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len);
276
void qemu_iovec_concat(QEMUIOVector *dst, QEMUIOVector *src, size_t size);
277
void qemu_iovec_destroy(QEMUIOVector *qiov);
278
void qemu_iovec_reset(QEMUIOVector *qiov);
279
void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf);
280
void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t count);
281

    
282
struct Monitor;
283
typedef struct Monitor Monitor;
284

    
285
/* Convert a byte between binary and BCD.  */
286
static inline uint8_t to_bcd(uint8_t val)
287
{
288
    return ((val / 10) << 4) | (val % 10);
289
}
290

    
291
static inline uint8_t from_bcd(uint8_t val)
292
{
293
    return ((val >> 4) * 10) + (val & 0x0f);
294
}
295

    
296
#include "module.h"
297

    
298
#endif /* dyngen-exec.h hack */
299

    
300
#endif