1f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
2f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner/* Common header file that is included by all of QEMU.
3f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner *
4f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner * This file is supposed to be included only by .c files. No header file should
5f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner * depend on qemu-common.h, as this would easily lead to circular header
6f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner * dependencies.
7f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner *
8f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner * If a header file uses a definition from qemu-common.h, that definition
9f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner * must be moved to a separate header file, and the header that uses it
10f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner * must include that header.
11f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner */
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef QEMU_COMMON_H
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define QEMU_COMMON_H
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
157891dd35fa2439a70f43ab8572778a398365bf24David 'Digit' Turner#include <inttypes.h>
169b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner#include <setjmp.h>
179b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner
18f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#include "qemu/compiler.h"
196a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#include "config-host.h"
201befd3440439e8181a31140674e847f2d3e1481eDavid 'Digit' Turner#include "qemu/typedefs.h"
219b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner#include "qemu/osdep.h"
229b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner#include "qemu/bswap.h"
239b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner
246a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
25f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#if defined(__arm__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__) || defined(__ia64__)
26f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define WORDS_ALIGNED
276a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#endif
286a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
29f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
30f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* we put basic includes here to avoid repeating them in device drivers */
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdlib.h>
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdio.h>
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdarg.h>
356a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#include <stdbool.h>
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h>
375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <strings.h>
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <inttypes.h>
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <limits.h>
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <time.h>
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <ctype.h>
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <errno.h>
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <unistd.h>
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <fcntl.h>
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/stat.h>
4645c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#include <sys/time.h>
475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <assert.h>
48f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#include <signal.h>
49aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner#include <glib.h>
50aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner
5145c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#ifdef _WIN32
52057b0f638014d1cb6764aab945b98197329f745eDavid 'Digit' Turner#include "sysemu/os-win32.h"
5345c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#endif
5445c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner
5545c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#ifdef CONFIG_POSIX
56057b0f638014d1cb6764aab945b98197329f745eDavid 'Digit' Turner#include "sysemu/os-posix.h"
5745c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#endif
5845c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef O_LARGEFILE
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define O_LARGEFILE 0
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef O_BINARY
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define O_BINARY 0
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
65d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#ifndef MAP_ANONYMOUS
66d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#define MAP_ANONYMOUS MAP_ANON
67d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#endif
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef ENOMEDIUM
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENOMEDIUM ENODEV
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
71d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#if !defined(ENOTSUP)
72d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#define ENOTSUP 4096
73d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#endif
74f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#if !defined(ECANCELED)
75f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define ECANCELED 4097
76f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#endif
77f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#if !defined(EMEDIUMTYPE)
78f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define EMEDIUMTYPE 4098
79f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#endif
8045c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#ifndef TIME_MAX
8145c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#define TIME_MAX LONG_MAX
8245c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#endif
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8448fbbc097293db01bdfb3be6511a8a40451b4db0David 'Digit' Turner/* HOST_LONG_BITS is the size of a native pointer in bits. */
8548fbbc097293db01bdfb3be6511a8a40451b4db0David 'Digit' Turner#if UINTPTR_MAX == UINT32_MAX
8648fbbc097293db01bdfb3be6511a8a40451b4db0David 'Digit' Turner# define HOST_LONG_BITS 32
8748fbbc097293db01bdfb3be6511a8a40451b4db0David 'Digit' Turner#elif UINTPTR_MAX == UINT64_MAX
8848fbbc097293db01bdfb3be6511a8a40451b4db0David 'Digit' Turner# define HOST_LONG_BITS 64
8948fbbc097293db01bdfb3be6511a8a40451b4db0David 'Digit' Turner#else
9048fbbc097293db01bdfb3be6511a8a40451b4db0David 'Digit' Turner# error Unknown pointer size
9148fbbc097293db01bdfb3be6511a8a40451b4db0David 'Digit' Turner#endif
9248fbbc097293db01bdfb3be6511a8a40451b4db0David 'Digit' Turner
9345c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnertypedef int (*fprintf_function)(FILE *f, const char *fmt, ...)
9445c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner    GCC_FMT_ATTR(2, 3);
9545c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define fsync _commit
98f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#if !defined(lseek)
99f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner# define lseek _lseeki64
100f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#endif
10145c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnerint qemu_ftruncate64(int, int64_t);
102f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#if !defined(ftruncate)
103f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner# define ftruncate qemu_ftruncate64
104f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#endif
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline char *realpath(const char *path, char *resolved_path)
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    _fullpath(resolved_path, path, _MAX_PATH);
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return resolved_path;
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1117891dd35fa2439a70f43ab8572778a398365bf24David 'Digit' Turner#endif /* _WIN32 */
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* bottom halves */
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void QEMUBHFunc(void *opaque);
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
116d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid async_context_push(void);
117d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid async_context_pop(void);
118d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerint get_async_context_id(void);
119d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectQEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque);
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_bh_schedule(QEMUBH *bh);
1225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Bottom halfs that are scheduled from a bottom half handler are instantly
1235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * invoked.  This can create an infinite loop if a bottom half handler
1245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * schedules itself.  qemu_bh_schedule_idle() avoids this infinite loop by
1255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * ensuring that the bottom half isn't executed until the next main loop
1265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * iteration.
1275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
1285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_bh_schedule_idle(QEMUBH *bh);
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_bh_cancel(QEMUBH *bh);
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_bh_delete(QEMUBH *bh);
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_bh_poll(void);
132d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid qemu_bh_update_timeout(int *timeout);
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_get_timedate(struct tm *tm, int offset);
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_timedate_diff(struct tm *tm);
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
137a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/**
138a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * is_help_option:
139a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * @s: string to test
140a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner *
141a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * Check whether @s is one of the standard strings which indicate
142a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * that the user is asking for a list of the valid values for a
143a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * command option like -cpu or -M. The current accepted strings
144a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * are 'help' and '?'. '?' is deprecated (it is a shell wildcard
145a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * which makes it annoying to use in a reliable way) but provided
146a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * for backwards compatibility.
147a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner *
148a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * Returns: true if @s is a request for a list.
149a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner */
150a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerstatic inline bool is_help_option(const char *s)
151a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner{
152a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner    return !strcmp(s, "?") || !strcmp(s, "help");
153a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner}
154a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* cutils.c */
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid pstrcpy(char *buf, int buf_size, const char *str);
157a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnervoid strpadcpy(char *buf, int buf_size, const char *str, char pad);
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectchar *pstrcat(char *buf, int buf_size, const char *s);
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint strstart(const char *str, const char *val, const char **ptr);
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint stristart(const char *str, const char *val, const char **ptr);
161fd3b1a0e32964436a5259e073857e0c4e2110122David 'Digit' Turnerint qemu_strnlen(const char *s, int max_len);
162a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerchar *qemu_strsep(char **input, const char *delim);
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttime_t mktimegm(struct tm *tm);
1645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint qemu_fls(int i);
165fd3b1a0e32964436a5259e073857e0c4e2110122David 'Digit' Turnerint qemu_fdatasync(int fd);
1666a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerint fcntl_setfl(int fd, int flag);
167a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint qemu_parse_fd(const char *param);
168a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
169a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint parse_uint(const char *s, unsigned long long *value, char **endptr,
170a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner               int base);
171a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint parse_uint_full(const char *s, unsigned long long *value, int base);
1725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
17345c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner/*
17445c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner * strtosz() suffixes used to specify the default treatment of an
17545c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner * argument passed to strtosz() without an explicit suffix.
17645c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner * These should be defined using upper case characters in the range
17745c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner * A-Z, as strtosz() will use qemu_toupper() on the given argument
17845c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner * prior to comparison.
17945c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner */
180f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define STRTOSZ_DEFSUFFIX_EB	'E'
181f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define STRTOSZ_DEFSUFFIX_PB	'P'
18245c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#define STRTOSZ_DEFSUFFIX_TB	'T'
18345c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#define STRTOSZ_DEFSUFFIX_GB	'G'
18445c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#define STRTOSZ_DEFSUFFIX_MB	'M'
18545c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#define STRTOSZ_DEFSUFFIX_KB	'K'
18645c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#define STRTOSZ_DEFSUFFIX_B	'B'
18745c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnerint64_t strtosz(const char *nptr, char **end);
18845c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnerint64_t strtosz_suffix(const char *nptr, char **end, const char default_suffix);
189a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint64_t strtosz_suffix_unit(const char *nptr, char **end,
190a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner                            const char default_suffix, int64_t unit);
19145c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner
192f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner/* used to print char* safely */
193f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define STR_OR_NULL(str) ((str) ? (str) : "null")
194f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
195b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner/* path.c */
196b91980562344f6a3b719bfe4be007fa9406e585fDavid Turnervoid init_paths(const char *prefix);
197b91980562344f6a3b719bfe4be007fa9406e585fDavid Turnerconst char *path(const char *pathname);
198b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner
1995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isalnum(c)		isalnum((unsigned char)(c))
2005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isalpha(c)		isalpha((unsigned char)(c))
2015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_iscntrl(c)		iscntrl((unsigned char)(c))
2025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isdigit(c)		isdigit((unsigned char)(c))
2035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isgraph(c)		isgraph((unsigned char)(c))
2045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_islower(c)		islower((unsigned char)(c))
2055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isprint(c)		isprint((unsigned char)(c))
2065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_ispunct(c)		ispunct((unsigned char)(c))
2075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isspace(c)		isspace((unsigned char)(c))
2085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isupper(c)		isupper((unsigned char)(c))
2095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isxdigit(c)	isxdigit((unsigned char)(c))
2105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_tolower(c)		tolower((unsigned char)(c))
2115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_toupper(c)		toupper((unsigned char)(c))
2125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isascii(c)		isascii((unsigned char)(c))
2135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_toascii(c)		toascii((unsigned char)(c))
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
215d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid qemu_mutex_lock_iothread(void);
216d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid qemu_mutex_unlock_iothread(void);
217d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
218d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerint qemu_open(const char *name, int flags, ...);
219d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerssize_t qemu_write_full(int fd, const void *buf, size_t count)
220d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    QEMU_WARN_UNUSED_RESULT;
2216731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turnerssize_t qemu_send_full(int fd, const void *buf, size_t count, int flags)
2226731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner    QEMU_WARN_UNUSED_RESULT;
2236731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turnerssize_t qemu_recv_full(int fd, void *buf, size_t count, int flags)
2246731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner    QEMU_WARN_UNUSED_RESULT;
225d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid qemu_set_cloexec(int fd);
226d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
227d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#ifndef _WIN32
2288354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turnerint qemu_add_child_watch(pid_t pid);
229d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerint qemu_eventfd(int pipefd[2]);
230d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerint qemu_pipe(int pipefd[2]);
231d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#endif
232d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
2336731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#ifdef CONFIG_ANDROID
2346731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turnerint qemu_recv(int sock, void* buf, size_t len, int flags);
2356731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner
2366731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turnerint qemu_getsockopt(int sockfd, int level, int optname,
2376731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner                    void* optval, size_t* optlen);
2386731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner
2396731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turnerint qemu_setsockopt(int sockfd, int level, int optname,
2406731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner                    const void* optval, size_t optlen);
2416731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner
2426731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#else  // !CONFIG_ANDROID
2436731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#ifdef _WIN32
2446731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner/* MinGW needs type casts for the 'buf' and 'optval' arguments. */
2456731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#define qemu_getsockopt(sockfd, level, optname, optval, optlen) \
246e711ca0dbf7d0a55897aec0a0249f349fee37894David 'Digit' Turner    getsockopt(sockfd, level, optname, (void *)optval, optlen)
2476731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#define qemu_setsockopt(sockfd, level, optname, optval, optlen) \
2486731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner    setsockopt(sockfd, level, optname, (const void *)optval, optlen)
2496731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#define qemu_recv(sockfd, buf, len, flags) recv(sockfd, (void *)buf, len, flags)
2506731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#define qemu_sendto(sockfd, buf, len, flags, destaddr, addrlen) \
2516731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner    sendto(sockfd, (const void *)buf, len, flags, destaddr, addrlen)
2526731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#else
2536731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#define qemu_getsockopt(sockfd, level, optname, optval, optlen) \
2546731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner    getsockopt(sockfd, level, optname, optval, optlen)
2556731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#define qemu_setsockopt(sockfd, level, optname, optval, optlen) \
2566731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner    setsockopt(sockfd, level, optname, optval, optlen)
2576731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#define qemu_recv(sockfd, buf, len, flags) recv(sockfd, buf, len, flags)
2586731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#define qemu_sendto(sockfd, buf, len, flags, destaddr, addrlen) \
2596731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner    sendto(sockfd, buf, len, flags, destaddr, addrlen)
2606731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#endif
2616731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner#endif  // !CONFIG_ANDROID
2626731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *get_mmap_addr(unsigned long size);
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Error handling.  */
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
26845c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnervoid QEMU_NORETURN hw_error(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* IO callbacks.  */
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void IOReadHandler(void *opaque, const uint8_t *buf, int size);
2724143d8f4c302878923bde0cb2420f4ca27245bcdDavid Turnertypedef int IOCanReadHandler(void *opaque);
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void IOHandler(void *opaque);
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2758354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turnervoid qemu_iohandler_fill(int *pnfds, fd_set *readfds, fd_set *writefds, fd_set *xfds);
2768354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turnervoid qemu_iohandler_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds, int rc);
2778354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turner
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ParallelIOArg {
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void *buffer;
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int count;
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef int (*DMA_transfer_handler) (void *opaque, int nchan, int pos, int size);
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
285d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnertypedef uint64_t pcibus_t;
286d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
287d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnertypedef enum {
288d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    IF_NONE,
289d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN,
290d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    IF_COUNT
291d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner} BlockInterfaceType;
292d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
293f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turnertypedef enum LostTickPolicy {
294f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    LOST_TICK_DISCARD,
295f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    LOST_TICK_DELAY,
296f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    LOST_TICK_MERGE,
297f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    LOST_TICK_SLEW,
298f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    LOST_TICK_MAX
299f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner} LostTickPolicy;
300f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
301f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turnertypedef struct PCIHostDeviceAddress {
302f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    unsigned int domain;
303f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    unsigned int bus;
304f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    unsigned int slot;
305f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    unsigned int function;
306f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner} PCIHostDeviceAddress;
307f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
308f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
309d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid cpu_exec_init_all(unsigned long tb_size);
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* CPU save/load.  */
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_save(QEMUFile *f, void *opaque);
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint cpu_load(QEMUFile *f, void *opaque, int version_id);
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Force QEMU to process pending events */
3165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_notify_event(void);
3175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
318d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner/* work queue */
319d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerstruct qemu_work_item {
320d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    struct qemu_work_item *next;
321d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    void (*func)(void *data);
322d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    void *data;
323d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    int done;
324d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner};
325d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
3265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct QEMUIOVector {
3275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    struct iovec *iov;
3285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int niov;
3295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int nalloc;
3305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    size_t size;
3315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} QEMUIOVector;
3325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint);
3345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_iovec_init_external(QEMUIOVector *qiov, struct iovec *iov, int niov);
3355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len);
3366731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turnervoid qemu_iovec_concat(QEMUIOVector *dst,
3376731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner                       QEMUIOVector *src, size_t soffset, size_t sbytes);
3386731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turnervoid qemu_iovec_concat_iov(QEMUIOVector *dst,
3396731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner                           struct iovec *src_iov, unsigned int src_cnt,
3406731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner                           size_t soffset, size_t sbytes);
3415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_iovec_destroy(QEMUIOVector *qiov);
3425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_iovec_reset(QEMUIOVector *qiov);
3436731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turnersize_t qemu_iovec_to_buf(QEMUIOVector *qiov, size_t offset,
3446731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner                         void *buf, size_t bytes);
3456731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turnersize_t qemu_iovec_from_buf(QEMUIOVector *qiov, size_t offset,
3466731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner                           const void *buf, size_t bytes);
3476731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turnersize_t qemu_iovec_memset(QEMUIOVector *qiov, size_t offset,
3486731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner                         int fillc, size_t bytes);
3495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
350a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerbool buffer_is_zero(const void *buf, size_t len);
351a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
352f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define QEMU_FILE_TYPE_BIOS   0
353f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define QEMU_FILE_TYPE_KEYMAP 1
354f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turnerchar *qemu_find_file(int type, const char *name);
355f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
356c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner/* OS specific functions */
357c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turnervoid os_setup_early_signal_handling(void);
358c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turnerchar *os_find_datadir(const char *argv0);
359c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turnervoid os_parse_cmd_args(int index, const char *optarg);
360c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turnervoid os_pidfile_error(void);
361c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner
362d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner/* Convert a byte between binary and BCD.  */
363d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerstatic inline uint8_t to_bcd(uint8_t val)
364d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner{
365d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    return ((val / 10) << 4) | (val % 10);
366d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner}
367d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
368d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerstatic inline uint8_t from_bcd(uint8_t val)
369d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner{
370d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    return ((val >> 4) * 10) + (val & 0x0f);
371d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner}
372d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
373795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner/* compute with 96 bit intermediate result: (a*b)/c */
374795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turnerstatic inline uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
375795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner{
376795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    union {
377795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner        uint64_t ll;
378795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner        struct {
379795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner#ifdef HOST_WORDS_BIGENDIAN
380795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner            uint32_t high, low;
381795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner#else
382795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner            uint32_t low, high;
383795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner#endif
384795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner        } l;
385795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    } u, res;
386795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    uint64_t rl, rh;
387795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner
388795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    u.ll = a;
389795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    rl = (uint64_t)u.l.low * (uint64_t)b;
390795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    rh = (uint64_t)u.l.high * (uint64_t)b;
391795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    rh += (rl >> 32);
392795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    res.l.high = rh / c;
393795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
394795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    return res.ll;
395795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner}
396795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner
397a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/* Round number down to multiple */
398a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define QEMU_ALIGN_DOWN(n, m) ((n) / (m) * (m))
399a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
400a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/* Round number up to multiple */
401a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define QEMU_ALIGN_UP(n, m) QEMU_ALIGN_DOWN((n) + (m) - 1, (m))
402a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
403a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerstatic inline bool is_power_of_2(uint64_t value)
404a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner{
405a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner    if (!value) {
406a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner        return 0;
407a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner    }
408a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
409a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner    return !(value & (value - 1));
410a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner}
411a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
412a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/* round down to the nearest power of 2*/
413a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint64_t pow2floor(int64_t value);
414a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
415e90d665cd63a0bc5c3306e1ee3e98ad362546b16David 'Digit' Turner#include "qemu/module.h"
4165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
41710bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine/*
418a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * Implementation of ULEB128 (http://en.wikipedia.org/wiki/LEB128)
419a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * Input is limited to 14-bit numbers
420a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner */
421a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
422a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint uleb128_encode_small(uint8_t *out, uint32_t n);
423a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint uleb128_decode_small(const uint8_t *in, uint32_t *n);
424a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
4251befd3440439e8181a31140674e847f2d3e1481eDavid 'Digit' Turner/* unicode.c */
4261befd3440439e8181a31140674e847f2d3e1481eDavid 'Digit' Turnerint mod_utf8_codepoint(const char *s, size_t n, char **end);
4271befd3440439e8181a31140674e847f2d3e1481eDavid 'Digit' Turner
4281befd3440439e8181a31140674e847f2d3e1481eDavid 'Digit' Turner/*
4291befd3440439e8181a31140674e847f2d3e1481eDavid 'Digit' Turner * Hexdump a buffer to a file. An optional string prefix is added to every line
4301befd3440439e8181a31140674e847f2d3e1481eDavid 'Digit' Turner */
4311befd3440439e8181a31140674e847f2d3e1481eDavid 'Digit' Turner
4321befd3440439e8181a31140674e847f2d3e1481eDavid 'Digit' Turnervoid qemu_hexdump(const char *buf, FILE *fp, const char *prefix, size_t size);
433a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
434a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/*
43510bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine * A fixer for timeout value passed to select() on Mac. The issue is that Mac's
43610bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine * version of select() will return EINVAL on timeouts larger than 100000000
43710bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine * seconds, even though it should have just clamped it. So, for Mac we should
43810bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine * make sure that timeout value is bound to 100000000 seconds before passing it
43910bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine * to select().
44010bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine */
44110bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine#if _DARWIN_C_SOURCE
44210bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine#define CLAMP_MAC_TIMEOUT(to) do { if (to > 100000000000LL) to = 100000000000LL; } while (0)
44310bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine#else
44410bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine#define CLAMP_MAC_TIMEOUT(to) ((void)0)
44510bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine#endif  // _DARWIN_C_SOURCE
44610bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine
4470b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#if defined(__clang__) || defined(__llvm__)
4480b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh/* Clang and llvm-gcc don't support global register variable (GRV).
4490b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh   Clang issues compile-time error for GRV.  llvm-gcc accepts GRV (because
4500b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh   its front-end is gcc) but ignores it in the llvm-based back-end.
4510b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh   Undefining GRV decl to allow external/qemu and the rest of Android
4520b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh   to compile.  But emulator built w/o GRV support will not function
4530b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh   correctly.  User will be greeted with an error message (issued
4540b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh   in tcg/tcg.c) when emulator built this way is launched.
4550b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh */
4560b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#define SUPPORT_GLOBAL_REGISTER_VARIABLE 0
4570b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#define GLOBAL_REGISTER_VARIABLE_DECL
4580b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#else
4590b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#define SUPPORT_GLOBAL_REGISTER_VARIABLE 1
4600b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#define GLOBAL_REGISTER_VARIABLE_DECL register
4610b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#endif /* __clang__ || __llvm__ */
4620b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh
463a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/* vector definitions */
464a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#ifdef __ALTIVEC__
465a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#include <altivec.h>
466a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/* The altivec.h header says we're allowed to undef these for
467a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * C++ compatibility.  Here we don't care about C++, but we
468a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * undef them anyway to avoid namespace pollution.
469a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner */
470a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#undef vector
471a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#undef pixel
472a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#undef bool
473a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define VECTYPE        __vector unsigned char
474a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define SPLAT(p)       vec_splat(vec_ld(0, p), 0)
475a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define ALL_EQ(v1, v2) vec_all_eq(v1, v2)
476a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/* altivec.h may redefine the bool macro as vector type.
477a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * Reset it to POSIX semantics. */
478a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define bool _Bool
479a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#elif defined __SSE2__
480a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#include <emmintrin.h>
481a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define VECTYPE        __m128i
482a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define SPLAT(p)       _mm_set1_epi8(*(p))
483a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define ALL_EQ(v1, v2) (_mm_movemask_epi8(_mm_cmpeq_epi8(v1, v2)) == 0xFFFF)
484a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#else
485a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define VECTYPE        unsigned long
486a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define SPLAT(p)       (*(p) * (~0UL / 255))
487a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define ALL_EQ(v1, v2) ((v1) == (v2))
488a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#endif
489a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
490a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR 8
491a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerstatic inline bool
492a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnercan_use_buffer_find_nonzero_offset(const void *buf, size_t len)
493a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner{
494a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner    return (len % (BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR
495a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner                   * sizeof(VECTYPE)) == 0
496a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner            && ((uintptr_t) buf) % sizeof(VECTYPE) == 0);
497a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner}
498a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnersize_t buffer_find_nonzero_offset(const void *buf, size_t len);
499a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
500a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/*
501a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * helper to parse debug environment variables
502a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner */
503a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint parse_debug_env(const char *name, int max, int initial);
504a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
5059b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turnerextern int use_icount;
5069b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner
5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
508