]>
git.proxmox.com Git - mirror_qemu.git/blob - include/qemu/osdep.h
2 * OS includes and handling of OS dependencies
4 * This header exists to pull in some common system headers that
5 * most code in QEMU will want, and to fix up some possible issues with
6 * it (missing defines, Windows weirdness, and so on).
8 * To avoid getting into possible circular include dependencies, this
9 * file should not include any other QEMU headers, with the exceptions
10 * of config-host.h, compiler.h, os-posix.h and os-win32.h, all of which
11 * are doing a similar job to this file and are under similar constraints.
13 * This header also contains prototypes for functions defined in
14 * os-*.c and util/oslib-*.c; those would probably be better split
15 * out into separate header files.
17 * In an ideal world this header would contain only:
18 * (1) things which everybody needs
19 * (2) things without which code would work on most platforms but
20 * fail to compile or misbehave on a minority of host OSes
22 * This work is licensed under the terms of the GNU GPL, version 2 or later.
23 * See the COPYING file in the top-level directory.
28 #include "config-host.h"
29 #include "qemu/compiler.h"
31 /* The following block of code temporarily renames the daemon() function so the
32 * compiler does not see the warning associated with it in stdlib.h on OSX
35 #define daemon qemu_fake_daemon_function
38 extern int daemon(int, int);
45 #include <sys/types.h>
52 /* Put unistd.h before time.h as that triggers localtime_r/gmtime_r
53 * function availability on recentish Mingw-w64 platforms. */
65 #include <sys/signal.h>
71 #define WIFEXITED(x) 1
72 #define WEXITSTATUS(x) (x)
76 #include "sysemu/os-win32.h"
80 #include "sysemu/os-posix.h"
83 #include "glib-compat.h"
85 #include "qapi/error.h"
87 #if defined(CONFIG_SOLARIS) && CONFIG_SOLARIS_VERSION < 10
88 /* [u]int_fast*_t not in <sys/int_types.h> */
89 typedef unsigned char uint_fast8_t;
90 typedef unsigned int uint_fast16_t;
91 typedef signed int int_fast16_t;
100 #ifndef MAP_ANONYMOUS
101 #define MAP_ANONYMOUS MAP_ANON
104 #define ENOMEDIUM ENODEV
106 #if !defined(ENOTSUP)
109 #if !defined(ECANCELED)
110 #define ECANCELED 4097
112 #if !defined(EMEDIUMTYPE)
113 #define EMEDIUMTYPE 4098
116 #define TIME_MAX LONG_MAX
120 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
123 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
126 /* Minimum function that returns zero only iff both values are zero.
127 * Intended for use with unsigned values only. */
129 #define MIN_NON_ZERO(a, b) (((a) != 0 && (a) < (b)) ? (a) : (b))
133 #define ROUND_UP(n,d) (((n) + (d) - 1) & -(d))
137 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
141 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
144 int qemu_daemon(int nochdir
, int noclose
);
145 void *qemu_try_memalign(size_t alignment
, size_t size
);
146 void *qemu_memalign(size_t alignment
, size_t size
);
147 void *qemu_anon_ram_alloc(size_t size
, uint64_t *align
);
148 void qemu_vfree(void *ptr
);
149 void qemu_anon_ram_free(void *ptr
, size_t size
);
151 #define QEMU_MADV_INVALID -1
153 #if defined(CONFIG_MADVISE)
155 #include <sys/mman.h>
157 #define QEMU_MADV_WILLNEED MADV_WILLNEED
158 #define QEMU_MADV_DONTNEED MADV_DONTNEED
160 #define QEMU_MADV_DONTFORK MADV_DONTFORK
162 #define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
164 #ifdef MADV_MERGEABLE
165 #define QEMU_MADV_MERGEABLE MADV_MERGEABLE
167 #define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
169 #ifdef MADV_UNMERGEABLE
170 #define QEMU_MADV_UNMERGEABLE MADV_UNMERGEABLE
172 #define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
175 #define QEMU_MADV_DODUMP MADV_DODUMP
177 #define QEMU_MADV_DODUMP QEMU_MADV_INVALID
180 #define QEMU_MADV_DONTDUMP MADV_DONTDUMP
182 #define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
185 #define QEMU_MADV_HUGEPAGE MADV_HUGEPAGE
187 #define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
189 #ifdef MADV_NOHUGEPAGE
190 #define QEMU_MADV_NOHUGEPAGE MADV_NOHUGEPAGE
192 #define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
195 #elif defined(CONFIG_POSIX_MADVISE)
197 #define QEMU_MADV_WILLNEED POSIX_MADV_WILLNEED
198 #define QEMU_MADV_DONTNEED POSIX_MADV_DONTNEED
199 #define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
200 #define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
201 #define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
202 #define QEMU_MADV_DODUMP QEMU_MADV_INVALID
203 #define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
204 #define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
205 #define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
209 #define QEMU_MADV_WILLNEED QEMU_MADV_INVALID
210 #define QEMU_MADV_DONTNEED QEMU_MADV_INVALID
211 #define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
212 #define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
213 #define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
214 #define QEMU_MADV_DODUMP QEMU_MADV_INVALID
215 #define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
216 #define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
217 #define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
221 int qemu_madvise(void *addr
, size_t len
, int advice
);
223 int qemu_open(const char *name
, int flags
, ...);
224 int qemu_close(int fd
);
226 #if defined(__HAIKU__) && defined(__i386__)
227 #define FMT_pid "%ld"
229 #define FMT_pid "%" PRId64
234 int qemu_create_pidfile(const char *filename
);
235 int qemu_get_thread_id(void);
243 * Use the same value as Linux for now.
247 ssize_t
readv(int fd
, const struct iovec
*iov
, int iov_cnt
);
248 ssize_t
writev(int fd
, const struct iovec
*iov
, int iov_cnt
);
254 static inline void qemu_timersub(const struct timeval
*val1
,
255 const struct timeval
*val2
,
258 res
->tv_sec
= val1
->tv_sec
- val2
->tv_sec
;
259 if (val1
->tv_usec
< val2
->tv_usec
) {
261 res
->tv_usec
= val1
->tv_usec
- val2
->tv_usec
+ 1000 * 1000;
263 res
->tv_usec
= val1
->tv_usec
- val2
->tv_usec
;
267 #define qemu_timersub timersub
270 void qemu_set_cloexec(int fd
);
272 /* QEMU "hardware version" setting. Used to replace code that exposed
273 * QEMU_VERSION to guests in the past and need to keep compatibilty.
274 * Do not use qemu_hw_version() in new code.
276 void qemu_set_hw_version(const char *);
277 const char *qemu_hw_version(void);
279 void fips_set_state(bool requested
);
280 bool fips_get_state(void);
282 /* Return a dynamically allocated pathname denoting a file or directory that is
283 * appropriate for storing local state.
285 * @relative_pathname need not start with a directory separator; one will be
286 * added automatically.
288 * The caller is responsible for releasing the value returned with g_free()
291 char *qemu_get_local_state_pathname(const char *relative_pathname
);
293 /* Find program directory, and save it for later usage with
294 * qemu_get_exec_dir().
295 * Try OS specific API first, if not working, parse from argv0. */
296 void qemu_init_exec_dir(const char *argv0
);
298 /* Get the saved exec dir.
299 * Caller needs to release the returned string by g_free() */
300 char *qemu_get_exec_dir(void);
304 * @type: the auxiliary vector key to lookup
306 * Search the auxiliary vector for @type, returning the value
307 * or 0 if @type is not present.
309 unsigned long qemu_getauxval(unsigned long type
);
311 void qemu_set_tty_echo(int fd
, bool echo
);
313 void os_mem_prealloc(int fd
, char *area
, size_t sz
);
315 int qemu_read_password(char *buf
, int buf_size
);
320 * A version of fork that avoids signal handler race
321 * conditions that can lead to child process getting
322 * signals that are otherwise only expected by the
323 * parent. It also resets all signal handlers to the
326 * Returns 0 to child process, pid number to parent
329 pid_t
qemu_fork(Error
**errp
);