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
33#else
34#include "exec/poison.h"
35#endif
36
37#include "qemu/compiler.h"
38
39
40
41
42
43#ifndef __STDC_CONSTANT_MACROS
44#define __STDC_CONSTANT_MACROS
45#endif
46#ifndef __STDC_LIMIT_MACROS
47#define __STDC_LIMIT_MACROS
48#endif
49#ifndef __STDC_FORMAT_MACROS
50#define __STDC_FORMAT_MACROS
51#endif
52
53
54
55
56#ifdef __APPLE__
57#define daemon qemu_fake_daemon_function
58#include <stdlib.h>
59#undef daemon
60QEMU_EXTERN_C int daemon(int, int);
61#endif
62
63#ifdef _WIN32
64
65#ifndef _WIN32_WINNT
66#define _WIN32_WINNT 0x0600
67#endif
68
69#ifndef WIN32_LEAN_AND_MEAN
70#define WIN32_LEAN_AND_MEAN
71#endif
72#endif
73
74
75#ifdef __MINGW32__
76#define __USE_MINGW_ANSI_STDIO 1
77#endif
78
79#include <stdarg.h>
80#include <stddef.h>
81#include <stdbool.h>
82#include <stdint.h>
83#include <sys/types.h>
84#include <stdlib.h>
85#include <stdio.h>
86
87#include <string.h>
88#include <strings.h>
89#include <inttypes.h>
90#include <limits.h>
91
92
93#include <unistd.h>
94#include <time.h>
95#include <ctype.h>
96#include <errno.h>
97#include <fcntl.h>
98#include <getopt.h>
99#include <sys/stat.h>
100#include <sys/time.h>
101#include <assert.h>
102
103
104#include <setjmp.h>
105#include <signal.h>
106
107#ifdef CONFIG_IOVEC
108#include <sys/uio.h>
109#endif
110
111#if defined(__linux__) && defined(__sparc__)
112
113#include <sys/shm.h>
114#endif
115
116#ifndef _WIN32
117#include <sys/wait.h>
118#else
119#define WIFEXITED(x) 1
120#define WEXITSTATUS(x) (x)
121#endif
122
123#ifdef __APPLE__
124#include <AvailabilityMacros.h>
125#endif
126
127
128
129
130
131
132#include "glib-compat.h"
133
134#ifdef __cplusplus
135extern "C" {
136#endif
137
138#ifdef _WIN32
139#include "sysemu/os-win32.h"
140#endif
141
142#ifdef CONFIG_POSIX
143#include "sysemu/os-posix.h"
144#endif
145
146#include "qemu/typedefs.h"
147
148
149
150
151
152
153
154
155#ifdef __MINGW32__
156#undef assert
157#define assert(x) g_assert(x)
158#endif
159
160
161
162
163
164
165
166
167#ifndef WCOREDUMP
168#define WCOREDUMP(status) 0
169#endif
170
171
172
173
174
175
176
177
178
179#ifdef NDEBUG
180#error building with NDEBUG is not supported
181#endif
182#ifdef G_DISABLE_ASSERT
183#error building with G_DISABLE_ASSERT is not supported
184#endif
185
186#ifndef O_LARGEFILE
187#define O_LARGEFILE 0
188#endif
189#ifndef O_BINARY
190#define O_BINARY 0
191#endif
192#ifndef MAP_ANONYMOUS
193#define MAP_ANONYMOUS MAP_ANON
194#endif
195#ifndef MAP_FIXED_NOREPLACE
196#define MAP_FIXED_NOREPLACE 0
197#endif
198#ifndef ENOMEDIUM
199#define ENOMEDIUM ENODEV
200#endif
201#if !defined(ENOTSUP)
202#define ENOTSUP 4096
203#endif
204#if !defined(ECANCELED)
205#define ECANCELED 4097
206#endif
207#if !defined(EMEDIUMTYPE)
208#define EMEDIUMTYPE 4098
209#endif
210#if !defined(ESHUTDOWN)
211#define ESHUTDOWN 4099
212#endif
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227#define TYPE_SIGNED(t) (!((t)0 < (t)-1))
228
229
230
231
232#define TYPE_WIDTH(t) (sizeof(t) * CHAR_BIT)
233
234
235#define TYPE_MAXIMUM(t) \
236 ((t) (!TYPE_SIGNED(t) \
237 ? (t)-1 \
238 : ((((t)1 << (TYPE_WIDTH(t) - 2)) - 1) * 2 + 1)))
239
240#ifndef TIME_MAX
241#define TIME_MAX TYPE_MAXIMUM(time_t)
242#endif
243
244
245#if UINTPTR_MAX == UINT32_MAX
246# define HOST_LONG_BITS 32
247#elif UINTPTR_MAX == UINT64_MAX
248# define HOST_LONG_BITS 64
249#else
250# error Unknown pointer size
251#endif
252
253
254
255
256#if defined(HAVE_BROKEN_SIZE_MAX) && HAVE_BROKEN_SIZE_MAX
257#undef SIZE_MAX
258#define SIZE_MAX ((size_t)-1)
259#endif
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278#undef MIN
279#define MIN(a, b) \
280 ({ \
281 typeof(1 ? (a) : (b)) _a = (a), _b = (b); \
282 _a < _b ? _a : _b; \
283 })
284#undef MAX
285#define MAX(a, b) \
286 ({ \
287 typeof(1 ? (a) : (b)) _a = (a), _b = (b); \
288 _a > _b ? _a : _b; \
289 })
290
291#ifdef __COVERITY__
292# define MIN_CONST(a, b) ((a) < (b) ? (a) : (b))
293# define MAX_CONST(a, b) ((a) > (b) ? (a) : (b))
294#else
295# define MIN_CONST(a, b) \
296 __builtin_choose_expr( \
297 __builtin_constant_p(a) && __builtin_constant_p(b), \
298 (a) < (b) ? (a) : (b), \
299 ((void)0))
300# define MAX_CONST(a, b) \
301 __builtin_choose_expr( \
302 __builtin_constant_p(a) && __builtin_constant_p(b), \
303 (a) > (b) ? (a) : (b), \
304 ((void)0))
305#endif
306
307
308
309
310
311#ifndef MIN_NON_ZERO
312#define MIN_NON_ZERO(a, b) \
313 ({ \
314 typeof(1 ? (a) : (b)) _a = (a), _b = (b); \
315 _a == 0 ? _b : (_b == 0 || _b > _a) ? _a : _b; \
316 })
317#endif
318
319
320#define QEMU_ALIGN_DOWN(n, m) ((n) / (m) * (m))
321
322
323
324#define QEMU_ALIGN_UP(n, m) QEMU_ALIGN_DOWN((n) + (m) - 1, (m))
325
326
327#define QEMU_IS_ALIGNED(n, m) (((n) % (m)) == 0)
328
329
330#define QEMU_ALIGN_PTR_DOWN(p, n) \
331 ((typeof(p))QEMU_ALIGN_DOWN((uintptr_t)(p), (n)))
332
333
334#define QEMU_ALIGN_PTR_UP(p, n) \
335 ((typeof(p))QEMU_ALIGN_UP((uintptr_t)(p), (n)))
336
337
338#define QEMU_PTR_IS_ALIGNED(p, n) QEMU_IS_ALIGNED((uintptr_t)(p), (n))
339
340
341
342
343#ifndef ROUND_UP
344#define ROUND_UP(n, d) (((n) + (d) - 1) & -(0 ? (n) : (d)))
345#endif
346
347#ifndef DIV_ROUND_UP
348#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
349#endif
350
351
352
353
354
355#define QEMU_IS_ARRAY(x) (!__builtin_types_compatible_p(typeof(x), \
356 typeof(&(x)[0])))
357#ifndef ARRAY_SIZE
358#define ARRAY_SIZE(x) ((sizeof(x) / sizeof((x)[0])) + \
359 QEMU_BUILD_BUG_ON_ZERO(!QEMU_IS_ARRAY(x)))
360#endif
361
362int qemu_daemon(int nochdir, int noclose);
363void *qemu_try_memalign(size_t alignment, size_t size);
364void *qemu_memalign(size_t alignment, size_t size);
365void *qemu_anon_ram_alloc(size_t size, uint64_t *align, bool shared);
366void qemu_vfree(void *ptr);
367void qemu_anon_ram_free(void *ptr, size_t size);
368
369#define QEMU_MADV_INVALID -1
370
371#if defined(CONFIG_MADVISE)
372
373#define QEMU_MADV_WILLNEED MADV_WILLNEED
374#define QEMU_MADV_DONTNEED MADV_DONTNEED
375#ifdef MADV_DONTFORK
376#define QEMU_MADV_DONTFORK MADV_DONTFORK
377#else
378#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
379#endif
380#ifdef MADV_MERGEABLE
381#define QEMU_MADV_MERGEABLE MADV_MERGEABLE
382#else
383#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
384#endif
385#ifdef MADV_UNMERGEABLE
386#define QEMU_MADV_UNMERGEABLE MADV_UNMERGEABLE
387#else
388#define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
389#endif
390#ifdef MADV_DODUMP
391#define QEMU_MADV_DODUMP MADV_DODUMP
392#else
393#define QEMU_MADV_DODUMP QEMU_MADV_INVALID
394#endif
395#ifdef MADV_DONTDUMP
396#define QEMU_MADV_DONTDUMP MADV_DONTDUMP
397#else
398#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
399#endif
400#ifdef MADV_HUGEPAGE
401#define QEMU_MADV_HUGEPAGE MADV_HUGEPAGE
402#else
403#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
404#endif
405#ifdef MADV_NOHUGEPAGE
406#define QEMU_MADV_NOHUGEPAGE MADV_NOHUGEPAGE
407#else
408#define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
409#endif
410#ifdef MADV_REMOVE
411#define QEMU_MADV_REMOVE MADV_REMOVE
412#else
413#define QEMU_MADV_REMOVE QEMU_MADV_INVALID
414#endif
415
416#elif defined(CONFIG_POSIX_MADVISE)
417
418#define QEMU_MADV_WILLNEED POSIX_MADV_WILLNEED
419#define QEMU_MADV_DONTNEED POSIX_MADV_DONTNEED
420#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
421#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
422#define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
423#define QEMU_MADV_DODUMP QEMU_MADV_INVALID
424#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
425#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
426#define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
427#define QEMU_MADV_REMOVE QEMU_MADV_INVALID
428
429#else
430
431#define QEMU_MADV_WILLNEED QEMU_MADV_INVALID
432#define QEMU_MADV_DONTNEED QEMU_MADV_INVALID
433#define QEMU_MADV_DONTFORK QEMU_MADV_INVALID
434#define QEMU_MADV_MERGEABLE QEMU_MADV_INVALID
435#define QEMU_MADV_UNMERGEABLE QEMU_MADV_INVALID
436#define QEMU_MADV_DODUMP QEMU_MADV_INVALID
437#define QEMU_MADV_DONTDUMP QEMU_MADV_INVALID
438#define QEMU_MADV_HUGEPAGE QEMU_MADV_INVALID
439#define QEMU_MADV_NOHUGEPAGE QEMU_MADV_INVALID
440#define QEMU_MADV_REMOVE QEMU_MADV_INVALID
441
442#endif
443
444#ifdef _WIN32
445#define HAVE_CHARDEV_SERIAL 1
446#elif defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
447 || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \
448 || defined(__GLIBC__) || defined(__APPLE__)
449#define HAVE_CHARDEV_SERIAL 1
450#endif
451
452#if defined(__linux__) || defined(__FreeBSD__) || \
453 defined(__FreeBSD_kernel__) || defined(__DragonFly__)
454#define HAVE_CHARDEV_PARPORT 1
455#endif
456
457#if defined(__HAIKU__)
458#define SIGIO SIGPOLL
459#endif
460
461#if defined(CONFIG_LINUX)
462#ifndef BUS_MCEERR_AR
463#define BUS_MCEERR_AR 4
464#endif
465#ifndef BUS_MCEERR_AO
466#define BUS_MCEERR_AO 5
467#endif
468#endif
469
470#if defined(__linux__) && \
471 (defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) \
472 || defined(__powerpc64__))
473
474
475
476# define QEMU_VMALLOC_ALIGN (512 * 4096)
477#elif defined(__linux__) && defined(__s390x__)
478
479# define QEMU_VMALLOC_ALIGN (256 * 4096)
480#elif defined(__linux__) && defined(__sparc__)
481# define QEMU_VMALLOC_ALIGN MAX(qemu_real_host_page_size, SHMLBA)
482#else
483# define QEMU_VMALLOC_ALIGN qemu_real_host_page_size
484#endif
485
486#ifdef CONFIG_POSIX
487struct qemu_signalfd_siginfo {
488 uint32_t ssi_signo;
489 int32_t ssi_errno;
490 int32_t ssi_code;
491 uint32_t ssi_pid;
492 uint32_t ssi_uid;
493 int32_t ssi_fd;
494 uint32_t ssi_tid;
495 uint32_t ssi_band;
496 uint32_t ssi_overrun;
497 uint32_t ssi_trapno;
498 int32_t ssi_status;
499 int32_t ssi_int;
500 uint64_t ssi_ptr;
501 uint64_t ssi_utime;
502 uint64_t ssi_stime;
503 uint64_t ssi_addr;
504
505 uint8_t pad[48];
506
507};
508
509int qemu_signalfd(const sigset_t *mask);
510void sigaction_invoke(struct sigaction *action,
511 struct qemu_signalfd_siginfo *info);
512#endif
513
514int qemu_madvise(void *addr, size_t len, int advice);
515int qemu_mprotect_rwx(void *addr, size_t size);
516int qemu_mprotect_none(void *addr, size_t size);
517
518
519
520
521
522int qemu_open_old(const char *name, int flags, ...);
523int qemu_open(const char *name, int flags, Error **errp);
524int qemu_create(const char *name, int flags, mode_t mode, Error **errp);
525int qemu_close(int fd);
526int qemu_unlink(const char *name);
527#ifndef _WIN32
528int qemu_dup_flags(int fd, int flags);
529int qemu_dup(int fd);
530int qemu_lock_fd(int fd, int64_t start, int64_t len, bool exclusive);
531int qemu_unlock_fd(int fd, int64_t start, int64_t len);
532int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive);
533bool qemu_has_ofd_lock(void);
534#endif
535
536#if defined(__HAIKU__) && defined(__i386__)
537#define FMT_pid "%ld"
538#elif defined(WIN64)
539#define FMT_pid "%" PRId64
540#else
541#define FMT_pid "%d"
542#endif
543
544bool qemu_write_pidfile(const char *pidfile, Error **errp);
545
546int qemu_get_thread_id(void);
547
548#ifndef CONFIG_IOVEC
549struct iovec {
550 void *iov_base;
551 size_t iov_len;
552};
553
554
555
556#define IOV_MAX 1024
557
558ssize_t readv(int fd, const struct iovec *iov, int iov_cnt);
559ssize_t writev(int fd, const struct iovec *iov, int iov_cnt);
560#endif
561
562#ifdef _WIN32
563static inline void qemu_timersub(const struct timeval *val1,
564 const struct timeval *val2,
565 struct timeval *res)
566{
567 res->tv_sec = val1->tv_sec - val2->tv_sec;
568 if (val1->tv_usec < val2->tv_usec) {
569 res->tv_sec--;
570 res->tv_usec = val1->tv_usec - val2->tv_usec + 1000 * 1000;
571 } else {
572 res->tv_usec = val1->tv_usec - val2->tv_usec;
573 }
574}
575#else
576#define qemu_timersub timersub
577#endif
578
579void qemu_set_cloexec(int fd);
580
581
582
583
584
585
586
587
588#define QEMU_HW_VERSION "2.5+"
589
590
591
592
593
594void qemu_set_hw_version(const char *);
595const char *qemu_hw_version(void);
596
597void fips_set_state(bool requested);
598bool fips_get_state(void);
599
600
601
602
603
604
605
606
607
608
609char *qemu_get_local_state_pathname(const char *relative_pathname);
610
611
612
613
614void qemu_init_exec_dir(const char *argv0);
615
616
617const char *qemu_get_exec_dir(void);
618
619
620
621
622
623
624
625
626unsigned long qemu_getauxval(unsigned long type);
627
628void qemu_set_tty_echo(int fd, bool echo);
629
630void os_mem_prealloc(int fd, char *area, size_t sz, int smp_cpus,
631 Error **errp);
632
633
634
635
636
637
638
639
640
641char *qemu_get_pid_name(pid_t pid);
642
643
644
645
646
647
648
649
650
651
652
653
654
655pid_t qemu_fork(Error **errp);
656
657
658
659
660extern uintptr_t qemu_real_host_page_size;
661extern intptr_t qemu_real_host_page_mask;
662
663extern int qemu_icache_linesize;
664extern int qemu_icache_linesize_log;
665extern int qemu_dcache_linesize;
666extern int qemu_dcache_linesize_log;
667
668
669
670
671
672
673static inline void qemu_reset_optind(void)
674{
675#ifdef HAVE_OPTRESET
676 optind = 1;
677 optreset = 1;
678#else
679 optind = 0;
680#endif
681}
682
683
684
685
686
687
688
689
690
691char *qemu_get_host_name(Error **errp);
692
693
694
695
696
697
698
699
700
701
702
703size_t qemu_get_host_physmem(void);
704
705
706
707
708
709#if defined(MAC_OS_VERSION_11_0) && \
710 MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_11_0
711static inline void qemu_thread_jit_execute(void)
712{
713 if (__builtin_available(macOS 11.0, *)) {
714 pthread_jit_write_protect_np(true);
715 }
716}
717
718static inline void qemu_thread_jit_write(void)
719{
720 if (__builtin_available(macOS 11.0, *)) {
721 pthread_jit_write_protect_np(false);
722 }
723}
724#else
725static inline void qemu_thread_jit_write(void) {}
726static inline void qemu_thread_jit_execute(void) {}
727#endif
728
729
730
731
732#ifndef HAVE_SYSTEM_FUNCTION
733#define system platform_does_not_support_system
734static inline int platform_does_not_support_system(const char *command)
735{
736 errno = ENOSYS;
737 return -1;
738}
739#endif
740
741#ifdef __cplusplus
742}
743#endif
744
745#endif
746