1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#ifndef QEMU_OSDEP_H
28#define QEMU_OSDEP_H
29
30#include "config-host.h"
31#ifdef NEED_CPU_H
32#include "config-target.h"
33#else
34#include "exec/poison.h"
35#endif
36#ifdef __COVERITY__
37
38
39
40
41
42
43
44typedef float _Float32;
45typedef double _Float32x;
46typedef double _Float64;
47typedef __float80 _Float64x;
48typedef __float128 _Float128;
49#endif
50
51#include "qemu/compiler.h"
52
53
54
55
56
57#ifndef __STDC_CONSTANT_MACROS
58#define __STDC_CONSTANT_MACROS
59#endif
60#ifndef __STDC_LIMIT_MACROS
61#define __STDC_LIMIT_MACROS
62#endif
63#ifndef __STDC_FORMAT_MACROS
64#define __STDC_FORMAT_MACROS
65#endif
66
67
68
69
70#ifdef __APPLE__
71#define daemon qemu_fake_daemon_function
72#include <stdlib.h>
73#undef daemon
74extern int daemon(int, int);
75#endif
76
77#include <stdarg.h>
78#include <stddef.h>
79#include <stdbool.h>
80#include <stdint.h>
81#include <sys/types.h>
82#include <stdlib.h>
83#include <stdio.h>
84#include <string.h>
85#include <strings.h>
86#include <inttypes.h>
87#include <limits.h>
88
89
90#include <unistd.h>
91#include <time.h>
92#include <ctype.h>
93#include <errno.h>
94#include <fcntl.h>
95#include <sys/stat.h>
96#include <sys/time.h>
97#include <assert.h>
98
99
100#include <setjmp.h>
101#include <signal.h>
102
103#ifdef __OpenBSD__
104#include <sys/signal.h>
105#endif
106
107#ifndef _WIN32
108#include <sys/wait.h>
109#else
110#define WIFEXITED(x) 1
111#define WEXITSTATUS(x) (x)
112#endif
113
114#ifdef _WIN32
115#include "sysemu/os-win32.h"
116#endif
117
118#ifdef CONFIG_POSIX
119#include "sysemu/os-posix.h"
120#endif
121
122#include "glib-compat.h"
123#include "qemu/typedefs.h"
124
125
126
127
128
129
130
131
132#ifndef WCOREDUMP
133#define WCOREDUMP(status) 0
134#endif
135
136
137
138
139
140
141
142
143
144#ifdef NDEBUG
145#error building with NDEBUG is not supported
146#endif
147#ifdef G_DISABLE_ASSERT
148#error building with G_DISABLE_ASSERT is not supported
149#endif
150
151#ifndef O_LARGEFILE
152#define O_LARGEFILE 0
153#endif
154#ifndef O_BINARY
155#define O_BINARY 0
156#endif
157#ifndef MAP_ANONYMOUS
158#define MAP_ANONYMOUS MAP_ANON
159#endif
160#ifndef ENOMEDIUM
161#define ENOMEDIUM ENODEV
162#endif
163#if !defined(ENOTSUP)
164#define ENOTSUP 4096
165#endif
166#if !defined(ECANCELED)
167#define ECANCELED 4097
168#endif
169#if !defined(EMEDIUMTYPE)
170#define EMEDIUMTYPE 4098
171#endif
172#if !defined(ESHUTDOWN)
173#define ESHUTDOWN 4099
174#endif
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189#define TYPE_SIGNED(t) (!((t)0 < (t)-1))
190
191
192
193
194#define TYPE_WIDTH(t) (sizeof(t) * CHAR_BIT)
195
196
197#define TYPE_MAXIMUM(t) \
198 ((t) (!TYPE_SIGNED(t) \
199 ? (t)-1 \
200 : ((((t)1 << (TYPE_WIDTH(t) - 2)) - 1) * 2 + 1)))
201
202#ifndef TIME_MAX
203#define TIME_MAX TYPE_MAXIMUM(time_t)
204#endif
205
206
207#if UINTPTR_MAX == UINT32_MAX
208# define HOST_LONG_BITS 32
209#elif UINTPTR_MAX == UINT64_MAX
210# define HOST_LONG_BITS 64
211#else
212# error Unknown pointer size
213#endif
214
215
216
217
218#if defined(HAVE_BROKEN_SIZE_MAX) && HAVE_BROKEN_SIZE_MAX
219#undef SIZE_MAX
220#define SIZE_MAX ((size_t)-1)
221#endif
222
223#ifndef MIN
224#define MIN(a, b) (((a) < (b)) ? (a) : (b))
225#endif
226#ifndef MAX
227#define MAX(a, b) (((a) > (b)) ? (a) : (b))
228#endif
229
230
231
232#ifndef MIN_NON_ZERO
233#define MIN_NON_ZERO(a, b) ((a) == 0 ? (b) : \
234 ((b) == 0 ? (a) : (MIN(a, b))))
235#endif
236
237
238#define QEMU_ALIGN_DOWN(n, m) ((n) / (m) * (m))
239
240
241
242#define QEMU_ALIGN_UP(n, m) QEMU_ALIGN_DOWN((n) + (m) - 1, (m))
243
244
245#define QEMU_IS_ALIGNED(n, m) (((n) % (m)) == 0)
246
247
248#define QEMU_ALIGN_PTR_DOWN(p, n) \
249 ((typeof(p))QEMU_ALIGN_DOWN((uintptr_t)(p), (n)))
250
251
252#define QEMU_ALIGN_PTR_UP(p, n) \
253 ((typeof(p))QEMU_ALIGN_UP((uintptr_t)(p), (n)))
254
255
256#define QEMU_PTR_IS_ALIGNED(p, n) QEMU_IS_ALIGNED((uintptr_t)(p), (n))
257
258
259
260
261#ifndef ROUND_UP
262#define ROUND_UP(n, d) (((n) + (d) - 1) & -(0 ? (n) : (d)))
263#endif
264
265#ifndef DIV_ROUND_UP
266#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
267#endif
268
269
270
271
272
273#define QEMU_IS_ARRAY(x) (!__builtin_types_compatible_p(typeof(x), \
274 typeof(&(x)[0])))
275#ifndef ARRAY_SIZE
276#define ARRAY_SIZE(x) ((sizeof(x) / sizeof((x)[0])) + \
277 QEMU_BUILD_BUG_ON_ZERO(!QEMU_IS_ARRAY(x)))
278#endif
279
280int qemu_daemon(int nochdir, int noclose);
281void *qemu_try_memalign(size_t alignment, size_t size);
282void *qemu_memalign(size_t alignment, size_t size);
283void *qemu_anon_ram_alloc(size_t size, uint64_t *align, bool shared);
284void qemu_vfree(void *ptr);
285void qemu_anon_ram_free(void *ptr, size_t size);
286
287#define QEMU_MADV_INVALID -1
288
289#if defined(CONFIG_MADVISE)
290
291#define QEMU_MADV_WILLNEED MADV_WILLNEED
292#define QEMU_MADV_DONTNEED MADV_DONTNEED
293#ifdef MADV_DONTFORK
294#define QEMU_MADV_DONTFORK MADV_DONTFORK
295#else
296#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
297#endif
298#ifdef MADV_MERGEABLE
299#define QEMU_MADV_MERGEABLE MADV_MERGEABLE
300#else
301#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
302#endif
303#ifdef MADV_UNMERGEABLE
304#define QEMU_MADV_UNMERGEABLE MADV_UNMERGEABLE
305#else
306#define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
307#endif
308#ifdef MADV_DODUMP
309#define QEMU_MADV_DODUMP MADV_DODUMP
310#else
311#define QEMU_MADV_DODUMP QEMU_MADV_INVALID
312#endif
313#ifdef MADV_DONTDUMP
314#define QEMU_MADV_DONTDUMP MADV_DONTDUMP
315#else
316#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
317#endif
318#ifdef MADV_HUGEPAGE
319#define QEMU_MADV_HUGEPAGE MADV_HUGEPAGE
320#else
321#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
322#endif
323#ifdef MADV_NOHUGEPAGE
324#define QEMU_MADV_NOHUGEPAGE MADV_NOHUGEPAGE
325#else
326#define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
327#endif
328#ifdef MADV_REMOVE
329#define QEMU_MADV_REMOVE MADV_REMOVE
330#else
331#define QEMU_MADV_REMOVE QEMU_MADV_INVALID
332#endif
333
334#elif defined(CONFIG_POSIX_MADVISE)
335
336#define QEMU_MADV_WILLNEED POSIX_MADV_WILLNEED
337#define QEMU_MADV_DONTNEED POSIX_MADV_DONTNEED
338#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
339#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
340#define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
341#define QEMU_MADV_DODUMP QEMU_MADV_INVALID
342#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
343#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
344#define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
345#define QEMU_MADV_REMOVE QEMU_MADV_INVALID
346
347#else
348
349#define QEMU_MADV_WILLNEED QEMU_MADV_INVALID
350#define QEMU_MADV_DONTNEED QEMU_MADV_INVALID
351#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
352#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
353#define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
354#define QEMU_MADV_DODUMP QEMU_MADV_INVALID
355#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
356#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
357#define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
358#define QEMU_MADV_REMOVE QEMU_MADV_INVALID
359
360#endif
361
362#ifdef _WIN32
363#define HAVE_CHARDEV_SERIAL 1
364#elif defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
365 || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \
366 || defined(__GLIBC__)
367#define HAVE_CHARDEV_SERIAL 1
368#endif
369
370#if defined(__linux__) || defined(__FreeBSD__) || \
371 defined(__FreeBSD_kernel__) || defined(__DragonFly__)
372#define HAVE_CHARDEV_PARPORT 1
373#endif
374
375#if defined(CONFIG_LINUX)
376#ifndef BUS_MCEERR_AR
377#define BUS_MCEERR_AR 4
378#endif
379#ifndef BUS_MCEERR_AO
380#define BUS_MCEERR_AO 5
381#endif
382#endif
383
384#if defined(__linux__) && \
385 (defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) \
386 || defined(__powerpc64__))
387
388
389
390# define QEMU_VMALLOC_ALIGN (512 * 4096)
391#elif defined(__linux__) && defined(__s390x__)
392
393# define QEMU_VMALLOC_ALIGN (256 * 4096)
394#elif defined(__linux__) && defined(__sparc__)
395#include <sys/shm.h>
396# define QEMU_VMALLOC_ALIGN MAX(getpagesize(), SHMLBA)
397#else
398# define QEMU_VMALLOC_ALIGN getpagesize()
399#endif
400
401#ifdef CONFIG_POSIX
402struct qemu_signalfd_siginfo {
403 uint32_t ssi_signo;
404 int32_t ssi_errno;
405 int32_t ssi_code;
406 uint32_t ssi_pid;
407 uint32_t ssi_uid;
408 int32_t ssi_fd;
409 uint32_t ssi_tid;
410 uint32_t ssi_band;
411 uint32_t ssi_overrun;
412 uint32_t ssi_trapno;
413 int32_t ssi_status;
414 int32_t ssi_int;
415 uint64_t ssi_ptr;
416 uint64_t ssi_utime;
417 uint64_t ssi_stime;
418 uint64_t ssi_addr;
419
420 uint8_t pad[48];
421
422};
423
424int qemu_signalfd(const sigset_t *mask);
425void sigaction_invoke(struct sigaction *action,
426 struct qemu_signalfd_siginfo *info);
427#endif
428
429int qemu_madvise(void *addr, size_t len, int advice);
430int qemu_mprotect_rwx(void *addr, size_t size);
431int qemu_mprotect_none(void *addr, size_t size);
432
433int qemu_open(const char *name, int flags, ...);
434int qemu_close(int fd);
435#ifndef _WIN32
436int qemu_dup(int fd);
437#endif
438int qemu_lock_fd(int fd, int64_t start, int64_t len, bool exclusive);
439int qemu_unlock_fd(int fd, int64_t start, int64_t len);
440int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive);
441bool qemu_has_ofd_lock(void);
442
443#if defined(__HAIKU__) && defined(__i386__)
444#define FMT_pid "%ld"
445#elif defined(WIN64)
446#define FMT_pid "%" PRId64
447#else
448#define FMT_pid "%d"
449#endif
450
451int qemu_create_pidfile(const char *filename);
452int qemu_get_thread_id(void);
453
454#ifndef CONFIG_IOVEC
455struct iovec {
456 void *iov_base;
457 size_t iov_len;
458};
459
460
461
462#define IOV_MAX 1024
463
464ssize_t readv(int fd, const struct iovec *iov, int iov_cnt);
465ssize_t writev(int fd, const struct iovec *iov, int iov_cnt);
466#else
467#include <sys/uio.h>
468#endif
469
470#ifdef _WIN32
471static inline void qemu_timersub(const struct timeval *val1,
472 const struct timeval *val2,
473 struct timeval *res)
474{
475 res->tv_sec = val1->tv_sec - val2->tv_sec;
476 if (val1->tv_usec < val2->tv_usec) {
477 res->tv_sec--;
478 res->tv_usec = val1->tv_usec - val2->tv_usec + 1000 * 1000;
479 } else {
480 res->tv_usec = val1->tv_usec - val2->tv_usec;
481 }
482}
483#else
484#define qemu_timersub timersub
485#endif
486
487void qemu_set_cloexec(int fd);
488
489
490
491
492
493
494
495
496#define QEMU_HW_VERSION "2.5+"
497
498
499
500
501
502void qemu_set_hw_version(const char *);
503const char *qemu_hw_version(void);
504
505void fips_set_state(bool requested);
506bool fips_get_state(void);
507
508
509
510
511
512
513
514
515
516
517char *qemu_get_local_state_pathname(const char *relative_pathname);
518
519
520
521
522void qemu_init_exec_dir(const char *argv0);
523
524
525
526char *qemu_get_exec_dir(void);
527
528
529
530
531
532
533
534
535unsigned long qemu_getauxval(unsigned long type);
536
537void qemu_set_tty_echo(int fd, bool echo);
538
539void os_mem_prealloc(int fd, char *area, size_t sz, int smp_cpus,
540 Error **errp);
541
542
543
544
545
546
547
548
549
550char *qemu_get_pid_name(pid_t pid);
551
552
553
554
555
556
557
558
559
560
561
562
563
564pid_t qemu_fork(Error **errp);
565
566
567
568
569extern uintptr_t qemu_real_host_page_size;
570extern intptr_t qemu_real_host_page_mask;
571
572extern int qemu_icache_linesize;
573extern int qemu_dcache_linesize;
574
575#endif
576