123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412 |
- /* Common header file that is included by all of qemu. */
- #ifndef QEMU_COMMON_H
- #define QEMU_COMMON_H
- #include "compiler.h"
- #include "config-host.h"
- #if defined(__arm__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__) || defined(__ia64__)
- #define WORDS_ALIGNED
- #endif
- #define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
- typedef struct QEMUTimer QEMUTimer;
- typedef struct QEMUFile QEMUFile;
- typedef struct DeviceState DeviceState;
- struct Monitor;
- typedef struct Monitor Monitor;
- /* we put basic includes here to avoid repeating them in device drivers */
- #include <stdlib.h>
- #include <stdio.h>
- #include <stdarg.h>
- #include <stdbool.h>
- #include <string.h>
- #include <strings.h>
- #include <inttypes.h>
- #include <limits.h>
- #include <time.h>
- #include <ctype.h>
- #include <errno.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/stat.h>
- #include <sys/time.h>
- #include <assert.h>
- #include <signal.h>
- #include <glib.h>
- #ifdef _WIN32
- #include "qemu-os-win32.h"
- #endif
- #ifdef CONFIG_POSIX
- #include "qemu-os-posix.h"
- #endif
- #ifndef O_LARGEFILE
- #define O_LARGEFILE 0
- #endif
- #ifndef O_BINARY
- #define O_BINARY 0
- #endif
- #ifndef MAP_ANONYMOUS
- #define MAP_ANONYMOUS MAP_ANON
- #endif
- #ifndef ENOMEDIUM
- #define ENOMEDIUM ENODEV
- #endif
- #if !defined(ENOTSUP)
- #define ENOTSUP 4096
- #endif
- #if !defined(ECANCELED)
- #define ECANCELED 4097
- #endif
- #ifndef TIME_MAX
- #define TIME_MAX LONG_MAX
- #endif
- /* HOST_LONG_BITS is the size of a native pointer in bits. */
- #if UINTPTR_MAX == UINT32_MAX
- # define HOST_LONG_BITS 32
- #elif UINTPTR_MAX == UINT64_MAX
- # define HOST_LONG_BITS 64
- #else
- # error Unknown pointer size
- #endif
- #ifndef CONFIG_IOVEC
- #define CONFIG_IOVEC
- struct iovec {
- void *iov_base;
- size_t iov_len;
- };
- /*
- * Use the same value as Linux for now.
- */
- #define IOV_MAX 1024
- #else
- #include <sys/uio.h>
- #endif
- typedef int (*fprintf_function)(FILE *f, const char *fmt, ...)
- GCC_FMT_ATTR(2, 3);
- #ifdef _WIN32
- #define fsync _commit
- #if !defined(lseek)
- # define lseek _lseeki64
- #endif
- int qemu_ftruncate64(int, int64_t);
- #if !defined(ftruncate)
- # define ftruncate qemu_ftruncate64
- #endif
- static inline char *realpath(const char *path, char *resolved_path)
- {
- _fullpath(resolved_path, path, _MAX_PATH);
- return resolved_path;
- }
- #endif
- /* icount */
- void configure_icount(const char *option);
- extern int use_icount;
- /* FIXME: Remove NEED_CPU_H. */
- #ifndef NEED_CPU_H
- #include "osdep.h"
- #include "bswap.h"
- #else
- #include "cpu.h"
- #endif /* !defined(NEED_CPU_H) */
- /* main function, renamed */
- #if defined(CONFIG_COCOA)
- int qemu_main(int argc, char **argv, char **envp);
- #endif
- void qemu_get_timedate(struct tm *tm, int offset);
- int qemu_timedate_diff(struct tm *tm);
- /* cutils.c */
- void pstrcpy(char *buf, int buf_size, const char *str);
- char *pstrcat(char *buf, int buf_size, const char *s);
- int strstart(const char *str, const char *val, const char **ptr);
- int stristart(const char *str, const char *val, const char **ptr);
- int qemu_strnlen(const char *s, int max_len);
- time_t mktimegm(struct tm *tm);
- int qemu_fls(int i);
- int qemu_fdatasync(int fd);
- int fcntl_setfl(int fd, int flag);
- int qemu_parse_fd(const char *param);
- /*
- * strtosz() suffixes used to specify the default treatment of an
- * argument passed to strtosz() without an explicit suffix.
- * These should be defined using upper case characters in the range
- * A-Z, as strtosz() will use qemu_toupper() on the given argument
- * prior to comparison.
- */
- #define STRTOSZ_DEFSUFFIX_TB 'T'
- #define STRTOSZ_DEFSUFFIX_GB 'G'
- #define STRTOSZ_DEFSUFFIX_MB 'M'
- #define STRTOSZ_DEFSUFFIX_KB 'K'
- #define STRTOSZ_DEFSUFFIX_B 'B'
- int64_t strtosz(const char *nptr, char **end);
- int64_t strtosz_suffix(const char *nptr, char **end, const char default_suffix);
- int64_t strtosz_suffix_unit(const char *nptr, char **end,
- const char default_suffix, int64_t unit);
- /* path.c */
- void init_paths(const char *prefix);
- const char *path(const char *pathname);
- #define qemu_isalnum(c) isalnum((unsigned char)(c))
- #define qemu_isalpha(c) isalpha((unsigned char)(c))
- #define qemu_iscntrl(c) iscntrl((unsigned char)(c))
- #define qemu_isdigit(c) isdigit((unsigned char)(c))
- #define qemu_isgraph(c) isgraph((unsigned char)(c))
- #define qemu_islower(c) islower((unsigned char)(c))
- #define qemu_isprint(c) isprint((unsigned char)(c))
- #define qemu_ispunct(c) ispunct((unsigned char)(c))
- #define qemu_isspace(c) isspace((unsigned char)(c))
- #define qemu_isupper(c) isupper((unsigned char)(c))
- #define qemu_isxdigit(c) isxdigit((unsigned char)(c))
- #define qemu_tolower(c) tolower((unsigned char)(c))
- #define qemu_toupper(c) toupper((unsigned char)(c))
- #define qemu_isascii(c) isascii((unsigned char)(c))
- #define qemu_toascii(c) toascii((unsigned char)(c))
- void *qemu_oom_check(void *ptr);
- int qemu_open(const char *name, int flags, ...);
- ssize_t qemu_write_full(int fd, const void *buf, size_t count)
- QEMU_WARN_UNUSED_RESULT;
- ssize_t qemu_send_full(int fd, const void *buf, size_t count, int flags)
- QEMU_WARN_UNUSED_RESULT;
- ssize_t qemu_recv_full(int fd, void *buf, size_t count, int flags)
- QEMU_WARN_UNUSED_RESULT;
- #ifndef _WIN32
- int qemu_eventfd(int pipefd[2]);
- int qemu_pipe(int pipefd[2]);
- #endif
- #ifdef _WIN32
- #define qemu_recv(sockfd, buf, len, flags) recv(sockfd, (void *)buf, len, flags)
- #else
- #define qemu_recv(sockfd, buf, len, flags) recv(sockfd, buf, len, flags)
- #endif
- int qemu_recvv(int sockfd, struct iovec *iov, int len, int iov_offset);
- int qemu_sendv(int sockfd, struct iovec *iov, int len, int iov_offset);
- /* Error handling. */
- void QEMU_NORETURN hw_error(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
- struct ParallelIOArg {
- void *buffer;
- int count;
- };
- typedef int (*DMA_transfer_handler) (void *opaque, int nchan, int pos, int size);
- /* A load of opaque types so that device init declarations don't have to
- pull in all the real definitions. */
- typedef struct NICInfo NICInfo;
- typedef struct HCIInfo HCIInfo;
- typedef struct AudioState AudioState;
- typedef struct BlockDriverState BlockDriverState;
- typedef struct DriveInfo DriveInfo;
- typedef struct DisplayState DisplayState;
- typedef struct DisplayChangeListener DisplayChangeListener;
- typedef struct DisplaySurface DisplaySurface;
- typedef struct DisplayAllocator DisplayAllocator;
- typedef struct PixelFormat PixelFormat;
- typedef struct TextConsole TextConsole;
- typedef TextConsole QEMUConsole;
- typedef struct CharDriverState CharDriverState;
- typedef struct MACAddr MACAddr;
- typedef struct VLANState VLANState;
- typedef struct VLANClientState VLANClientState;
- typedef struct i2c_bus i2c_bus;
- typedef struct ISABus ISABus;
- typedef struct SMBusDevice SMBusDevice;
- typedef struct PCIHostState PCIHostState;
- typedef struct PCIExpressHost PCIExpressHost;
- typedef struct PCIBus PCIBus;
- typedef struct PCIDevice PCIDevice;
- typedef struct PCIExpressDevice PCIExpressDevice;
- typedef struct PCIBridge PCIBridge;
- typedef struct PCIEAERMsg PCIEAERMsg;
- typedef struct PCIEAERLog PCIEAERLog;
- typedef struct PCIEAERErr PCIEAERErr;
- typedef struct PCIEPort PCIEPort;
- typedef struct PCIESlot PCIESlot;
- typedef struct SerialState SerialState;
- typedef struct IRQState *qemu_irq;
- typedef struct PCMCIACardState PCMCIACardState;
- typedef struct MouseTransformInfo MouseTransformInfo;
- typedef struct uWireSlave uWireSlave;
- typedef struct I2SCodec I2SCodec;
- typedef struct SSIBus SSIBus;
- typedef struct EventNotifier EventNotifier;
- typedef struct VirtIODevice VirtIODevice;
- typedef struct QEMUSGList QEMUSGList;
- typedef struct SHPCDevice SHPCDevice;
- typedef uint64_t pcibus_t;
- typedef enum LostTickPolicy {
- LOST_TICK_DISCARD,
- LOST_TICK_DELAY,
- LOST_TICK_MERGE,
- LOST_TICK_SLEW,
- LOST_TICK_MAX
- } LostTickPolicy;
- void tcg_exec_init(unsigned long tb_size);
- bool tcg_enabled(void);
- void cpu_exec_init_all(void);
- /* CPU save/load. */
- void cpu_save(QEMUFile *f, void *opaque);
- int cpu_load(QEMUFile *f, void *opaque, int version_id);
- /* Unblock cpu */
- void qemu_cpu_kick(void *env);
- void qemu_cpu_kick_self(void);
- int qemu_cpu_is_self(void *env);
- bool all_cpu_threads_idle(void);
- /* work queue */
- struct qemu_work_item {
- struct qemu_work_item *next;
- void (*func)(void *data);
- void *data;
- int done;
- };
- #ifdef CONFIG_USER_ONLY
- #define qemu_init_vcpu(env) do { } while (0)
- #else
- void qemu_init_vcpu(void *env);
- #endif
- /**
- * Sends an iovec (or optionally a part of it) down a socket, yielding
- * when the socket is full.
- */
- int qemu_co_sendv(int sockfd, struct iovec *iov,
- int len, int iov_offset);
- /**
- * Receives data into an iovec (or optionally into a part of it) from
- * a socket, yielding when there is no data in the socket.
- */
- int qemu_co_recvv(int sockfd, struct iovec *iov,
- int len, int iov_offset);
- /**
- * Sends a buffer down a socket, yielding when the socket is full.
- */
- int qemu_co_send(int sockfd, void *buf, int len);
- /**
- * Receives data into a buffer from a socket, yielding when there
- * is no data in the socket.
- */
- int qemu_co_recv(int sockfd, void *buf, int len);
- typedef struct QEMUIOVector {
- struct iovec *iov;
- int niov;
- int nalloc;
- size_t size;
- } QEMUIOVector;
- void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint);
- void qemu_iovec_init_external(QEMUIOVector *qiov, struct iovec *iov, int niov);
- void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len);
- void qemu_iovec_copy(QEMUIOVector *dst, QEMUIOVector *src, uint64_t skip,
- size_t size);
- void qemu_iovec_concat(QEMUIOVector *dst, QEMUIOVector *src, size_t size);
- void qemu_iovec_destroy(QEMUIOVector *qiov);
- void qemu_iovec_reset(QEMUIOVector *qiov);
- void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf);
- void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t count);
- void qemu_iovec_memset(QEMUIOVector *qiov, int c, size_t count);
- void qemu_iovec_memset_skip(QEMUIOVector *qiov, int c, size_t count,
- size_t skip);
- bool buffer_is_zero(const void *buf, size_t len);
- void qemu_progress_init(int enabled, float min_skip);
- void qemu_progress_end(void);
- void qemu_progress_print(float delta, int max);
- #define QEMU_FILE_TYPE_BIOS 0
- #define QEMU_FILE_TYPE_KEYMAP 1
- char *qemu_find_file(int type, const char *name);
- /* OS specific functions */
- void os_setup_early_signal_handling(void);
- char *os_find_datadir(const char *argv0);
- void os_parse_cmd_args(int index, const char *optarg);
- void os_pidfile_error(void);
- /* Convert a byte between binary and BCD. */
- static inline uint8_t to_bcd(uint8_t val)
- {
- return ((val / 10) << 4) | (val % 10);
- }
- static inline uint8_t from_bcd(uint8_t val)
- {
- return ((val >> 4) * 10) + (val & 0x0f);
- }
- /* compute with 96 bit intermediate result: (a*b)/c */
- static inline uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
- {
- union {
- uint64_t ll;
- struct {
- #ifdef HOST_WORDS_BIGENDIAN
- uint32_t high, low;
- #else
- uint32_t low, high;
- #endif
- } l;
- } u, res;
- uint64_t rl, rh;
- u.ll = a;
- rl = (uint64_t)u.l.low * (uint64_t)b;
- rh = (uint64_t)u.l.high * (uint64_t)b;
- rh += (rl >> 32);
- res.l.high = rh / c;
- res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
- return res.ll;
- }
- /* Round number down to multiple */
- #define QEMU_ALIGN_DOWN(n, m) ((n) / (m) * (m))
- /* Round number up to multiple */
- #define QEMU_ALIGN_UP(n, m) QEMU_ALIGN_DOWN((n) + (m) - 1, (m))
- #include "module.h"
- #endif
|