]> git.ipfire.org Git - thirdparty/qemu.git/blame - include/qemu/osdep.h
Fix QEMU build on OpenBSD on x86 archs
[thirdparty/qemu.git] / include / qemu / osdep.h
CommitLineData
ea88812f
FB
1#ifndef QEMU_OSDEP_H
2#define QEMU_OSDEP_H
3
9adea5f7 4#include "config-host.h"
ea88812f 5#include <stdarg.h>
de5071c5 6#include <stddef.h>
0f66998f 7#include <stdbool.h>
128ab2ff 8#include <sys/types.h>
98b2d199 9#ifdef __OpenBSD__
128ab2ff
BS
10#include <sys/signal.h>
11#endif
ea88812f 12
13c7b2da
PB
13#ifndef _WIN32
14#include <sys/wait.h>
15#else
16#define WIFEXITED(x) 1
17#define WEXITSTATUS(x) (x)
18#endif
19
f7b4a940 20#include <sys/time.h>
f7b4a940 21
dda3c2ee
AF
22#if defined(CONFIG_SOLARIS) && CONFIG_SOLARIS_VERSION < 10
23/* [u]int_fast*_t not in <sys/int_types.h> */
24typedef unsigned char uint_fast8_t;
25typedef unsigned int uint_fast16_t;
94a49d86 26typedef signed int int_fast16_t;
dda3c2ee
AF
27#endif
28
df2542c7
JM
29#ifndef glue
30#define xglue(x, y) x ## y
31#define glue(x, y) xglue(x, y)
32#define stringify(s) tostring(s)
33#define tostring(s) #s
34#endif
35
36#ifndef likely
37#if __GNUC__ < 3
38#define __builtin_expect(x, n) (x)
39#endif
40
41#define likely(x) __builtin_expect(!!(x), 1)
42#define unlikely(x) __builtin_expect(!!(x), 0)
43#endif
44
ac509d88 45#ifndef container_of
62a6e3e1 46#define container_of(ptr, type, member) ({ \
ac509d88
AZ
47 const typeof(((type *) 0)->member) *__mptr = (ptr); \
48 (type *) ((char *) __mptr - offsetof(type, member));})
49#endif
62a6e3e1 50
5096fae3
MM
51/* Convert from a base type to a parent type, with compile time checking. */
52#ifdef __GNUC__
53#define DO_UPCAST(type, field, dev) ( __extension__ ( { \
54 char __attribute__((unused)) offset_must_be_zero[ \
55 -offsetof(type, field)]; \
56 container_of(dev, type, field);}))
57#else
58#define DO_UPCAST(type, field, dev) container_of(dev, type, field)
59#endif
60
f0d99ad7
JQ
61#define typeof_field(type, field) typeof(((type *)0)->field)
62#define type_check(t1,t2) ((t1*)0 - (t2*)0)
63
df2542c7
JM
64#ifndef MIN
65#define MIN(a, b) (((a) < (b)) ? (a) : (b))
66#endif
67#ifndef MAX
68#define MAX(a, b) (((a) > (b)) ? (a) : (b))
69#endif
70
292c8e50
PB
71#ifndef ROUND_UP
72#define ROUND_UP(n,d) (((n) + (d) - 1) & -(d))
73#endif
74
e0e53b2f
CC
75#ifndef DIV_ROUND_UP
76#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
77#endif
78
0954d0d9
BS
79#ifndef ARRAY_SIZE
80#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
81#endif
82
df2542c7 83#ifndef always_inline
636aa200 84#if !((__GNUC__ < 3) || defined(__APPLE__))
3dec6ecd 85#ifdef __OPTIMIZE__
b595c14a 86#undef inline
636aa200 87#define inline __attribute__ (( always_inline )) __inline__
df2542c7 88#endif
3dec6ecd 89#endif
cebdff77 90#else
b595c14a 91#undef inline
df2542c7 92#define inline always_inline
cebdff77 93#endif
df2542c7 94
d62ca2bb 95#define qemu_printf printf
ea88812f 96
f97742d0 97int qemu_daemon(int nochdir, int noclose);
33f00271 98void *qemu_memalign(size_t alignment, size_t size);
6eebf958 99void *qemu_anon_ram_alloc(size_t size);
49b470eb 100void qemu_vfree(void *ptr);
e7a09b92 101void qemu_anon_ram_free(void *ptr, size_t size);
ea88812f 102
e78815a5
AF
103#define QEMU_MADV_INVALID -1
104
105#if defined(CONFIG_MADVISE)
106
107#define QEMU_MADV_WILLNEED MADV_WILLNEED
108#define QEMU_MADV_DONTNEED MADV_DONTNEED
109#ifdef MADV_DONTFORK
110#define QEMU_MADV_DONTFORK MADV_DONTFORK
111#else
112#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
113#endif
114#ifdef MADV_MERGEABLE
115#define QEMU_MADV_MERGEABLE MADV_MERGEABLE
116#else
117#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
118#endif
ddb97f1d
JB
119#ifdef MADV_DONTDUMP
120#define QEMU_MADV_DONTDUMP MADV_DONTDUMP
121#else
122#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
123#endif
ad0b5321
LC
124#ifdef MADV_HUGEPAGE
125#define QEMU_MADV_HUGEPAGE MADV_HUGEPAGE
126#else
127#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
128#endif
e78815a5
AF
129
130#elif defined(CONFIG_POSIX_MADVISE)
131
132#define QEMU_MADV_WILLNEED POSIX_MADV_WILLNEED
133#define QEMU_MADV_DONTNEED POSIX_MADV_DONTNEED
134#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
135#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
ddb97f1d 136#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
8473f377 137#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
e78815a5
AF
138
139#else /* no-op */
140
141#define QEMU_MADV_WILLNEED QEMU_MADV_INVALID
142#define QEMU_MADV_DONTNEED QEMU_MADV_INVALID
143#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
144#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
ddb97f1d 145#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
8473f377 146#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
e78815a5
AF
147
148#endif
149
150int qemu_madvise(void *addr, size_t len, int advice);
151
17e0b6ab
AF
152int qemu_open(const char *name, int flags, ...);
153int qemu_close(int fd);
154
953ffe0f
AF
155#if defined(__HAIKU__) && defined(__i386__)
156#define FMT_pid "%ld"
0e0167ba
SW
157#elif defined(WIN64)
158#define FMT_pid "%" PRId64
953ffe0f
AF
159#else
160#define FMT_pid "%d"
161#endif
162
aa26bb2d 163int qemu_create_pidfile(const char *filename);
dc7a09cf 164int qemu_get_thread_id(void);
aa26bb2d 165
9adea5f7
PB
166#ifndef CONFIG_IOVEC
167struct iovec {
168 void *iov_base;
169 size_t iov_len;
170};
171/*
172 * Use the same value as Linux for now.
173 */
174#define IOV_MAX 1024
175
176ssize_t readv(int fd, const struct iovec *iov, int iov_cnt);
177ssize_t writev(int fd, const struct iovec *iov, int iov_cnt);
178#else
179#include <sys/uio.h>
180#endif
181
ad620c29
BS
182#ifdef _WIN32
183static inline void qemu_timersub(const struct timeval *val1,
184 const struct timeval *val2,
185 struct timeval *res)
186{
187 res->tv_sec = val1->tv_sec - val2->tv_sec;
188 if (val1->tv_usec < val2->tv_usec) {
189 res->tv_sec--;
190 res->tv_usec = val1->tv_usec - val2->tv_usec + 1000 * 1000;
191 } else {
192 res->tv_usec = val1->tv_usec - val2->tv_usec;
193 }
194}
195#else
196#define qemu_timersub timersub
197#endif
198
49ee3590
AL
199void qemu_set_cloexec(int fd);
200
93bfef4c
CV
201void qemu_set_version(const char *);
202const char *qemu_get_version(void);
203
0f66998f
PM
204void fips_set_state(bool requested);
205bool fips_get_state(void);
206
e2ea3515
LE
207/* Return a dynamically allocated pathname denoting a file or directory that is
208 * appropriate for storing local state.
209 *
210 * @relative_pathname need not start with a directory separator; one will be
211 * added automatically.
212 *
213 * The caller is responsible for releasing the value returned with g_free()
214 * after use.
215 */
216char *qemu_get_local_state_pathname(const char *relative_pathname);
217
b6a3e690
RH
218/**
219 * qemu_getauxval:
220 * @type: the auxiliary vector key to lookup
221 *
222 * Search the auxiliary vector for @type, returning the value
223 * or 0 if @type is not present.
224 */
225#if defined(CONFIG_GETAUXVAL) || defined(__linux__)
226unsigned long qemu_getauxval(unsigned long type);
227#else
228static inline unsigned long qemu_getauxval(unsigned long type) { return 0; }
229#endif
230
231/**
232 * qemu_init_auxval:
233 * @envp: the third argument to main
234 *
235 * If supported and required, locate the auxiliary vector at program startup.
236 */
237#if defined(CONFIG_GETAUXVAL) || !defined(__linux__)
238static inline void qemu_init_auxval(char **envp) { }
239#else
240void qemu_init_auxval(char **envp);
241#endif
242
13401ba0
SH
243void qemu_set_tty_echo(int fd, bool echo);
244
ea88812f 245#endif