qemu-common.h revision a6775c752a2af7a51b431367e284f3ac619e48f3
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
15f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#include "qemu/compiler.h"
166a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#include "config-host.h"
176a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
18f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#if defined(__arm__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__) || defined(__ia64__)
19f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define WORDS_ALIGNED
206a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#endif
216a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
22f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
23f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
246a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
256a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnertypedef struct QEMUTimer QEMUTimer;
266a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnertypedef struct QEMUFile QEMUFile;
276a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnertypedef struct QEMUBH QEMUBH;
286a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnertypedef struct DeviceState DeviceState;
295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3045c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnerstruct Monitor;
3145c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnertypedef struct Monitor Monitor;
325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* we put basic includes here to avoid repeating them in device drivers */
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdlib.h>
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdio.h>
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdarg.h>
376a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#include <stdbool.h>
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h>
395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <strings.h>
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <inttypes.h>
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <limits.h>
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <time.h>
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <ctype.h>
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <errno.h>
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <unistd.h>
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <fcntl.h>
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <sys/stat.h>
4845c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#include <sys/time.h>
495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <assert.h>
50f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#include <signal.h>
51aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner#include <glib.h>
52aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner
5345c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#ifdef _WIN32
54057b0f638014d1cb6764aab945b98197329f745eDavid 'Digit' Turner#include "sysemu/os-win32.h"
5545c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#endif
5645c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner
5745c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#ifdef CONFIG_POSIX
58057b0f638014d1cb6764aab945b98197329f745eDavid 'Digit' Turner#include "sysemu/os-posix.h"
5945c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#endif
6045c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef O_LARGEFILE
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define O_LARGEFILE 0
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef O_BINARY
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define O_BINARY 0
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
67d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#ifndef MAP_ANONYMOUS
68d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#define MAP_ANONYMOUS MAP_ANON
69d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#endif
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef ENOMEDIUM
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENOMEDIUM ENODEV
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
73d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#if !defined(ENOTSUP)
74d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#define ENOTSUP 4096
75d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#endif
76f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#if !defined(ECANCELED)
77f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define ECANCELED 4097
78f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#endif
79f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#if !defined(EMEDIUMTYPE)
80f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define EMEDIUMTYPE 4098
81f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#endif
8245c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#ifndef TIME_MAX
8345c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#define TIME_MAX LONG_MAX
8445c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#endif
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
863d66dc7c08acb3802bf803abca68ac5fb36582b4David 'Digit' Turner#ifndef CONFIG_IOVEC
873d66dc7c08acb3802bf803abca68ac5fb36582b4David 'Digit' Turner#define CONFIG_IOVEC
885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct iovec {
895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void *iov_base;
905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    size_t iov_len;
915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
92d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner/*
93d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner * Use the same value as Linux for now.
94d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner */
95d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#define IOV_MAX		1024
965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else
975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <sys/uio.h>
985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
10045c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnertypedef int (*fprintf_function)(FILE *f, const char *fmt, ...)
10145c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner    GCC_FMT_ATTR(2, 3);
10245c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define fsync _commit
105f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#if !defined(lseek)
106f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner# define lseek _lseeki64
107f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#endif
10845c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnerint qemu_ftruncate64(int, int64_t);
109f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#if !defined(ftruncate)
110f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner# define ftruncate qemu_ftruncate64
111f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#endif
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline char *realpath(const char *path, char *resolved_path)
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    _fullpath(resolved_path, path, _MAX_PATH);
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return resolved_path;
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PRId64 "I64d"
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PRIx64 "I64x"
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PRIu64 "I64u"
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PRIo64 "I64o"
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* FIXME: Remove NEED_CPU_H.  */
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef NEED_CPU_H
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <setjmp.h>
129845691383dd6a0ff71acf7aee0736adba350f6a9David 'Digit' Turner#include "qemu/osdep.h"
1306e9d1d4fc96a32fbac14d3e489cce32f5c69ade1David 'Digit' Turner#include "qemu/bswap.h"
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "cpu.h"
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* !defined(NEED_CPU_H) */
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* bottom halves */
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void QEMUBHFunc(void *opaque);
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
141d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid async_context_push(void);
142d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid async_context_pop(void);
143d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerint get_async_context_id(void);
144d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectQEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque);
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_bh_schedule(QEMUBH *bh);
1475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Bottom halfs that are scheduled from a bottom half handler are instantly
1485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * invoked.  This can create an infinite loop if a bottom half handler
1495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * schedules itself.  qemu_bh_schedule_idle() avoids this infinite loop by
1505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * ensuring that the bottom half isn't executed until the next main loop
1515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * iteration.
1525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
1535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_bh_schedule_idle(QEMUBH *bh);
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_bh_cancel(QEMUBH *bh);
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_bh_delete(QEMUBH *bh);
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_bh_poll(void);
157d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid qemu_bh_update_timeout(int *timeout);
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_get_timedate(struct tm *tm, int offset);
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_timedate_diff(struct tm *tm);
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
162a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/**
163a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * is_help_option:
164a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * @s: string to test
165a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner *
166a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * Check whether @s is one of the standard strings which indicate
167a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * that the user is asking for a list of the valid values for a
168a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * command option like -cpu or -M. The current accepted strings
169a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * are 'help' and '?'. '?' is deprecated (it is a shell wildcard
170a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * which makes it annoying to use in a reliable way) but provided
171a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * for backwards compatibility.
172a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner *
173a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * Returns: true if @s is a request for a list.
174a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner */
175a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerstatic inline bool is_help_option(const char *s)
176a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner{
177a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner    return !strcmp(s, "?") || !strcmp(s, "help");
178a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner}
179a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* cutils.c */
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid pstrcpy(char *buf, int buf_size, const char *str);
182a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnervoid strpadcpy(char *buf, int buf_size, const char *str, char pad);
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectchar *pstrcat(char *buf, int buf_size, const char *s);
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint strstart(const char *str, const char *val, const char **ptr);
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint stristart(const char *str, const char *val, const char **ptr);
186fd3b1a0e32964436a5259e073857e0c4e2110122David 'Digit' Turnerint qemu_strnlen(const char *s, int max_len);
187a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerchar *qemu_strsep(char **input, const char *delim);
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttime_t mktimegm(struct tm *tm);
1895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint qemu_fls(int i);
190fd3b1a0e32964436a5259e073857e0c4e2110122David 'Digit' Turnerint qemu_fdatasync(int fd);
1916a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerint fcntl_setfl(int fd, int flag);
192a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint qemu_parse_fd(const char *param);
193a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
194a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint parse_uint(const char *s, unsigned long long *value, char **endptr,
195a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner               int base);
196a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint parse_uint_full(const char *s, unsigned long long *value, int base);
1975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
19845c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner/*
19945c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner * strtosz() suffixes used to specify the default treatment of an
20045c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner * argument passed to strtosz() without an explicit suffix.
20145c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner * These should be defined using upper case characters in the range
20245c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner * A-Z, as strtosz() will use qemu_toupper() on the given argument
20345c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner * prior to comparison.
20445c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner */
205f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define STRTOSZ_DEFSUFFIX_EB	'E'
206f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define STRTOSZ_DEFSUFFIX_PB	'P'
20745c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#define STRTOSZ_DEFSUFFIX_TB	'T'
20845c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#define STRTOSZ_DEFSUFFIX_GB	'G'
20945c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#define STRTOSZ_DEFSUFFIX_MB	'M'
21045c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#define STRTOSZ_DEFSUFFIX_KB	'K'
21145c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#define STRTOSZ_DEFSUFFIX_B	'B'
21245c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnerint64_t strtosz(const char *nptr, char **end);
21345c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnerint64_t strtosz_suffix(const char *nptr, char **end, const char default_suffix);
214a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint64_t strtosz_suffix_unit(const char *nptr, char **end,
215a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner                            const char default_suffix, int64_t unit);
21645c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner
217f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner/* used to print char* safely */
218f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define STR_OR_NULL(str) ((str) ? (str) : "null")
219f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
220b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner/* path.c */
221b91980562344f6a3b719bfe4be007fa9406e585fDavid Turnervoid init_paths(const char *prefix);
222b91980562344f6a3b719bfe4be007fa9406e585fDavid Turnerconst char *path(const char *pathname);
223b91980562344f6a3b719bfe4be007fa9406e585fDavid Turner
2245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isalnum(c)		isalnum((unsigned char)(c))
2255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isalpha(c)		isalpha((unsigned char)(c))
2265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_iscntrl(c)		iscntrl((unsigned char)(c))
2275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isdigit(c)		isdigit((unsigned char)(c))
2285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isgraph(c)		isgraph((unsigned char)(c))
2295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_islower(c)		islower((unsigned char)(c))
2305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isprint(c)		isprint((unsigned char)(c))
2315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_ispunct(c)		ispunct((unsigned char)(c))
2325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isspace(c)		isspace((unsigned char)(c))
2335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isupper(c)		isupper((unsigned char)(c))
2345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isxdigit(c)	isxdigit((unsigned char)(c))
2355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_tolower(c)		tolower((unsigned char)(c))
2365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_toupper(c)		toupper((unsigned char)(c))
2375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_isascii(c)		isascii((unsigned char)(c))
2385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_toascii(c)		toascii((unsigned char)(c))
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
24045c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#ifdef _WIN32
24145c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner/* ffs() in oslib-win32.c for WIN32, strings.h for the rest of the world */
24245c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnerint ffs(int i);
24345c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#endif
24445c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner
245d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid qemu_mutex_lock_iothread(void);
246d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid qemu_mutex_unlock_iothread(void);
247d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
248d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerint qemu_open(const char *name, int flags, ...);
249d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerssize_t qemu_write_full(int fd, const void *buf, size_t count)
250d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    QEMU_WARN_UNUSED_RESULT;
251d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid qemu_set_cloexec(int fd);
252d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
253d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#ifndef _WIN32
2548354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turnerint qemu_add_child_watch(pid_t pid);
255d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerint qemu_eventfd(int pipefd[2]);
256d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerint qemu_pipe(int pipefd[2]);
257d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner#endif
258d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *get_mmap_addr(unsigned long size);
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Error handling.  */
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
26445c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turnervoid QEMU_NORETURN hw_error(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* IO callbacks.  */
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void IOReadHandler(void *opaque, const uint8_t *buf, int size);
2684143d8f4c302878923bde0cb2420f4ca27245bcdDavid Turnertypedef int IOCanReadHandler(void *opaque);
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void IOHandler(void *opaque);
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2718354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turnervoid qemu_iohandler_fill(int *pnfds, fd_set *readfds, fd_set *writefds, fd_set *xfds);
2728354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turnervoid qemu_iohandler_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds, int rc);
2738354d2d35fe4463816dcc52a96fa354940fdd38fDavid 'Digit' Turner
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ParallelIOArg {
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void *buffer;
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int count;
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef int (*DMA_transfer_handler) (void *opaque, int nchan, int pos, int size);
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* A load of opaque types so that device init declarations don't have to
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   pull in all the real definitions.  */
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct NICInfo NICInfo;
2845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct HCIInfo HCIInfo;
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct AudioState AudioState;
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct BlockDriverState BlockDriverState;
287d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnertypedef struct DriveInfo DriveInfo;
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct DisplayState DisplayState;
2895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct DisplayChangeListener DisplayChangeListener;
2905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct DisplaySurface DisplaySurface;
2915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct DisplayAllocator DisplayAllocator;
2925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct PixelFormat PixelFormat;
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct TextConsole TextConsole;
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef TextConsole QEMUConsole;
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct CharDriverState CharDriverState;
296d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnertypedef struct MACAddr MACAddr;
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct VLANState VLANState;
298d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnertypedef struct VLANClientState VLANClientState;
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct i2c_bus i2c_bus;
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct i2c_slave i2c_slave;
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct SMBusDevice SMBusDevice;
302d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnertypedef struct PCIHostState PCIHostState;
303d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnertypedef struct PCIExpressHost PCIExpressHost;
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct PCIBus PCIBus;
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct PCIDevice PCIDevice;
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct SerialState SerialState;
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct IRQState *qemu_irq;
3085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct PCMCIACardState PCMCIACardState;
3095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct MouseTransformInfo MouseTransformInfo;
3105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct uWireSlave uWireSlave;
3115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct I2SCodec I2SCodec;
3125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct SSIBus SSIBus;
313d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnertypedef struct EventNotifier EventNotifier;
314d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnertypedef struct VirtIODevice VirtIODevice;
315d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
316d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnertypedef uint64_t pcibus_t;
317d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
318d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnertypedef enum {
319d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    IF_NONE,
320d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN,
321d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    IF_COUNT
322d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner} BlockInterfaceType;
323d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
324f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turnertypedef enum LostTickPolicy {
325f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    LOST_TICK_DISCARD,
326f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    LOST_TICK_DELAY,
327f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    LOST_TICK_MERGE,
328f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    LOST_TICK_SLEW,
329f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    LOST_TICK_MAX
330f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner} LostTickPolicy;
331f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
332f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turnertypedef struct PCIHostDeviceAddress {
333f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    unsigned int domain;
334f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    unsigned int bus;
335f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    unsigned int slot;
336f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner    unsigned int function;
337f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner} PCIHostDeviceAddress;
338f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
339f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
340d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid cpu_exec_init_all(unsigned long tb_size);
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* CPU save/load.  */
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_save(QEMUFile *f, void *opaque);
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint cpu_load(QEMUFile *f, void *opaque, int version_id);
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Force QEMU to stop what it's doing and service IO */
3475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_service_io(void);
3485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Force QEMU to process pending events */
3505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_notify_event(void);
3515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Unblock cpu */
3535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_cpu_kick(void *env);
3545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint qemu_cpu_self(void *env);
3555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
356d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner/* work queue */
357d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerstruct qemu_work_item {
358d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    struct qemu_work_item *next;
359d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    void (*func)(void *data);
360d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    void *data;
361d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    int done;
362d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner};
363d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
3645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_USER_ONLY
3655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define qemu_init_vcpu(env) do { } while (0)
3665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else
3675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_init_vcpu(void *env);
3685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
3695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct QEMUIOVector {
3715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    struct iovec *iov;
3725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int niov;
3735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int nalloc;
3745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    size_t size;
3755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} QEMUIOVector;
3765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint);
3785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_iovec_init_external(QEMUIOVector *qiov, struct iovec *iov, int niov);
3795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len);
380795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turnervoid qemu_iovec_copy(QEMUIOVector *dst, QEMUIOVector *src, uint64_t skip,
381795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    size_t size);
382d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnervoid qemu_iovec_concat(QEMUIOVector *dst, QEMUIOVector *src, size_t size);
3835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_iovec_destroy(QEMUIOVector *qiov);
3845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_iovec_reset(QEMUIOVector *qiov);
3855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf);
3865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t count);
387795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turnervoid qemu_iovec_memset(QEMUIOVector *qiov, int c, size_t count);
388795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turnervoid qemu_iovec_memset_skip(QEMUIOVector *qiov, int c, size_t count,
389795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner                            size_t skip);
3905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
391a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerbool buffer_is_zero(const void *buf, size_t len);
392a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
393f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define QEMU_FILE_TYPE_BIOS   0
394f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner#define QEMU_FILE_TYPE_KEYMAP 1
395f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turnerchar *qemu_find_file(int type, const char *name);
396f6669d7bf05c4abb8f95862e82322ec4689251f4David 'Digit' Turner
397c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner/* OS specific functions */
398c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turnervoid os_setup_early_signal_handling(void);
399c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turnerchar *os_find_datadir(const char *argv0);
400c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turnervoid os_parse_cmd_args(int index, const char *optarg);
401c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turnervoid os_pidfile_error(void);
402c1ac40a3f493bebe160a441faf36cc9b28b9f205David 'Digit' Turner
403d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner/* Convert a byte between binary and BCD.  */
404d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerstatic inline uint8_t to_bcd(uint8_t val)
405d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner{
406d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    return ((val / 10) << 4) | (val % 10);
407d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner}
408d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
409d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turnerstatic inline uint8_t from_bcd(uint8_t val)
410d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner{
411d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner    return ((val >> 4) * 10) + (val & 0x0f);
412d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner}
413d06599430ac907d1a89bbfda4bf3621f909aac8eDavid Turner
414795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner/* compute with 96 bit intermediate result: (a*b)/c */
415795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turnerstatic inline uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
416795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner{
417795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    union {
418795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner        uint64_t ll;
419795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner        struct {
420795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner#ifdef HOST_WORDS_BIGENDIAN
421795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner            uint32_t high, low;
422795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner#else
423795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner            uint32_t low, high;
424795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner#endif
425795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner        } l;
426795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    } u, res;
427795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    uint64_t rl, rh;
428795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner
429795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    u.ll = a;
430795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    rl = (uint64_t)u.l.low * (uint64_t)b;
431795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    rh = (uint64_t)u.l.high * (uint64_t)b;
432795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    rh += (rl >> 32);
433795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    res.l.high = rh / c;
434795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
435795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner    return res.ll;
436795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner}
437795bb19daea966401df15bbf23c57b98848eec23David 'Digit' Turner
438a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/* Round number down to multiple */
439a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define QEMU_ALIGN_DOWN(n, m) ((n) / (m) * (m))
440a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
441a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/* Round number up to multiple */
442a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define QEMU_ALIGN_UP(n, m) QEMU_ALIGN_DOWN((n) + (m) - 1, (m))
443a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
444a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerstatic inline bool is_power_of_2(uint64_t value)
445a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner{
446a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner    if (!value) {
447a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner        return 0;
448a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner    }
449a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
450a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner    return !(value & (value - 1));
451a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner}
452a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
453a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/* round down to the nearest power of 2*/
454a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint64_t pow2floor(int64_t value);
455a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
456e90d665cd63a0bc5c3306e1ee3e98ad362546b16David 'Digit' Turner#include "qemu/module.h"
4575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
45810bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine/*
459a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * Implementation of ULEB128 (http://en.wikipedia.org/wiki/LEB128)
460a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * Input is limited to 14-bit numbers
461a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner */
462a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
463a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint uleb128_encode_small(uint8_t *out, uint32_t n);
464a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint uleb128_decode_small(const uint8_t *in, uint32_t *n);
465a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
466a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
467a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/*
46810bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine * A fixer for timeout value passed to select() on Mac. The issue is that Mac's
46910bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine * version of select() will return EINVAL on timeouts larger than 100000000
47010bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine * seconds, even though it should have just clamped it. So, for Mac we should
47110bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine * make sure that timeout value is bound to 100000000 seconds before passing it
47210bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine * to select().
47310bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine */
47410bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine#if _DARWIN_C_SOURCE
47510bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine#define CLAMP_MAC_TIMEOUT(to) do { if (to > 100000000000LL) to = 100000000000LL; } while (0)
47610bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine#else
47710bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine#define CLAMP_MAC_TIMEOUT(to) ((void)0)
47810bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine#endif  // _DARWIN_C_SOURCE
47910bc04fd968d7f80258bf1eec665babf28e9e47dVladimir Chtchetkine
4800b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#if defined(__clang__) || defined(__llvm__)
4810b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh/* Clang and llvm-gcc don't support global register variable (GRV).
4820b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh   Clang issues compile-time error for GRV.  llvm-gcc accepts GRV (because
4830b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh   its front-end is gcc) but ignores it in the llvm-based back-end.
4840b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh   Undefining GRV decl to allow external/qemu and the rest of Android
4850b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh   to compile.  But emulator built w/o GRV support will not function
4860b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh   correctly.  User will be greeted with an error message (issued
4870b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh   in tcg/tcg.c) when emulator built this way is launched.
4880b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh */
4890b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#define SUPPORT_GLOBAL_REGISTER_VARIABLE 0
4900b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#define GLOBAL_REGISTER_VARIABLE_DECL
4910b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#else
4920b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#define SUPPORT_GLOBAL_REGISTER_VARIABLE 1
4930b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#define GLOBAL_REGISTER_VARIABLE_DECL register
4940b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh#endif /* __clang__ || __llvm__ */
4950b3979707c09e058442c22d046b326ce244edda1Andrew Hsieh
496a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/* vector definitions */
497a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#ifdef __ALTIVEC__
498a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#include <altivec.h>
499a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/* The altivec.h header says we're allowed to undef these for
500a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * C++ compatibility.  Here we don't care about C++, but we
501a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * undef them anyway to avoid namespace pollution.
502a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner */
503a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#undef vector
504a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#undef pixel
505a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#undef bool
506a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define VECTYPE        __vector unsigned char
507a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define SPLAT(p)       vec_splat(vec_ld(0, p), 0)
508a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define ALL_EQ(v1, v2) vec_all_eq(v1, v2)
509a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/* altivec.h may redefine the bool macro as vector type.
510a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * Reset it to POSIX semantics. */
511a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define bool _Bool
512a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#elif defined __SSE2__
513a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#include <emmintrin.h>
514a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define VECTYPE        __m128i
515a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define SPLAT(p)       _mm_set1_epi8(*(p))
516a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define ALL_EQ(v1, v2) (_mm_movemask_epi8(_mm_cmpeq_epi8(v1, v2)) == 0xFFFF)
517a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#else
518a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define VECTYPE        unsigned long
519a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define SPLAT(p)       (*(p) * (~0UL / 255))
520a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define ALL_EQ(v1, v2) ((v1) == (v2))
521a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#endif
522a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
523a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner#define BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR 8
524a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerstatic inline bool
525a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnercan_use_buffer_find_nonzero_offset(const void *buf, size_t len)
526a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner{
527a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner    return (len % (BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR
528a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner                   * sizeof(VECTYPE)) == 0
529a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner            && ((uintptr_t) buf) % sizeof(VECTYPE) == 0);
530a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner}
531a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnersize_t buffer_find_nonzero_offset(const void *buf, size_t len);
532a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
533a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner/*
534a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner * helper to parse debug environment variables
535a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner */
536a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turnerint parse_debug_env(const char *name, int max, int initial);
537a6775c752a2af7a51b431367e284f3ac619e48f3David 'Digit' Turner
5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
539