root / include / qemu / osdep.h @ 13401ba0
History | View | Annotate | Download (6 kB)
1 |
#ifndef QEMU_OSDEP_H
|
---|---|
2 |
#define QEMU_OSDEP_H
|
3 |
|
4 |
#include "config-host.h" |
5 |
#include <stdarg.h> |
6 |
#include <stddef.h> |
7 |
#include <stdbool.h> |
8 |
#include <sys/types.h> |
9 |
#ifdef __OpenBSD__
|
10 |
#include <sys/signal.h> |
11 |
#endif
|
12 |
|
13 |
#ifndef _WIN32
|
14 |
#include <sys/wait.h> |
15 |
#else
|
16 |
#define WIFEXITED(x) 1 |
17 |
#define WEXITSTATUS(x) (x)
|
18 |
#endif
|
19 |
|
20 |
#include <sys/time.h> |
21 |
|
22 |
#if defined(CONFIG_SOLARIS) && CONFIG_SOLARIS_VERSION < 10 |
23 |
/* [u]int_fast*_t not in <sys/int_types.h> */
|
24 |
typedef unsigned char uint_fast8_t; |
25 |
typedef unsigned int uint_fast16_t; |
26 |
typedef signed int int_fast16_t; |
27 |
#endif
|
28 |
|
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 |
|
45 |
#ifndef container_of
|
46 |
#define container_of(ptr, type, member) ({ \
|
47 |
const typeof(((type *) 0)->member) *__mptr = (ptr); \ |
48 |
(type *) ((char *) __mptr - offsetof(type, member));})
|
49 |
#endif
|
50 |
|
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 |
|
61 |
#define typeof_field(type, field) typeof(((type *)0)->field) |
62 |
#define type_check(t1,t2) ((t1*)0 - (t2*)0) |
63 |
|
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 |
|
71 |
#ifndef ROUND_UP
|
72 |
#define ROUND_UP(n,d) (((n) + (d) - 1) & -(d)) |
73 |
#endif
|
74 |
|
75 |
#ifndef DIV_ROUND_UP
|
76 |
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) |
77 |
#endif
|
78 |
|
79 |
#ifndef ARRAY_SIZE
|
80 |
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) |
81 |
#endif
|
82 |
|
83 |
#ifndef always_inline
|
84 |
#if !((__GNUC__ < 3) || defined(__APPLE__)) |
85 |
#ifdef __OPTIMIZE__
|
86 |
#undef inline |
87 |
#define inline __attribute__ (( always_inline )) __inline__ |
88 |
#endif
|
89 |
#endif
|
90 |
#else
|
91 |
#undef inline |
92 |
#define inline always_inline |
93 |
#endif
|
94 |
|
95 |
#define qemu_printf printf
|
96 |
|
97 |
int qemu_daemon(int nochdir, int noclose); |
98 |
void *qemu_memalign(size_t alignment, size_t size);
|
99 |
void *qemu_anon_ram_alloc(size_t size);
|
100 |
void qemu_vfree(void *ptr); |
101 |
void qemu_anon_ram_free(void *ptr, size_t size); |
102 |
|
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
|
119 |
#ifdef MADV_DONTDUMP
|
120 |
#define QEMU_MADV_DONTDUMP MADV_DONTDUMP
|
121 |
#else
|
122 |
#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
|
123 |
#endif
|
124 |
#ifdef MADV_HUGEPAGE
|
125 |
#define QEMU_MADV_HUGEPAGE MADV_HUGEPAGE
|
126 |
#else
|
127 |
#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
|
128 |
#endif
|
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
|
136 |
#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
|
137 |
#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
|
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
|
145 |
#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
|
146 |
#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
|
147 |
|
148 |
#endif
|
149 |
|
150 |
int qemu_madvise(void *addr, size_t len, int advice); |
151 |
|
152 |
int qemu_open(const char *name, int flags, ...); |
153 |
int qemu_close(int fd); |
154 |
|
155 |
#if defined(__HAIKU__) && defined(__i386__)
|
156 |
#define FMT_pid "%ld" |
157 |
#elif defined(WIN64)
|
158 |
#define FMT_pid "%" PRId64 |
159 |
#else
|
160 |
#define FMT_pid "%d" |
161 |
#endif
|
162 |
|
163 |
int qemu_create_pidfile(const char *filename); |
164 |
int qemu_get_thread_id(void); |
165 |
|
166 |
#ifndef CONFIG_IOVEC
|
167 |
struct 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 |
|
176 |
ssize_t readv(int fd, const struct iovec *iov, int iov_cnt); |
177 |
ssize_t writev(int fd, const struct iovec *iov, int iov_cnt); |
178 |
#else
|
179 |
#include <sys/uio.h> |
180 |
#endif
|
181 |
|
182 |
#ifdef _WIN32
|
183 |
static 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 |
|
199 |
void qemu_set_cloexec(int fd); |
200 |
|
201 |
void qemu_set_version(const char *); |
202 |
const char *qemu_get_version(void); |
203 |
|
204 |
void fips_set_state(bool requested); |
205 |
bool fips_get_state(void); |
206 |
|
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 |
*/
|
216 |
char *qemu_get_local_state_pathname(const char *relative_pathname); |
217 |
|
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__)
|
226 |
unsigned long qemu_getauxval(unsigned long type); |
227 |
#else
|
228 |
static 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__)
|
238 |
static inline void qemu_init_auxval(char **envp) { } |
239 |
#else
|
240 |
void qemu_init_auxval(char **envp); |
241 |
#endif
|
242 |
|
243 |
void qemu_set_tty_echo(int fd, bool echo); |
244 |
|
245 |
#endif
|