mirror of
https://github.com/Motorhead1991/qemu.git
synced 2026-03-17 16:25:34 -06:00
* Add cpu0-id to query-sev-capabilities
* whpx support for breakpoints and stepping * initial support for Hyper-V Synthetic Debugging * use monotonic clock for QemuCond and QemuSemaphore * Remove qemu-common.h include from most units and lots of other clenaups * do not include headers for all virtio devices in virtio-ccw.h -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmJXCQAUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroNT6wf+NHDJUEdDiwaVGVTGXgHuiaycsymi FpNPiw/+XxSGN5xF3fkUGgqaDrcwIYwVfnXlghKSz8kp1cP3cjxa5CzNMLGTp5je N6BxFbD7yC6dhagGm3mj32jlsptv3M38OHqKc3t+RaUAotP5RF2VdCyfUBLG6vU0 aMzvMfMtB5aG0D8Fr5EV63t1JMTceFU0YxsG73UCFs2Yx4Z0cGBbNxMbHweRhd1q tPeVDS46MFPM3/2cGGHpeeqxkoCTU7A9j1VuNQI3k+Kg+6W5YVxiK/UP7bw77E/a yAHsmIVTNro8ajMBch73weuHtGtdfFLvCKc6QX6aVjzK4dF1voQ01E7gPQ== =rMle -----END PGP SIGNATURE----- Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging * Add cpu0-id to query-sev-capabilities * whpx support for breakpoints and stepping * initial support for Hyper-V Synthetic Debugging * use monotonic clock for QemuCond and QemuSemaphore * Remove qemu-common.h include from most units and lots of other clenaups * do not include headers for all virtio devices in virtio-ccw.h # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmJXCQAUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroNT6wf+NHDJUEdDiwaVGVTGXgHuiaycsymi # FpNPiw/+XxSGN5xF3fkUGgqaDrcwIYwVfnXlghKSz8kp1cP3cjxa5CzNMLGTp5je # N6BxFbD7yC6dhagGm3mj32jlsptv3M38OHqKc3t+RaUAotP5RF2VdCyfUBLG6vU0 # aMzvMfMtB5aG0D8Fr5EV63t1JMTceFU0YxsG73UCFs2Yx4Z0cGBbNxMbHweRhd1q # tPeVDS46MFPM3/2cGGHpeeqxkoCTU7A9j1VuNQI3k+Kg+6W5YVxiK/UP7bw77E/a # yAHsmIVTNro8ajMBch73weuHtGtdfFLvCKc6QX6aVjzK4dF1voQ01E7gPQ== # =rMle # -----END PGP SIGNATURE----- # gpg: Signature made Wed 13 Apr 2022 10:31:44 AM PDT # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [undefined] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [undefined] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: (53 commits) target/i386: Remove unused XMMReg, YMMReg types and CPUState fields target/i386: do not access beyond the low 128 bits of SSE registers virtio-ccw: do not include headers for all virtio devices virtio-ccw: move device type declarations to .c files virtio-ccw: move vhost_ccw_scsi to a separate file s390x: follow qdev tree to detect SCSI device on a CCW bus hw: hyperv: Initial commit for Synthetic Debugging device hyperv: Add support to process syndbg commands hyperv: Add definitions for syndbg hyperv: SControl is optional to enable SynIc thread-posix: optimize qemu_sem_timedwait with zero timeout thread-posix: implement Semaphore with QemuCond and QemuMutex thread-posix: use monotonic clock for QemuCond and QemuSemaphore thread-posix: remove the posix semaphore support whpx: Added support for breakpoints and stepping build-sys: simplify AF_VSOCK check build-sys: drop ntddscsi.h check Remove qemu-common.h include from most units qga: remove explicit environ argument from exec/spawn Move fcntl_setfl() to oslib-posix ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
1be5a765c0
515 changed files with 3179 additions and 1791 deletions
|
|
@ -34,13 +34,13 @@
|
|||
|
||||
/* some important defines:
|
||||
*
|
||||
* HOST_WORDS_BIGENDIAN : if defined, the host cpu is big endian and
|
||||
* HOST_BIG_ENDIAN : whether the host cpu is big endian and
|
||||
* otherwise little endian.
|
||||
*
|
||||
* TARGET_WORDS_BIGENDIAN : same for target cpu
|
||||
* TARGET_BIG_ENDIAN : same for the target cpu
|
||||
*/
|
||||
|
||||
#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
|
||||
#if HOST_BIG_ENDIAN != TARGET_BIG_ENDIAN
|
||||
#define BSWAP_NEEDED
|
||||
#endif
|
||||
|
||||
|
|
@ -120,7 +120,7 @@ static inline void tswap64s(uint64_t *s)
|
|||
/* Target-endianness CPU memory access functions. These fit into the
|
||||
* {ld,st}{type}{sign}{size}{endian}_p naming scheme described in bswap.h.
|
||||
*/
|
||||
#if defined(TARGET_WORDS_BIGENDIAN)
|
||||
#if TARGET_BIG_ENDIAN
|
||||
#define lduw_p(p) lduw_be_p(p)
|
||||
#define ldsw_p(p) ldsw_be_p(p)
|
||||
#define ldl_p(p) ldl_be_p(p)
|
||||
|
|
|
|||
|
|
@ -19,6 +19,9 @@ typedef uint64_t vaddr;
|
|||
#define VADDR_PRIX PRIX64
|
||||
#define VADDR_MAX UINT64_MAX
|
||||
|
||||
void cpu_exec_init_all(void);
|
||||
void cpu_exec_step_atomic(CPUState *cpu);
|
||||
|
||||
/* Using intptr_t ensures that qemu_*_page_mask is sign-extended even
|
||||
* when intptr_t is 32-bit and we are aligning a long long.
|
||||
*/
|
||||
|
|
@ -26,7 +29,7 @@ extern uintptr_t qemu_host_page_size;
|
|||
extern intptr_t qemu_host_page_mask;
|
||||
|
||||
#define HOST_PAGE_ALIGN(addr) ROUND_UP((addr), qemu_host_page_size)
|
||||
#define REAL_HOST_PAGE_ALIGN(addr) ROUND_UP((addr), qemu_real_host_page_size)
|
||||
#define REAL_HOST_PAGE_ALIGN(addr) ROUND_UP((addr), qemu_real_host_page_size())
|
||||
|
||||
/* The CPU list lock nests outside page_(un)lock or mmap_(un)lock */
|
||||
void qemu_init_cpu_list(void);
|
||||
|
|
@ -46,7 +49,7 @@ enum device_endian {
|
|||
DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
#if defined(HOST_WORDS_BIGENDIAN)
|
||||
#if HOST_BIG_ENDIAN
|
||||
#define DEVICE_HOST_ENDIAN DEVICE_BIG_ENDIAN
|
||||
#else
|
||||
#define DEVICE_HOST_ENDIAN DEVICE_LITTLE_ENDIAN
|
||||
|
|
|
|||
|
|
@ -377,7 +377,7 @@ static inline CPUTLBEntry *tlb_entry(CPUArchState *env, uintptr_t mmu_idx,
|
|||
|
||||
#endif /* defined(CONFIG_USER_ONLY) */
|
||||
|
||||
#ifdef TARGET_WORDS_BIGENDIAN
|
||||
#if TARGET_BIG_ENDIAN
|
||||
# define cpu_lduw_data cpu_lduw_be_data
|
||||
# define cpu_ldsw_data cpu_ldsw_be_data
|
||||
# define cpu_ldl_data cpu_ldl_be_data
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ static inline int gdb_get_reg128(GByteArray *buf, uint64_t val_hi,
|
|||
uint64_t val_lo)
|
||||
{
|
||||
uint64_t to_quad;
|
||||
#ifdef TARGET_WORDS_BIGENDIAN
|
||||
#if TARGET_BIG_ENDIAN
|
||||
to_quad = tswap64(val_hi);
|
||||
g_byte_array_append(buf, (uint8_t *) &to_quad, 8);
|
||||
to_quad = tswap64(val_lo);
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ typedef enum MemOp {
|
|||
MO_SIGN = 0x08, /* Sign-extended, otherwise zero-extended. */
|
||||
|
||||
MO_BSWAP = 0x10, /* Host reverse endian. */
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
MO_LE = MO_BSWAP,
|
||||
MO_BE = 0,
|
||||
#else
|
||||
|
|
@ -36,7 +36,7 @@ typedef enum MemOp {
|
|||
MO_BE = MO_BSWAP,
|
||||
#endif
|
||||
#ifdef NEED_CPU_H
|
||||
#ifdef TARGET_WORDS_BIGENDIAN
|
||||
#if TARGET_BIG_ENDIAN
|
||||
MO_TE = MO_BE,
|
||||
#else
|
||||
MO_TE = MO_LE,
|
||||
|
|
|
|||
|
|
@ -2931,7 +2931,7 @@ static inline MemOp devend_memop(enum device_endian end)
|
|||
QEMU_BUILD_BUG_ON(DEVICE_HOST_ENDIAN != DEVICE_LITTLE_ENDIAN &&
|
||||
DEVICE_HOST_ENDIAN != DEVICE_BIG_ENDIAN);
|
||||
|
||||
#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
|
||||
#if HOST_BIG_ENDIAN != TARGET_BIG_ENDIAN
|
||||
/* Swap if non-host endianness or native (target) endianness */
|
||||
return (end == DEVICE_HOST_ENDIAN) ? 0 : MO_BSWAP;
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -31,4 +31,22 @@ extern bool set_preferred_target_page_bits_common(int bits);
|
|||
extern void finalize_target_page_bits_common(int min);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* set_preferred_target_page_bits:
|
||||
* @bits: number of bits needed to represent an address within the page
|
||||
*
|
||||
* Set the preferred target page size (the actual target page
|
||||
* size may be smaller than any given CPU's preference).
|
||||
* Returns true on success, false on failure (which can only happen
|
||||
* if this is called after the system has already finalized its
|
||||
* choice of page size and the requested page size is smaller than that).
|
||||
*/
|
||||
bool set_preferred_target_page_bits(int bits);
|
||||
|
||||
/**
|
||||
* finalize_target_page_bits:
|
||||
* Commit the final value set by set_preferred_target_page_bits.
|
||||
*/
|
||||
void finalize_target_page_bits(void);
|
||||
|
||||
#endif /* EXEC_PAGE_VARY_H */
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
#pragma GCC poison TARGET_HAS_BFLT
|
||||
#pragma GCC poison TARGET_NAME
|
||||
#pragma GCC poison TARGET_SUPPORTS_MTTCG
|
||||
#pragma GCC poison TARGET_WORDS_BIGENDIAN
|
||||
#pragma GCC poison TARGET_BIG_ENDIAN
|
||||
#pragma GCC poison BSWAP_NEEDED
|
||||
|
||||
#pragma GCC poison TARGET_LONG_BITS
|
||||
|
|
|
|||
|
|
@ -343,7 +343,7 @@ static inline void cpu_physical_memory_set_dirty_lebitmap(unsigned long *bitmap,
|
|||
hwaddr addr;
|
||||
ram_addr_t ram_addr;
|
||||
unsigned long len = (pages + HOST_LONG_BITS - 1) / HOST_LONG_BITS;
|
||||
unsigned long hpratio = qemu_real_host_page_size / TARGET_PAGE_SIZE;
|
||||
unsigned long hpratio = qemu_real_host_page_size() / TARGET_PAGE_SIZE;
|
||||
unsigned long page = BIT_WORD(start >> TARGET_PAGE_BITS);
|
||||
|
||||
/* start address is aligned at the start of a word? */
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ typedef struct {
|
|||
#define make_floatx80(exp, mant) ((floatx80) { mant, exp })
|
||||
#define make_floatx80_init(exp, mant) { .low = mant, .high = exp }
|
||||
typedef struct {
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
uint64_t high, low;
|
||||
#else
|
||||
uint64_t low, high;
|
||||
|
|
|
|||
|
|
@ -145,6 +145,16 @@ qemu_g_test_slow(void)
|
|||
#define g_test_thorough() qemu_g_test_slow()
|
||||
#define g_test_quick() (!qemu_g_test_slow())
|
||||
|
||||
#if GLIB_CHECK_VERSION(2,62,0)
|
||||
static inline gchar *
|
||||
g_date_time_format_iso8601_compat(GDateTime *datetime)
|
||||
{
|
||||
return g_date_time_format_iso8601(datetime);
|
||||
}
|
||||
|
||||
#define g_date_time_format_iso8601 g_date_time_format_iso8601_compat
|
||||
#endif
|
||||
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -187,7 +187,7 @@ struct CPUClass {
|
|||
typedef union IcountDecr {
|
||||
uint32_t u32;
|
||||
struct {
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
uint16_t high;
|
||||
uint16_t low;
|
||||
#else
|
||||
|
|
@ -1028,13 +1028,15 @@ void cpu_exec_unrealizefn(CPUState *cpu);
|
|||
* target_words_bigendian:
|
||||
* Returns true if the (default) endianness of the target is big endian,
|
||||
* false otherwise. Note that in target-specific code, you can use
|
||||
* TARGET_WORDS_BIGENDIAN directly instead. On the other hand, common
|
||||
* TARGET_BIG_ENDIAN directly instead. On the other hand, common
|
||||
* code should normally never need to know about the endianness of the
|
||||
* target, so please do *not* use this function unless you know very well
|
||||
* what you are doing!
|
||||
*/
|
||||
bool target_words_bigendian(void);
|
||||
|
||||
void page_size_init(void);
|
||||
|
||||
#ifdef NEED_CPU_H
|
||||
|
||||
#ifdef CONFIG_SOFTMMU
|
||||
|
|
|
|||
|
|
@ -24,12 +24,17 @@
|
|||
#define HV_STATUS_INVALID_PORT_ID 17
|
||||
#define HV_STATUS_INVALID_CONNECTION_ID 18
|
||||
#define HV_STATUS_INSUFFICIENT_BUFFERS 19
|
||||
#define HV_STATUS_NOT_ACKNOWLEDGED 20
|
||||
#define HV_STATUS_NO_DATA 27
|
||||
|
||||
/*
|
||||
* Hypercall numbers
|
||||
*/
|
||||
#define HV_POST_MESSAGE 0x005c
|
||||
#define HV_SIGNAL_EVENT 0x005d
|
||||
#define HV_POST_DEBUG_DATA 0x0069
|
||||
#define HV_RETRIEVE_DEBUG_DATA 0x006a
|
||||
#define HV_RESET_DEBUG_SESSION 0x006b
|
||||
#define HV_HYPERCALL_FAST (1u << 16)
|
||||
|
||||
/*
|
||||
|
|
@ -127,4 +132,51 @@ struct hyperv_event_flags_page {
|
|||
struct hyperv_event_flags slot[HV_SINT_COUNT];
|
||||
};
|
||||
|
||||
/*
|
||||
* Kernel debugger structures
|
||||
*/
|
||||
|
||||
/* Options flags for hyperv_reset_debug_session */
|
||||
#define HV_DEBUG_PURGE_INCOMING_DATA 0x00000001
|
||||
#define HV_DEBUG_PURGE_OUTGOING_DATA 0x00000002
|
||||
struct hyperv_reset_debug_session_input {
|
||||
uint32_t options;
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
struct hyperv_reset_debug_session_output {
|
||||
uint32_t host_ip;
|
||||
uint32_t target_ip;
|
||||
uint16_t host_port;
|
||||
uint16_t target_port;
|
||||
uint8_t host_mac[6];
|
||||
uint8_t target_mac[6];
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
/* Options for hyperv_post_debug_data */
|
||||
#define HV_DEBUG_POST_LOOP 0x00000001
|
||||
|
||||
struct hyperv_post_debug_data_input {
|
||||
uint32_t count;
|
||||
uint32_t options;
|
||||
/*uint8_t data[HV_HYP_PAGE_SIZE - 2 * sizeof(uint32_t)];*/
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
struct hyperv_post_debug_data_output {
|
||||
uint32_t pending_count;
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
/* Options for hyperv_retrieve_debug_data */
|
||||
#define HV_DEBUG_RETRIEVE_LOOP 0x00000001
|
||||
#define HV_DEBUG_RETRIEVE_TEST_ACTIVITY 0x00000002
|
||||
|
||||
struct hyperv_retrieve_debug_data_input {
|
||||
uint32_t count;
|
||||
uint32_t options;
|
||||
uint64_t timeout;
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
struct hyperv_retrieve_debug_data_output {
|
||||
uint32_t retrieved_count;
|
||||
uint32_t remaining_count;
|
||||
} __attribute__ ((__packed__));
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -81,4 +81,62 @@ void hyperv_synic_update(CPUState *cs, bool enable,
|
|||
hwaddr msg_page_addr, hwaddr event_page_addr);
|
||||
bool hyperv_is_synic_enabled(void);
|
||||
|
||||
/*
|
||||
* Process HVCALL_RESET_DEBUG_SESSION hypercall.
|
||||
*/
|
||||
uint16_t hyperv_hcall_reset_dbg_session(uint64_t outgpa);
|
||||
/*
|
||||
* Process HVCALL_RETREIVE_DEBUG_DATA hypercall.
|
||||
*/
|
||||
uint16_t hyperv_hcall_retreive_dbg_data(uint64_t ingpa, uint64_t outgpa,
|
||||
bool fast);
|
||||
/*
|
||||
* Process HVCALL_POST_DEBUG_DATA hypercall.
|
||||
*/
|
||||
uint16_t hyperv_hcall_post_dbg_data(uint64_t ingpa, uint64_t outgpa, bool fast);
|
||||
|
||||
uint32_t hyperv_syndbg_send(uint64_t ingpa, uint32_t count);
|
||||
uint32_t hyperv_syndbg_recv(uint64_t ingpa, uint32_t count);
|
||||
void hyperv_syndbg_set_pending_page(uint64_t ingpa);
|
||||
uint64_t hyperv_syndbg_query_options(void);
|
||||
|
||||
typedef enum HvSynthDbgMsgType {
|
||||
HV_SYNDBG_MSG_CONNECTION_INFO,
|
||||
HV_SYNDBG_MSG_SEND,
|
||||
HV_SYNDBG_MSG_RECV,
|
||||
HV_SYNDBG_MSG_SET_PENDING_PAGE,
|
||||
HV_SYNDBG_MSG_QUERY_OPTIONS
|
||||
} HvDbgSynthMsgType;
|
||||
|
||||
typedef struct HvSynDbgMsg {
|
||||
HvDbgSynthMsgType type;
|
||||
union {
|
||||
struct {
|
||||
uint32_t host_ip;
|
||||
uint16_t host_port;
|
||||
} connection_info;
|
||||
struct {
|
||||
uint64_t buf_gpa;
|
||||
uint32_t count;
|
||||
uint32_t pending_count;
|
||||
bool is_raw;
|
||||
} send;
|
||||
struct {
|
||||
uint64_t buf_gpa;
|
||||
uint32_t count;
|
||||
uint32_t options;
|
||||
uint64_t timeout;
|
||||
uint32_t retrieved_count;
|
||||
bool is_raw;
|
||||
} recv;
|
||||
struct {
|
||||
uint64_t buf_gpa;
|
||||
} pending_page;
|
||||
struct {
|
||||
uint64_t options;
|
||||
} query_options;
|
||||
} u;
|
||||
} HvSynDbgMsg;
|
||||
typedef uint16_t (*HvSynDbgHandler)(void *context, HvSynDbgMsg *msg);
|
||||
void hyperv_set_syndbg_handler(HvSynDbgHandler handler, void *context);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ enum {
|
|||
/* Interrupt Remapping Table Entry Definition */
|
||||
union VTD_IR_TableEntry {
|
||||
struct {
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
uint32_t __reserved_1:8; /* Reserved 1 */
|
||||
uint32_t vector:8; /* Interrupt Vector */
|
||||
uint32_t irte_mode:1; /* IRTE Mode */
|
||||
|
|
@ -172,7 +172,7 @@ union VTD_IR_TableEntry {
|
|||
#endif
|
||||
uint32_t dest_id; /* Destination ID */
|
||||
uint16_t source_id; /* Source-ID */
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
uint64_t __reserved_2:44; /* Reserved 2 */
|
||||
uint64_t sid_vtype:2; /* Source-ID Validation Type */
|
||||
uint64_t sid_q:2; /* Source-ID Qualifier */
|
||||
|
|
@ -191,7 +191,7 @@ union VTD_IR_TableEntry {
|
|||
/* Programming format for MSI/MSI-X addresses */
|
||||
union VTD_IR_MSIAddress {
|
||||
struct {
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
uint32_t __head:12; /* Should always be: 0x0fee */
|
||||
uint32_t index_l:15; /* Interrupt index bit 14-0 */
|
||||
uint32_t int_mode:1; /* Interrupt format */
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ struct X86IOMMUIrq {
|
|||
struct X86IOMMU_MSIMessage {
|
||||
union {
|
||||
struct {
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
uint32_t __addr_head:12; /* 0xfee */
|
||||
uint32_t dest:8;
|
||||
uint32_t __reserved:8;
|
||||
|
|
@ -108,7 +108,7 @@ struct X86IOMMU_MSIMessage {
|
|||
};
|
||||
union {
|
||||
struct {
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
uint16_t trigger_mode:1;
|
||||
uint16_t level:1;
|
||||
uint16_t __resved:3;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
#include "cpu.h"
|
||||
|
||||
#define BIOS_SIZE (4 * MiB)
|
||||
#ifdef TARGET_WORDS_BIGENDIAN
|
||||
#if TARGET_BIG_ENDIAN
|
||||
#define BIOS_FILENAME "mips_bios.bin"
|
||||
#else
|
||||
#define BIOS_FILENAME "mipsel_bios.bin"
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ static inline bool virtio_access_is_big_endian(VirtIODevice *vdev)
|
|||
{
|
||||
#if defined(LEGACY_VIRTIO_IS_BIENDIAN)
|
||||
return virtio_is_big_endian(vdev);
|
||||
#elif defined(TARGET_WORDS_BIGENDIAN)
|
||||
#elif TARGET_BIG_ENDIAN
|
||||
if (virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1)) {
|
||||
/* Devices conforming to VIRTIO 1.0 or later are always LE. */
|
||||
return false;
|
||||
|
|
@ -149,7 +149,7 @@ static inline uint64_t virtio_ldq_p(VirtIODevice *vdev, const void *ptr)
|
|||
|
||||
static inline uint16_t virtio_tswap16(VirtIODevice *vdev, uint16_t s)
|
||||
{
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
return virtio_access_is_big_endian(vdev) ? s : bswap16(s);
|
||||
#else
|
||||
return virtio_access_is_big_endian(vdev) ? bswap16(s) : s;
|
||||
|
|
@ -215,7 +215,7 @@ static inline void virtio_tswap16s(VirtIODevice *vdev, uint16_t *s)
|
|||
|
||||
static inline uint32_t virtio_tswap32(VirtIODevice *vdev, uint32_t s)
|
||||
{
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
return virtio_access_is_big_endian(vdev) ? s : bswap32(s);
|
||||
#else
|
||||
return virtio_access_is_big_endian(vdev) ? bswap32(s) : s;
|
||||
|
|
@ -229,7 +229,7 @@ static inline void virtio_tswap32s(VirtIODevice *vdev, uint32_t *s)
|
|||
|
||||
static inline uint64_t virtio_tswap64(VirtIODevice *vdev, uint64_t s)
|
||||
{
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
return virtio_access_is_big_endian(vdev) ? s : bswap64(s);
|
||||
#else
|
||||
return virtio_access_is_big_endian(vdev) ? bswap64(s) : s;
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ virtio_gpu_ctrl_hdr_bswap(struct virtio_gpu_ctrl_hdr *hdr)
|
|||
static inline void
|
||||
virtio_gpu_bswap_32(void *ptr, size_t size)
|
||||
{
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
|
||||
size_t i;
|
||||
struct virtio_gpu_ctrl_hdr *hdr = (struct virtio_gpu_ctrl_hdr *) ptr;
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
02110-1301, USA. */
|
||||
|
||||
|
||||
#if defined(HOST_WORDS_BIGENDIAN)
|
||||
#if HOST_BIG_ENDIAN
|
||||
#define WORDS_BIGENDIAN 1
|
||||
#else
|
||||
#define WORDS_BIGENDIAN 0
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ struct tcp_hdr {
|
|||
u_short th_dport; /* destination port */
|
||||
uint32_t th_seq; /* sequence number */
|
||||
uint32_t th_ack; /* acknowledgment number */
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
u_char th_off : 4, /* data offset */
|
||||
th_x2:4; /* (unused) */
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -21,6 +21,10 @@ struct QBool {
|
|||
bool value;
|
||||
};
|
||||
|
||||
void qbool_unref(QBool *q);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(QBool, qbool_unref)
|
||||
|
||||
QBool *qbool_from_bool(bool value);
|
||||
bool qbool_get_bool(const QBool *qb);
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,10 @@ struct QDict {
|
|||
QLIST_HEAD(,QDictEntry) table[QDICT_BUCKET_MAX];
|
||||
};
|
||||
|
||||
void qdict_unref(QDict *q);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(QDict, qdict_unref)
|
||||
|
||||
/* Object API */
|
||||
QDict *qdict_new(void);
|
||||
const char *qdict_entry_key(const QDictEntry *entry);
|
||||
|
|
|
|||
|
|
@ -26,6 +26,10 @@ struct QList {
|
|||
QTAILQ_HEAD(,QListEntry) head;
|
||||
};
|
||||
|
||||
void qlist_unref(QList *q);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(QList, qlist_unref)
|
||||
|
||||
#define qlist_append(qlist, obj) \
|
||||
qlist_append_obj(qlist, QOBJECT(obj))
|
||||
|
||||
|
|
|
|||
|
|
@ -26,4 +26,8 @@ static inline QNull *qnull(void)
|
|||
return qobject_ref(&qnull_);
|
||||
}
|
||||
|
||||
void qnull_unref(QNull *q);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(QNull, qnull_unref)
|
||||
|
||||
#endif /* QNULL_H */
|
||||
|
|
|
|||
|
|
@ -54,6 +54,10 @@ struct QNum {
|
|||
} u;
|
||||
};
|
||||
|
||||
void qnum_unref(QNum *q);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(QNum, qnum_unref)
|
||||
|
||||
QNum *qnum_from_int(int64_t value);
|
||||
QNum *qnum_from_uint(uint64_t value);
|
||||
QNum *qnum_from_double(double value);
|
||||
|
|
|
|||
|
|
@ -20,6 +20,10 @@ struct QString {
|
|||
const char *string;
|
||||
};
|
||||
|
||||
void qstring_unref(QString *q);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(QString, qstring_unref)
|
||||
|
||||
QString *qstring_new(void);
|
||||
QString *qstring_from_str(const char *str);
|
||||
QString *qstring_from_substr(const char *str, size_t start, size_t end);
|
||||
|
|
|
|||
|
|
@ -1,17 +1,6 @@
|
|||
/*
|
||||
* This file is supposed to be included only by .c files. No header file should
|
||||
* depend on qemu-common.h, as this would easily lead to circular header
|
||||
* dependencies.
|
||||
*
|
||||
* If a header file uses a definition from qemu-common.h, that definition
|
||||
* must be moved to a separate header file, and the header that uses it
|
||||
* must include that header.
|
||||
*/
|
||||
#ifndef QEMU_COMMON_H
|
||||
#define QEMU_COMMON_H
|
||||
|
||||
#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
|
||||
|
||||
/* Copyright string for -version arguments, About dialogs, etc */
|
||||
#define QEMU_COPYRIGHT "Copyright (c) 2003-2022 " \
|
||||
"Fabrice Bellard and the QEMU Project developers"
|
||||
|
|
@ -26,92 +15,4 @@
|
|||
int qemu_main(int argc, char **argv, char **envp);
|
||||
#endif
|
||||
|
||||
ssize_t qemu_write_full(int fd, const void *buf, size_t count)
|
||||
G_GNUC_WARN_UNUSED_RESULT;
|
||||
|
||||
#ifndef _WIN32
|
||||
int qemu_pipe(int pipefd[2]);
|
||||
/* like openpty() but also makes it raw; return master fd */
|
||||
int qemu_openpty_raw(int *aslave, char *pty_name);
|
||||
#endif
|
||||
|
||||
void cpu_exec_init_all(void);
|
||||
void cpu_exec_step_atomic(CPUState *cpu);
|
||||
|
||||
/**
|
||||
* set_preferred_target_page_bits:
|
||||
* @bits: number of bits needed to represent an address within the page
|
||||
*
|
||||
* Set the preferred target page size (the actual target page
|
||||
* size may be smaller than any given CPU's preference).
|
||||
* Returns true on success, false on failure (which can only happen
|
||||
* if this is called after the system has already finalized its
|
||||
* choice of page size and the requested page size is smaller than that).
|
||||
*/
|
||||
bool set_preferred_target_page_bits(int bits);
|
||||
|
||||
/**
|
||||
* finalize_target_page_bits:
|
||||
* Commit the final value set by set_preferred_target_page_bits.
|
||||
*/
|
||||
void finalize_target_page_bits(void);
|
||||
|
||||
/**
|
||||
* Sends a (part of) iovec down a socket, yielding when the socket is full, or
|
||||
* Receives data into a (part of) iovec from a socket,
|
||||
* yielding when there is no data in the socket.
|
||||
* The same interface as qemu_sendv_recvv(), with added yielding.
|
||||
* XXX should mark these as coroutine_fn
|
||||
*/
|
||||
ssize_t qemu_co_sendv_recvv(int sockfd, struct iovec *iov, unsigned iov_cnt,
|
||||
size_t offset, size_t bytes, bool do_send);
|
||||
#define qemu_co_recvv(sockfd, iov, iov_cnt, offset, bytes) \
|
||||
qemu_co_sendv_recvv(sockfd, iov, iov_cnt, offset, bytes, false)
|
||||
#define qemu_co_sendv(sockfd, iov, iov_cnt, offset, bytes) \
|
||||
qemu_co_sendv_recvv(sockfd, iov, iov_cnt, offset, bytes, true)
|
||||
|
||||
/**
|
||||
* The same as above, but with just a single buffer
|
||||
*/
|
||||
ssize_t qemu_co_send_recv(int sockfd, void *buf, size_t bytes, bool do_send);
|
||||
#define qemu_co_recv(sockfd, buf, bytes) \
|
||||
qemu_co_send_recv(sockfd, buf, bytes, false)
|
||||
#define qemu_co_send(sockfd, buf, bytes) \
|
||||
qemu_co_send_recv(sockfd, buf, bytes, true)
|
||||
|
||||
void qemu_progress_init(int enabled, float min_skip);
|
||||
void qemu_progress_end(void);
|
||||
void qemu_progress_print(float delta, int max);
|
||||
const char *qemu_get_vm_name(void);
|
||||
|
||||
/* OS specific functions */
|
||||
void os_setup_early_signal_handling(void);
|
||||
int os_parse_cmd_args(int index, const char *optarg);
|
||||
|
||||
/*
|
||||
* Hexdump a line of a byte buffer into a hexadecimal/ASCII buffer
|
||||
*/
|
||||
#define QEMU_HEXDUMP_LINE_BYTES 16 /* Number of bytes to dump */
|
||||
#define QEMU_HEXDUMP_LINE_LEN 75 /* Number of characters in line */
|
||||
void qemu_hexdump_line(char *line, unsigned int b, const void *bufptr,
|
||||
unsigned int len, bool ascii);
|
||||
|
||||
/*
|
||||
* Hexdump a buffer to a file. An optional string prefix is added to every line
|
||||
*/
|
||||
|
||||
void qemu_hexdump(FILE *fp, const char *prefix,
|
||||
const void *bufptr, size_t size);
|
||||
|
||||
/*
|
||||
* helper to parse debug environment variables
|
||||
*/
|
||||
int parse_debug_env(const char *name, int max, int initial);
|
||||
|
||||
void page_size_init(void);
|
||||
|
||||
/* returns non-zero if dump is in progress, otherwise zero is
|
||||
* returned. */
|
||||
bool dump_in_progress(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -19,8 +19,6 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "fpu/softfloat-types.h"
|
||||
|
||||
#ifdef BSWAP_FROM_BYTESWAP
|
||||
static inline uint16_t bswap16(uint16_t x)
|
||||
{
|
||||
|
|
@ -84,7 +82,7 @@ static inline void bswap64s(uint64_t *s)
|
|||
*s = bswap64(*s);
|
||||
}
|
||||
|
||||
#if defined(HOST_WORDS_BIGENDIAN)
|
||||
#if HOST_BIG_ENDIAN
|
||||
#define be_bswap(v, size) (v)
|
||||
#define le_bswap(v, size) glue(bswap, size)(v)
|
||||
#define be_bswaps(v, size)
|
||||
|
|
@ -188,7 +186,7 @@ CPU_CONVERT(le, 64, uint64_t)
|
|||
* a compile-time constant if you pass in a constant. So this can be
|
||||
* used to initialize static variables.
|
||||
*/
|
||||
#if defined(HOST_WORDS_BIGENDIAN)
|
||||
#if HOST_BIG_ENDIAN
|
||||
# define const_le32(_x) \
|
||||
((((_x) & 0x000000ffU) << 24) | \
|
||||
(((_x) & 0x0000ff00U) << 8) | \
|
||||
|
|
@ -202,64 +200,6 @@ CPU_CONVERT(le, 64, uint64_t)
|
|||
# define const_le16(_x) (_x)
|
||||
#endif
|
||||
|
||||
/* Unions for reinterpreting between floats and integers. */
|
||||
|
||||
typedef union {
|
||||
float32 f;
|
||||
uint32_t l;
|
||||
} CPU_FloatU;
|
||||
|
||||
typedef union {
|
||||
float64 d;
|
||||
#if defined(HOST_WORDS_BIGENDIAN)
|
||||
struct {
|
||||
uint32_t upper;
|
||||
uint32_t lower;
|
||||
} l;
|
||||
#else
|
||||
struct {
|
||||
uint32_t lower;
|
||||
uint32_t upper;
|
||||
} l;
|
||||
#endif
|
||||
uint64_t ll;
|
||||
} CPU_DoubleU;
|
||||
|
||||
typedef union {
|
||||
floatx80 d;
|
||||
struct {
|
||||
uint64_t lower;
|
||||
uint16_t upper;
|
||||
} l;
|
||||
} CPU_LDoubleU;
|
||||
|
||||
typedef union {
|
||||
float128 q;
|
||||
#if defined(HOST_WORDS_BIGENDIAN)
|
||||
struct {
|
||||
uint32_t upmost;
|
||||
uint32_t upper;
|
||||
uint32_t lower;
|
||||
uint32_t lowest;
|
||||
} l;
|
||||
struct {
|
||||
uint64_t upper;
|
||||
uint64_t lower;
|
||||
} ll;
|
||||
#else
|
||||
struct {
|
||||
uint32_t lowest;
|
||||
uint32_t lower;
|
||||
uint32_t upper;
|
||||
uint32_t upmost;
|
||||
} l;
|
||||
struct {
|
||||
uint64_t lower;
|
||||
uint64_t upper;
|
||||
} ll;
|
||||
#endif
|
||||
} CPU_QuadU;
|
||||
|
||||
/* unaligned/endian-independent pointer access */
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -343,4 +343,27 @@ void qemu_coroutine_decrease_pool_batch_size(unsigned int additional_pool_size);
|
|||
|
||||
#include "qemu/lockable.h"
|
||||
|
||||
/**
|
||||
* Sends a (part of) iovec down a socket, yielding when the socket is full, or
|
||||
* Receives data into a (part of) iovec from a socket,
|
||||
* yielding when there is no data in the socket.
|
||||
* The same interface as qemu_sendv_recvv(), with added yielding.
|
||||
* XXX should mark these as coroutine_fn
|
||||
*/
|
||||
ssize_t qemu_co_sendv_recvv(int sockfd, struct iovec *iov, unsigned iov_cnt,
|
||||
size_t offset, size_t bytes, bool do_send);
|
||||
#define qemu_co_recvv(sockfd, iov, iov_cnt, offset, bytes) \
|
||||
qemu_co_sendv_recvv(sockfd, iov, iov_cnt, offset, bytes, false)
|
||||
#define qemu_co_sendv(sockfd, iov, iov_cnt, offset, bytes) \
|
||||
qemu_co_sendv_recvv(sockfd, iov, iov_cnt, offset, bytes, true)
|
||||
|
||||
/**
|
||||
* The same as above, but with just a single buffer
|
||||
*/
|
||||
ssize_t qemu_co_send_recv(int sockfd, void *buf, size_t bytes, bool do_send);
|
||||
#define qemu_co_recv(sockfd, buf, bytes) \
|
||||
qemu_co_send_recv(sockfd, buf, bytes, false)
|
||||
#define qemu_co_send(sockfd, buf, bytes) \
|
||||
qemu_co_send_recv(sockfd, buf, bytes, true)
|
||||
|
||||
#endif /* QEMU_COROUTINE_H */
|
||||
|
|
|
|||
64
include/qemu/cpu-float.h
Normal file
64
include/qemu/cpu-float.h
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
#ifndef QEMU_CPU_FLOAT_H_
|
||||
#define QEMU_CPU_FLOAT_H_
|
||||
|
||||
#include "fpu/softfloat-types.h"
|
||||
|
||||
/* Unions for reinterpreting between floats and integers. */
|
||||
|
||||
typedef union {
|
||||
float32 f;
|
||||
uint32_t l;
|
||||
} CPU_FloatU;
|
||||
|
||||
typedef union {
|
||||
float64 d;
|
||||
#if HOST_BIG_ENDIAN
|
||||
struct {
|
||||
uint32_t upper;
|
||||
uint32_t lower;
|
||||
} l;
|
||||
#else
|
||||
struct {
|
||||
uint32_t lower;
|
||||
uint32_t upper;
|
||||
} l;
|
||||
#endif
|
||||
uint64_t ll;
|
||||
} CPU_DoubleU;
|
||||
|
||||
typedef union {
|
||||
floatx80 d;
|
||||
struct {
|
||||
uint64_t lower;
|
||||
uint16_t upper;
|
||||
} l;
|
||||
} CPU_LDoubleU;
|
||||
|
||||
typedef union {
|
||||
float128 q;
|
||||
#if HOST_BIG_ENDIAN
|
||||
struct {
|
||||
uint32_t upmost;
|
||||
uint32_t upper;
|
||||
uint32_t lower;
|
||||
uint32_t lowest;
|
||||
} l;
|
||||
struct {
|
||||
uint64_t upper;
|
||||
uint64_t lower;
|
||||
} ll;
|
||||
#else
|
||||
struct {
|
||||
uint32_t lowest;
|
||||
uint32_t lower;
|
||||
uint32_t upper;
|
||||
uint32_t upmost;
|
||||
} l;
|
||||
struct {
|
||||
uint64_t lower;
|
||||
uint64_t upper;
|
||||
} ll;
|
||||
#endif
|
||||
} CPU_QuadU;
|
||||
|
||||
#endif /* QEMU_CPU_FLOAT_H_ */
|
||||
|
|
@ -131,7 +131,6 @@ const char *qemu_strchrnul(const char *s, int c);
|
|||
time_t mktimegm(struct tm *tm);
|
||||
int qemu_fdatasync(int fd);
|
||||
int qemu_msync(void *addr, size_t length, int fd);
|
||||
int fcntl_setfl(int fd, int flag);
|
||||
int qemu_parse_fd(const char *param);
|
||||
int qemu_strtoi(const char *nptr, const char **endptr, int base,
|
||||
int *result);
|
||||
|
|
@ -214,4 +213,24 @@ static inline const char *yes_no(bool b)
|
|||
return b ? "yes" : "no";
|
||||
}
|
||||
|
||||
/*
|
||||
* helper to parse debug environment variables
|
||||
*/
|
||||
int parse_debug_env(const char *name, int max, int initial);
|
||||
|
||||
/*
|
||||
* Hexdump a line of a byte buffer into a hexadecimal/ASCII buffer
|
||||
*/
|
||||
#define QEMU_HEXDUMP_LINE_BYTES 16 /* Number of bytes to dump */
|
||||
#define QEMU_HEXDUMP_LINE_LEN 75 /* Number of characters in line */
|
||||
void qemu_hexdump_line(char *line, unsigned int b, const void *bufptr,
|
||||
unsigned int len, bool ascii);
|
||||
|
||||
/*
|
||||
* Hexdump a buffer to a file. An optional string prefix is added to every line
|
||||
*/
|
||||
|
||||
void qemu_hexdump(FILE *fp, const char *prefix,
|
||||
const void *bufptr, size_t size);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ static inline uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
|
|||
union {
|
||||
uint64_t ll;
|
||||
struct {
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
uint32_t high, low;
|
||||
#else
|
||||
uint32_t low, high;
|
||||
|
|
|
|||
|
|
@ -205,7 +205,7 @@ typedef struct Int128 Int128;
|
|||
* a union with other integer types).
|
||||
*/
|
||||
struct Int128 {
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
int64_t hi;
|
||||
uint64_t lo;
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -34,6 +34,18 @@
|
|||
#include "exec/poison.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* HOST_WORDS_BIGENDIAN was replaced with HOST_BIG_ENDIAN. Prevent it from
|
||||
* creeping back in.
|
||||
*/
|
||||
#pragma GCC poison HOST_WORDS_BIGENDIAN
|
||||
|
||||
/*
|
||||
* TARGET_WORDS_BIGENDIAN was replaced with TARGET_BIG_ENDIAN. Prevent it from
|
||||
* creeping back in.
|
||||
*/
|
||||
#pragma GCC poison TARGET_WORDS_BIGENDIAN
|
||||
|
||||
#include "qemu/compiler.h"
|
||||
|
||||
/* Older versions of C++ don't get definitions of various macros from
|
||||
|
|
@ -214,6 +226,8 @@ extern "C" {
|
|||
#define ESHUTDOWN 4099
|
||||
#endif
|
||||
|
||||
#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR)
|
||||
|
||||
/* time_t may be either 32 or 64 bits depending on the host OS, and
|
||||
* can be either signed or unsigned, so we can't just hardcode a
|
||||
* specific maximum value. This is not a C preprocessor constant,
|
||||
|
|
@ -419,9 +433,9 @@ extern int madvise(char *, size_t, int);
|
|||
/* Use 1 MiB (segment size) alignment so gmap can be used by KVM. */
|
||||
# define QEMU_VMALLOC_ALIGN (256 * 4096)
|
||||
#elif defined(__linux__) && defined(__sparc__)
|
||||
# define QEMU_VMALLOC_ALIGN MAX(qemu_real_host_page_size, SHMLBA)
|
||||
# define QEMU_VMALLOC_ALIGN MAX(qemu_real_host_page_size(), SHMLBA)
|
||||
#else
|
||||
# define QEMU_VMALLOC_ALIGN qemu_real_host_page_size
|
||||
# define QEMU_VMALLOC_ALIGN qemu_real_host_page_size()
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_POSIX
|
||||
|
|
@ -513,6 +527,13 @@ static inline void qemu_timersub(const struct timeval *val1,
|
|||
#define qemu_timersub timersub
|
||||
#endif
|
||||
|
||||
ssize_t qemu_write_full(int fd, const void *buf, size_t count)
|
||||
G_GNUC_WARN_UNUSED_RESULT;
|
||||
|
||||
#ifndef _WIN32
|
||||
int qemu_pipe(int pipefd[2]);
|
||||
#endif
|
||||
|
||||
void qemu_set_cloexec(int fd);
|
||||
|
||||
void fips_set_state(bool requested);
|
||||
|
|
@ -578,8 +599,15 @@ pid_t qemu_fork(Error **errp);
|
|||
/* Using intptr_t ensures that qemu_*_page_mask is sign-extended even
|
||||
* when intptr_t is 32-bit and we are aligning a long long.
|
||||
*/
|
||||
extern uintptr_t qemu_real_host_page_size;
|
||||
extern intptr_t qemu_real_host_page_mask;
|
||||
static inline uintptr_t qemu_real_host_page_size(void)
|
||||
{
|
||||
return getpagesize();
|
||||
}
|
||||
|
||||
static inline intptr_t qemu_real_host_page_mask(void)
|
||||
{
|
||||
return -(intptr_t)qemu_real_host_page_size();
|
||||
}
|
||||
|
||||
/*
|
||||
* After using getopt or getopt_long, if you need to parse another set
|
||||
|
|
|
|||
8
include/qemu/qemu-progress.h
Normal file
8
include/qemu/qemu-progress.h
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#ifndef QEMU_PROGRESS_H
|
||||
#define QEMU_PROGRESS_H
|
||||
|
||||
void qemu_progress_init(int enabled, float min_skip);
|
||||
void qemu_progress_end(void);
|
||||
void qemu_progress_print(float delta, int max);
|
||||
|
||||
#endif /* QEMU_PROGRESS_H */
|
||||
|
|
@ -27,14 +27,9 @@ struct QemuCond {
|
|||
};
|
||||
|
||||
struct QemuSemaphore {
|
||||
#ifndef CONFIG_SEM_TIMEDWAIT
|
||||
pthread_mutex_t lock;
|
||||
pthread_cond_t cond;
|
||||
QemuMutex mutex;
|
||||
QemuCond cond;
|
||||
unsigned int count;
|
||||
#else
|
||||
sem_t sem;
|
||||
#endif
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
struct QemuEvent {
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ struct AccelOpsClass {
|
|||
void (*synchronize_post_init)(CPUState *cpu);
|
||||
void (*synchronize_state)(CPUState *cpu);
|
||||
void (*synchronize_pre_loadvm)(CPUState *cpu);
|
||||
void (*synchronize_pre_resume)(bool step_pending);
|
||||
|
||||
void (*handle_interrupt)(CPUState *cpu, int mask);
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,9 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
int os_parse_cmd_args(int index, const char *optarg);
|
||||
void os_set_line_buffering(void);
|
||||
void os_setup_early_signal_handling(void);
|
||||
void os_set_proc_name(const char *s);
|
||||
void os_setup_signal_handling(void);
|
||||
void os_daemonize(void);
|
||||
|
|
@ -52,9 +54,6 @@ int os_mlock(void);
|
|||
#define closesocket(s) close(s)
|
||||
#define ioctlsocket(s, r, v) ioctl(s, r, v)
|
||||
|
||||
typedef struct timeval qemu_timeval;
|
||||
#define qemu_gettimeofday(tp) gettimeofday(tp, NULL)
|
||||
|
||||
int os_set_daemonize(bool d);
|
||||
bool is_daemonized(void);
|
||||
|
||||
|
|
@ -97,6 +96,8 @@ static inline void qemu_funlockfile(FILE *f)
|
|||
funlockfile(f);
|
||||
}
|
||||
|
||||
int fcntl_setfl(int fd, int flag);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -62,8 +62,10 @@ struct tm *localtime_r(const time_t *timep, struct tm *result);
|
|||
static inline void os_setup_signal_handling(void) {}
|
||||
static inline void os_daemonize(void) {}
|
||||
static inline void os_setup_post(void) {}
|
||||
void os_set_line_buffering(void);
|
||||
static inline void os_set_proc_name(const char *dummy) {}
|
||||
static inline int os_parse_cmd_args(int index, const char *optarg) { return -1; }
|
||||
void os_set_line_buffering(void);
|
||||
void os_setup_early_signal_handling(void);
|
||||
|
||||
int getpagesize(void);
|
||||
|
||||
|
|
@ -71,12 +73,6 @@ int getpagesize(void);
|
|||
# define EPROTONOSUPPORT EINVAL
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
long tv_sec;
|
||||
long tv_usec;
|
||||
} qemu_timeval;
|
||||
int qemu_gettimeofday(qemu_timeval *tp);
|
||||
|
||||
static inline int os_set_daemonize(bool d)
|
||||
{
|
||||
if (d) {
|
||||
|
|
|
|||
|
|
@ -34,7 +34,13 @@ static inline bool shutdown_caused_by_guest(ShutdownCause cause)
|
|||
}
|
||||
|
||||
void vm_start(void);
|
||||
int vm_prepare_start(void);
|
||||
|
||||
/**
|
||||
* vm_prepare_start: Prepare for starting/resuming the VM
|
||||
*
|
||||
* @step_pending: whether any of the CPUs is about to be single-stepped by gdb
|
||||
*/
|
||||
int vm_prepare_start(bool step_pending);
|
||||
int vm_stop(RunState state);
|
||||
int vm_stop_force_state(RunState state);
|
||||
int vm_shutdown(void);
|
||||
|
|
@ -69,6 +75,7 @@ void qemu_system_killed(int signal, pid_t pid);
|
|||
void qemu_system_reset(ShutdownCause reason);
|
||||
void qemu_system_guest_panicked(GuestPanicInformation *info);
|
||||
void qemu_system_guest_crashloaded(GuestPanicInformation *info);
|
||||
bool qemu_system_dump_in_progress(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ extern const char *qemu_name;
|
|||
extern QemuUUID qemu_uuid;
|
||||
extern bool qemu_uuid_set;
|
||||
|
||||
const char *qemu_get_vm_name(void);
|
||||
|
||||
void qemu_add_exit_notifier(Notifier *notify);
|
||||
void qemu_remove_exit_notifier(Notifier *notify);
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
* feeding libjpeg / libpng and writing screenshots.
|
||||
*/
|
||||
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
#if HOST_BIG_ENDIAN
|
||||
# define PIXMAN_BE_r8g8b8 PIXMAN_r8g8b8
|
||||
# define PIXMAN_BE_x8r8g8b8 PIXMAN_x8r8g8b8
|
||||
# define PIXMAN_BE_a8r8g8b8 PIXMAN_a8r8g8b8
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue