]> git.proxmox.com Git - qemu.git/blame - include/qemu-common.h
Revert "versatile_pci: Put the host bridge PCI device at slot 29"
[qemu.git] / include / qemu-common.h
CommitLineData
9fb26641 1
04509ad9
EH
2/* Common header file that is included by all of QEMU.
3 *
4 * This file is supposed to be included only by .c files. No header file should
5 * depend on qemu-common.h, as this would easily lead to circular header
6 * dependencies.
7 *
8 * If a header file uses a definition from qemu-common.h, that definition
9 * must be moved to a separate header file, and the header that uses it
10 * must include that header.
11 */
faf07963
PB
12#ifndef QEMU_COMMON_H
13#define QEMU_COMMON_H
14
1de7afc9 15#include "qemu/compiler.h"
beb6f0de 16#include "config-host.h"
1de7afc9 17#include "qemu/typedefs.h"
beb6f0de 18
332ae28d
PB
19#if defined(__arm__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__) || defined(__ia64__)
20#define WORDS_ALIGNED
21#endif
22
082b5557 23#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
24ebf5f3 24
faf07963
PB
25/* we put basic includes here to avoid repeating them in device drivers */
26#include <stdlib.h>
27#include <stdio.h>
28#include <stdarg.h>
11165820 29#include <stdbool.h>
faf07963 30#include <string.h>
c8906845 31#include <strings.h>
faf07963
PB
32#include <inttypes.h>
33#include <limits.h>
34#include <time.h>
35#include <ctype.h>
36#include <errno.h>
37#include <unistd.h>
38#include <fcntl.h>
39#include <sys/stat.h>
dcfd0865 40#include <sys/time.h>
55616505 41#include <assert.h>
86f69a92 42#include <signal.h>
d63c9477 43#include "glib-compat.h"
faf07963 44
7791dba3
PB
45#if defined(__GLIBC__)
46# include <pty.h>
47#elif defined CONFIG_BSD
48# if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
49# include <libutil.h>
50# else
51# include <util.h>
52# endif
53#elif defined CONFIG_SOLARIS
54# include <stropts.h>
55#endif
56
082b5557 57#ifdef _WIN32
9c17d615 58#include "sysemu/os-win32.h"
082b5557
BS
59#endif
60
61#ifdef CONFIG_POSIX
9c17d615 62#include "sysemu/os-posix.h"
082b5557
BS
63#endif
64
faf07963
PB
65#ifndef O_LARGEFILE
66#define O_LARGEFILE 0
67#endif
68#ifndef O_BINARY
69#define O_BINARY 0
70#endif
0e74e66b
JQ
71#ifndef MAP_ANONYMOUS
72#define MAP_ANONYMOUS MAP_ANON
73#endif
faf07963
PB
74#ifndef ENOMEDIUM
75#define ENOMEDIUM ENODEV
76#endif
4c955388 77#if !defined(ENOTSUP)
2880bc32
JQ
78#define ENOTSUP 4096
79#endif
2084a8e3
PB
80#if !defined(ECANCELED)
81#define ECANCELED 4097
82#endif
02582abd
SW
83#if !defined(EMEDIUMTYPE)
84#define EMEDIUMTYPE 4098
85#endif
3c9405a0
GH
86#ifndef TIME_MAX
87#define TIME_MAX LONG_MAX
88#endif
faf07963 89
c0fd260e
SW
90/* HOST_LONG_BITS is the size of a native pointer in bits. */
91#if UINTPTR_MAX == UINT32_MAX
92# define HOST_LONG_BITS 32
93#elif UINTPTR_MAX == UINT64_MAX
94# define HOST_LONG_BITS 64
95#else
96# error Unknown pointer size
97#endif
98
f868445a
SW
99typedef int (*fprintf_function)(FILE *f, const char *fmt, ...)
100 GCC_FMT_ATTR(2, 3);
101
faf07963 102#ifdef _WIN32
faf07963 103#define fsync _commit
371c6489
SW
104#if !defined(lseek)
105# define lseek _lseeki64
106#endif
64b85a8f 107int qemu_ftruncate64(int, int64_t);
371c6489
SW
108#if !defined(ftruncate)
109# define ftruncate qemu_ftruncate64
110#endif
faf07963 111
faf07963
PB
112static inline char *realpath(const char *path, char *resolved_path)
113{
114 _fullpath(resolved_path, path, _MAX_PATH);
115 return resolved_path;
116}
faf07963
PB
117#endif
118
946fb27c
PB
119/* icount */
120void configure_icount(const char *option);
121extern int use_icount;
122
1de7afc9
PB
123#include "qemu/osdep.h"
124#include "qemu/bswap.h"
faf07963 125
9adea5f7
PB
126/* FIXME: Remove NEED_CPU_H. */
127#ifdef NEED_CPU_H
faf07963 128#include "cpu.h"
faf07963
PB
129#endif /* !defined(NEED_CPU_H) */
130
3bbbee18
AF
131/* main function, renamed */
132#if defined(CONFIG_COCOA)
133int qemu_main(int argc, char **argv, char **envp);
134#endif
135
f6503059
AZ
136void qemu_get_timedate(struct tm *tm, int offset);
137int qemu_timedate_diff(struct tm *tm);
138
31e76f65
AG
139#if !GLIB_CHECK_VERSION(2, 20, 0)
140/*
141 * Glib before 2.20.0 doesn't implement g_poll, so wrap it to compile properly
142 * on older systems.
143 */
144static inline gint g_poll(GPollFD *fds, guint nfds, gint timeout)
145{
146 GMainContext *ctx = g_main_context_default();
147 return g_main_context_get_poll_func(ctx)(fds, nfds, timeout);
148}
149#endif
150
c8057f95
PM
151/**
152 * is_help_option:
153 * @s: string to test
154 *
155 * Check whether @s is one of the standard strings which indicate
156 * that the user is asking for a list of the valid values for a
157 * command option like -cpu or -M. The current accepted strings
158 * are 'help' and '?'. '?' is deprecated (it is a shell wildcard
159 * which makes it annoying to use in a reliable way) but provided
160 * for backwards compatibility.
161 *
162 * Returns: true if @s is a request for a list.
163 */
164static inline bool is_help_option(const char *s)
165{
166 return !strcmp(s, "?") || !strcmp(s, "help");
167}
168
faf07963
PB
169/* cutils.c */
170void pstrcpy(char *buf, int buf_size, const char *str);
2a025ae4 171void strpadcpy(char *buf, int buf_size, const char *str, char pad);
faf07963
PB
172char *pstrcat(char *buf, int buf_size, const char *s);
173int strstart(const char *str, const char *val, const char **ptr);
174int stristart(const char *str, const char *val, const char **ptr);
d43277c5 175int qemu_strnlen(const char *s, int max_len);
faf07963 176time_t mktimegm(struct tm *tm);
ad46db9a 177int qemu_fls(int i);
6f1953c4 178int qemu_fdatasync(int fd);
db1a4972 179int fcntl_setfl(int fd, int flag);
443916d1 180int qemu_parse_fd(const char *param);
d8427002 181
e3f9fe2d
EH
182int parse_uint(const char *s, unsigned long long *value, char **endptr,
183 int base);
184int parse_uint_full(const char *s, unsigned long long *value, int base);
185
d7142456
JS
186/*
187 * strtosz() suffixes used to specify the default treatment of an
188 * argument passed to strtosz() without an explicit suffix.
189 * These should be defined using upper case characters in the range
190 * A-Z, as strtosz() will use qemu_toupper() on the given argument
191 * prior to comparison.
192 */
d8427002
JS
193#define STRTOSZ_DEFSUFFIX_TB 'T'
194#define STRTOSZ_DEFSUFFIX_GB 'G'
195#define STRTOSZ_DEFSUFFIX_MB 'M'
196#define STRTOSZ_DEFSUFFIX_KB 'K'
197#define STRTOSZ_DEFSUFFIX_B 'B'
70b4f4bb
JS
198int64_t strtosz(const char *nptr, char **end);
199int64_t strtosz_suffix(const char *nptr, char **end, const char default_suffix);
a732e1ba
JR
200int64_t strtosz_suffix_unit(const char *nptr, char **end,
201 const char default_suffix, int64_t unit);
faf07963 202
37022086
BS
203/* path.c */
204void init_paths(const char *prefix);
205const char *path(const char *pathname);
206
cd390083
BS
207#define qemu_isalnum(c) isalnum((unsigned char)(c))
208#define qemu_isalpha(c) isalpha((unsigned char)(c))
209#define qemu_iscntrl(c) iscntrl((unsigned char)(c))
210#define qemu_isdigit(c) isdigit((unsigned char)(c))
211#define qemu_isgraph(c) isgraph((unsigned char)(c))
212#define qemu_islower(c) islower((unsigned char)(c))
213#define qemu_isprint(c) isprint((unsigned char)(c))
214#define qemu_ispunct(c) ispunct((unsigned char)(c))
215#define qemu_isspace(c) isspace((unsigned char)(c))
216#define qemu_isupper(c) isupper((unsigned char)(c))
217#define qemu_isxdigit(c) isxdigit((unsigned char)(c))
218#define qemu_tolower(c) tolower((unsigned char)(c))
219#define qemu_toupper(c) toupper((unsigned char)(c))
220#define qemu_isascii(c) isascii((unsigned char)(c))
221#define qemu_toascii(c) toascii((unsigned char)(c))
222
b152aa84 223void *qemu_oom_check(void *ptr);
ca10f867 224
7c7c0629
JQ
225ssize_t qemu_write_full(int fd, const void *buf, size_t count)
226 QEMU_WARN_UNUSED_RESULT;
993295fe
PB
227ssize_t qemu_send_full(int fd, const void *buf, size_t count, int flags)
228 QEMU_WARN_UNUSED_RESULT;
8c5135f9 229ssize_t qemu_recv_full(int fd, void *buf, size_t count, int flags)
993295fe 230 QEMU_WARN_UNUSED_RESULT;
40ff6d7e
KW
231
232#ifndef _WIN32
233int qemu_pipe(int pipefd[2]);
234#endif
235
00aa0040 236#ifdef _WIN32
58455eb9
SW
237/* MinGW needs type casts for the 'buf' and 'optval' arguments. */
238#define qemu_getsockopt(sockfd, level, optname, optval, optlen) \
239 getsockopt(sockfd, level, optname, (void *)optval, optlen)
240#define qemu_setsockopt(sockfd, level, optname, optval, optlen) \
241 setsockopt(sockfd, level, optname, (const void *)optval, optlen)
00aa0040 242#define qemu_recv(sockfd, buf, len, flags) recv(sockfd, (void *)buf, len, flags)
73062dfe
SW
243#define qemu_sendto(sockfd, buf, len, flags, destaddr, addrlen) \
244 sendto(sockfd, (const void *)buf, len, flags, destaddr, addrlen)
00aa0040 245#else
58455eb9
SW
246#define qemu_getsockopt(sockfd, level, optname, optval, optlen) \
247 getsockopt(sockfd, level, optname, optval, optlen)
248#define qemu_setsockopt(sockfd, level, optname, optval, optlen) \
249 setsockopt(sockfd, level, optname, optval, optlen)
00aa0040 250#define qemu_recv(sockfd, buf, len, flags) recv(sockfd, buf, len, flags)
73062dfe
SW
251#define qemu_sendto(sockfd, buf, len, flags, destaddr, addrlen) \
252 sendto(sockfd, buf, len, flags, destaddr, addrlen)
00aa0040
BS
253#endif
254
87ecb68b
PB
255/* Error handling. */
256
e5924d89 257void QEMU_NORETURN hw_error(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
87ecb68b 258
87ecb68b
PB
259struct ParallelIOArg {
260 void *buffer;
261 int count;
262};
263
264typedef int (*DMA_transfer_handler) (void *opaque, int nchan, int pos, int size);
265
186993ee
MT
266typedef uint64_t pcibus_t;
267
4e4fa398
JK
268typedef enum LostTickPolicy {
269 LOST_TICK_DISCARD,
270 LOST_TICK_DELAY,
271 LOST_TICK_MERGE,
272 LOST_TICK_SLEW,
1ce05125 273 LOST_TICK_MAX
4e4fa398
JK
274} LostTickPolicy;
275
679042f0
AP
276typedef struct PCIHostDeviceAddress {
277 unsigned int domain;
278 unsigned int bus;
279 unsigned int slot;
280 unsigned int function;
281} PCIHostDeviceAddress;
282
d5ab9713
JK
283void tcg_exec_init(unsigned long tb_size);
284bool tcg_enabled(void);
285
286void cpu_exec_init_all(void);
d2053c3c 287
b3c7724c
PB
288/* CPU save/load. */
289void cpu_save(QEMUFile *f, void *opaque);
290int cpu_load(QEMUFile *f, void *opaque, int version_id);
291
8edac960 292/* Unblock cpu */
46d62fac 293void qemu_cpu_kick_self(void);
8edac960 294
e82bcec2
MT
295/* work queue */
296struct qemu_work_item {
297 struct qemu_work_item *next;
298 void (*func)(void *data);
299 void *data;
300 int done;
301};
302
0bf46a40 303#ifdef CONFIG_USER_ONLY
75a192aa
AF
304static inline void qemu_init_vcpu(void *env)
305{
306}
0bf46a40
AL
307#else
308void qemu_init_vcpu(void *env);
309#endif
310
8c5135f9
PB
311
312/**
2fc8ae1d
MT
313 * Sends a (part of) iovec down a socket, yielding when the socket is full, or
314 * Receives data into a (part of) iovec from a socket,
315 * yielding when there is no data in the socket.
316 * The same interface as qemu_sendv_recvv(), with added yielding.
317 * XXX should mark these as coroutine_fn
8c5135f9 318 */
2fc8ae1d
MT
319ssize_t qemu_co_sendv_recvv(int sockfd, struct iovec *iov, unsigned iov_cnt,
320 size_t offset, size_t bytes, bool do_send);
321#define qemu_co_recvv(sockfd, iov, iov_cnt, offset, bytes) \
322 qemu_co_sendv_recvv(sockfd, iov, iov_cnt, offset, bytes, false)
323#define qemu_co_sendv(sockfd, iov, iov_cnt, offset, bytes) \
324 qemu_co_sendv_recvv(sockfd, iov, iov_cnt, offset, bytes, true)
8c5135f9
PB
325
326/**
2fc8ae1d 327 * The same as above, but with just a single buffer
8c5135f9 328 */
2fc8ae1d
MT
329ssize_t qemu_co_send_recv(int sockfd, void *buf, size_t bytes, bool do_send);
330#define qemu_co_recv(sockfd, buf, bytes) \
331 qemu_co_send_recv(sockfd, buf, bytes, false)
332#define qemu_co_send(sockfd, buf, bytes) \
333 qemu_co_send_recv(sockfd, buf, bytes, true)
8c5135f9 334
44e3ee8a
AL
335typedef struct QEMUIOVector {
336 struct iovec *iov;
337 int niov;
338 int nalloc;
249aa745 339 size_t size;
44e3ee8a
AL
340} QEMUIOVector;
341
342void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint);
522584a5 343void qemu_iovec_init_external(QEMUIOVector *qiov, struct iovec *iov, int niov);
44e3ee8a 344void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len);
1b093c48
MT
345void qemu_iovec_concat(QEMUIOVector *dst,
346 QEMUIOVector *src, size_t soffset, size_t sbytes);
530c0bbd
SH
347void qemu_iovec_concat_iov(QEMUIOVector *dst,
348 struct iovec *src_iov, unsigned int src_cnt,
349 size_t soffset, size_t sbytes);
44e3ee8a 350void qemu_iovec_destroy(QEMUIOVector *qiov);
be959463 351void qemu_iovec_reset(QEMUIOVector *qiov);
d5e6b161
MT
352size_t qemu_iovec_to_buf(QEMUIOVector *qiov, size_t offset,
353 void *buf, size_t bytes);
03396148
MT
354size_t qemu_iovec_from_buf(QEMUIOVector *qiov, size_t offset,
355 const void *buf, size_t bytes);
3d9b4925
MT
356size_t qemu_iovec_memset(QEMUIOVector *qiov, size_t offset,
357 int fillc, size_t bytes);
44e3ee8a 358
1a6d39fd
SH
359bool buffer_is_zero(const void *buf, size_t len);
360
6b837bc4
JS
361void qemu_progress_init(int enabled, float min_skip);
362void qemu_progress_end(void);
3bfe4dbf 363void qemu_progress_print(float delta, int max);
31459f46 364const char *qemu_get_vm_name(void);
6b837bc4 365
082b5557
BS
366#define QEMU_FILE_TYPE_BIOS 0
367#define QEMU_FILE_TYPE_KEYMAP 1
368char *qemu_find_file(int type, const char *name);
369
370/* OS specific functions */
371void os_setup_early_signal_handling(void);
372char *os_find_datadir(const char *argv0);
373void os_parse_cmd_args(int index, const char *optarg);
374void os_pidfile_error(void);
375
abd0c6bd
PB
376/* Convert a byte between binary and BCD. */
377static inline uint8_t to_bcd(uint8_t val)
378{
379 return ((val / 10) << 4) | (val % 10);
380}
381
382static inline uint8_t from_bcd(uint8_t val)
383{
384 return ((val >> 4) * 10) + (val & 0x0f);
385}
386
338b922e 387/* compute with 96 bit intermediate result: (a*b)/c */
388static inline uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
389{
390 union {
391 uint64_t ll;
392 struct {
393#ifdef HOST_WORDS_BIGENDIAN
394 uint32_t high, low;
395#else
396 uint32_t low, high;
397#endif
398 } l;
399 } u, res;
400 uint64_t rl, rh;
401
402 u.ll = a;
403 rl = (uint64_t)u.l.low * (uint64_t)b;
404 rh = (uint64_t)u.l.high * (uint64_t)b;
405 rh += (rl >> 32);
406 res.l.high = rh / c;
407 res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
408 return res.ll;
409}
410
3951690a
SH
411/* Round number down to multiple */
412#define QEMU_ALIGN_DOWN(n, m) ((n) / (m) * (m))
413
414/* Round number up to multiple */
415#define QEMU_ALIGN_UP(n, m) QEMU_ALIGN_DOWN((n) + (m) - 1, (m))
416
9fb26641
OW
417static inline bool is_power_of_2(uint64_t value)
418{
419 if (!value) {
420 return 0;
421 }
422
423 return !(value & (value - 1));
424}
425
426/* round down to the nearest power of 2*/
427int64_t pow2floor(int64_t value);
428
1de7afc9 429#include "qemu/module.h"
0bfe3ca5 430
e6546bb9
OW
431/*
432 * Implementation of ULEB128 (http://en.wikipedia.org/wiki/LEB128)
433 * Input is limited to 14-bit numbers
434 */
435
436int uleb128_encode_small(uint8_t *out, uint32_t n);
437int uleb128_decode_small(const uint8_t *in, uint32_t *n);
438
cb2744ea
MA
439/* unicode.c */
440int mod_utf8_codepoint(const char *s, size_t n, char **end);
441
6ff66f50
PC
442/*
443 * Hexdump a buffer to a file. An optional string prefix is added to every line
444 */
445
446void hexdump(const char *buf, FILE *fp, const char *prefix, size_t size);
447
c61ca00a
PL
448/* vector definitions */
449#ifdef __ALTIVEC__
450#include <altivec.h>
451#define VECTYPE vector unsigned char
452#define SPLAT(p) vec_splat(vec_ld(0, p), 0)
453#define ALL_EQ(v1, v2) vec_all_eq(v1, v2)
454/* altivec.h may redefine the bool macro as vector type.
455 * Reset it to POSIX semantics. */
456#undef bool
457#define bool _Bool
458#elif defined __SSE2__
459#include <emmintrin.h>
460#define VECTYPE __m128i
461#define SPLAT(p) _mm_set1_epi8(*(p))
462#define ALL_EQ(v1, v2) (_mm_movemask_epi8(_mm_cmpeq_epi8(v1, v2)) == 0xFFFF)
463#else
464#define VECTYPE unsigned long
465#define SPLAT(p) (*(p) * (~0UL / 255))
466#define ALL_EQ(v1, v2) ((v1) == (v2))
467#endif
468
41a259bd
PL
469#define BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR 8
470static inline bool
471can_use_buffer_find_nonzero_offset(const void *buf, size_t len)
472{
473 return (len % (BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR
474 * sizeof(VECTYPE)) == 0
475 && ((uintptr_t) buf) % sizeof(VECTYPE) == 0);
476}
477size_t buffer_find_nonzero_offset(const void *buf, size_t len);
478
b16352ac
AL
479/*
480 * helper to parse debug environment variables
481 */
482int parse_debug_env(const char *name, int max, int initial);
483
faf07963 484#endif