mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging
* Miscellaneous fixes and feature enablement (many) * SEV refactoring (David) * Hyper-V initial support (Jon) * i386 TCG fixes (x87 and SSE, Joseph) * vmport cleanup and improvements (Philippe, Liran) * Use-after-free with vCPU hot-unplug (Nengyuan) * run-coverity-scan improvements (myself) * Record/replay fixes (Pavel) * -machine kernel_irqchip=split improvements for INTx (Peter) * Code cleanups (Philippe) * Crash and security fixes (PJP) * HVF cleanups (Roman) # gpg: Signature made Fri 12 Jun 2020 16:57:04 BST # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full] # 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 * remotes/bonzini/tags/for-upstream: (116 commits) target/i386: Remove obsolete TODO file stubs: move Xen stubs to accel/ replay: fix replay shutdown for console mode exec/cpu-common: Move MUSB specific typedefs to 'hw/usb/hcd-musb.h' hw/usb: Move device-specific declarations to new 'hcd-musb.h' header exec/memory: Remove unused MemoryRegionMmio type checkpatch: reversed logic with acpi test checks target/i386: sev: Unify SEVState and SevGuestState target/i386: sev: Remove redundant handle field target/i386: sev: Remove redundant policy field target/i386: sev: Remove redundant cbitpos and reduced_phys_bits fields target/i386: sev: Partial cleanup to sev_state global target/i386: sev: Embed SEVState in SevGuestState target/i386: sev: Rename QSevGuestInfo target/i386: sev: Move local structure definitions into .c file target/i386: sev: Remove unused QSevGuestInfoClass xen: fix build without pci passthrough i386: hvf: Drop HVFX86EmulatorState i386: hvf: Move mmio_buf into CPUX86State i386: hvf: Move lazy_flags into CPUX86State ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org> # Conflicts: # hw/i386/acpi-build.c
This commit is contained in:
@@ -440,6 +440,7 @@ M: Paul Durrant <paul@xen.org>
|
||||
L: xen-devel@lists.xenproject.org
|
||||
S: Supported
|
||||
F: */xen*
|
||||
F: accel/xen/*
|
||||
F: hw/9pfs/xen-9p*
|
||||
F: hw/char/xen_console.c
|
||||
F: hw/display/xenfb.c
|
||||
@@ -453,6 +454,7 @@ F: hw/i386/xen/
|
||||
F: hw/pci-host/xen_igd_pt.c
|
||||
F: include/hw/block/dataplane/xen*
|
||||
F: include/hw/xen/
|
||||
F: include/sysemu/xen.h
|
||||
F: include/sysemu/xen-mapcache.h
|
||||
|
||||
Guest CPU Cores (HAXM)
|
||||
|
||||
@@ -336,9 +336,9 @@ $(call set-vpath, $(SRC_PATH))
|
||||
LIBS+=-lz $(LIBS_TOOLS)
|
||||
|
||||
vhost-user-json-y =
|
||||
HELPERS-y =
|
||||
HELPERS-y = $(HELPERS)
|
||||
|
||||
HELPERS-$(call land,$(CONFIG_SOFTMMU),$(CONFIG_LINUX)) = qemu-bridge-helper$(EXESUF)
|
||||
HELPERS-$(call land,$(CONFIG_SOFTMMU),$(CONFIG_LINUX)) += qemu-bridge-helper$(EXESUF)
|
||||
|
||||
ifeq ($(CONFIG_LINUX)$(CONFIG_VIRGL)$(CONFIG_GBM)$(CONFIG_TOOLS),yyyy)
|
||||
HELPERS-y += vhost-user-gpu$(EXESUF)
|
||||
@@ -1258,6 +1258,11 @@ endif
|
||||
$(call print-help-run,$(t)/fuzz,Build fuzzer for $(t)); \
|
||||
))) \
|
||||
echo '')
|
||||
@$(if $(HELPERS-y), \
|
||||
echo 'Helper targets:'; \
|
||||
$(foreach t, $(HELPERS-y), \
|
||||
$(call print-help-run,$(t),Build $(shell basename $(t)));) \
|
||||
echo '')
|
||||
@$(if $(TOOLS), \
|
||||
echo 'Tools targets:'; \
|
||||
$(foreach t, $(TOOLS), \
|
||||
|
||||
@@ -150,6 +150,7 @@ trace-events-subdirs += hw/block/dataplane
|
||||
trace-events-subdirs += hw/char
|
||||
trace-events-subdirs += hw/dma
|
||||
trace-events-subdirs += hw/hppa
|
||||
trace-events-subdirs += hw/hyperv
|
||||
trace-events-subdirs += hw/i2c
|
||||
trace-events-subdirs += hw/i386
|
||||
trace-events-subdirs += hw/i386/xen
|
||||
|
||||
@@ -2,4 +2,5 @@ common-obj-$(CONFIG_SOFTMMU) += accel.o
|
||||
obj-$(call land,$(CONFIG_SOFTMMU),$(CONFIG_POSIX)) += qtest.o
|
||||
obj-$(CONFIG_KVM) += kvm/
|
||||
obj-$(CONFIG_TCG) += tcg/
|
||||
obj-$(CONFIG_XEN) += xen/
|
||||
obj-y += stubs/
|
||||
|
||||
+87
-8
@@ -160,9 +160,59 @@ static const KVMCapabilityInfo kvm_required_capabilites[] = {
|
||||
static NotifierList kvm_irqchip_change_notifiers =
|
||||
NOTIFIER_LIST_INITIALIZER(kvm_irqchip_change_notifiers);
|
||||
|
||||
struct KVMResampleFd {
|
||||
int gsi;
|
||||
EventNotifier *resample_event;
|
||||
QLIST_ENTRY(KVMResampleFd) node;
|
||||
};
|
||||
typedef struct KVMResampleFd KVMResampleFd;
|
||||
|
||||
/*
|
||||
* Only used with split irqchip where we need to do the resample fd
|
||||
* kick for the kernel from userspace.
|
||||
*/
|
||||
static QLIST_HEAD(, KVMResampleFd) kvm_resample_fd_list =
|
||||
QLIST_HEAD_INITIALIZER(kvm_resample_fd_list);
|
||||
|
||||
#define kvm_slots_lock(kml) qemu_mutex_lock(&(kml)->slots_lock)
|
||||
#define kvm_slots_unlock(kml) qemu_mutex_unlock(&(kml)->slots_lock)
|
||||
|
||||
static inline void kvm_resample_fd_remove(int gsi)
|
||||
{
|
||||
KVMResampleFd *rfd;
|
||||
|
||||
QLIST_FOREACH(rfd, &kvm_resample_fd_list, node) {
|
||||
if (rfd->gsi == gsi) {
|
||||
QLIST_REMOVE(rfd, node);
|
||||
g_free(rfd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline void kvm_resample_fd_insert(int gsi, EventNotifier *event)
|
||||
{
|
||||
KVMResampleFd *rfd = g_new0(KVMResampleFd, 1);
|
||||
|
||||
rfd->gsi = gsi;
|
||||
rfd->resample_event = event;
|
||||
|
||||
QLIST_INSERT_HEAD(&kvm_resample_fd_list, rfd, node);
|
||||
}
|
||||
|
||||
void kvm_resample_fd_notify(int gsi)
|
||||
{
|
||||
KVMResampleFd *rfd;
|
||||
|
||||
QLIST_FOREACH(rfd, &kvm_resample_fd_list, node) {
|
||||
if (rfd->gsi == gsi) {
|
||||
event_notifier_set(rfd->resample_event);
|
||||
trace_kvm_resample_fd_notify(gsi);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int kvm_get_max_memslots(void)
|
||||
{
|
||||
KVMState *s = KVM_STATE(current_accel());
|
||||
@@ -1662,9 +1712,13 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
|
||||
return kvm_update_routing_entry(s, &kroute);
|
||||
}
|
||||
|
||||
static int kvm_irqchip_assign_irqfd(KVMState *s, int fd, int rfd, int virq,
|
||||
static int kvm_irqchip_assign_irqfd(KVMState *s, EventNotifier *event,
|
||||
EventNotifier *resample, int virq,
|
||||
bool assign)
|
||||
{
|
||||
int fd = event_notifier_get_fd(event);
|
||||
int rfd = resample ? event_notifier_get_fd(resample) : -1;
|
||||
|
||||
struct kvm_irqfd irqfd = {
|
||||
.fd = fd,
|
||||
.gsi = virq,
|
||||
@@ -1672,8 +1726,33 @@ static int kvm_irqchip_assign_irqfd(KVMState *s, int fd, int rfd, int virq,
|
||||
};
|
||||
|
||||
if (rfd != -1) {
|
||||
irqfd.flags |= KVM_IRQFD_FLAG_RESAMPLE;
|
||||
irqfd.resamplefd = rfd;
|
||||
assert(assign);
|
||||
if (kvm_irqchip_is_split()) {
|
||||
/*
|
||||
* When the slow irqchip (e.g. IOAPIC) is in the
|
||||
* userspace, KVM kernel resamplefd will not work because
|
||||
* the EOI of the interrupt will be delivered to userspace
|
||||
* instead, so the KVM kernel resamplefd kick will be
|
||||
* skipped. The userspace here mimics what the kernel
|
||||
* provides with resamplefd, remember the resamplefd and
|
||||
* kick it when we receive EOI of this IRQ.
|
||||
*
|
||||
* This is hackery because IOAPIC is mostly bypassed
|
||||
* (except EOI broadcasts) when irqfd is used. However
|
||||
* this can bring much performance back for split irqchip
|
||||
* with INTx IRQs (for VFIO, this gives 93% perf of the
|
||||
* full fast path, which is 46% perf boost comparing to
|
||||
* the INTx slow path).
|
||||
*/
|
||||
kvm_resample_fd_insert(virq, resample);
|
||||
} else {
|
||||
irqfd.flags |= KVM_IRQFD_FLAG_RESAMPLE;
|
||||
irqfd.resamplefd = rfd;
|
||||
}
|
||||
} else if (!assign) {
|
||||
if (kvm_irqchip_is_split()) {
|
||||
kvm_resample_fd_remove(virq);
|
||||
}
|
||||
}
|
||||
|
||||
if (!kvm_irqfds_enabled()) {
|
||||
@@ -1769,7 +1848,9 @@ int kvm_irqchip_add_hv_sint_route(KVMState *s, uint32_t vcpu, uint32_t sint)
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static int kvm_irqchip_assign_irqfd(KVMState *s, int fd, int virq, bool assign)
|
||||
static int kvm_irqchip_assign_irqfd(KVMState *s, EventNotifier *event,
|
||||
EventNotifier *resample, int virq,
|
||||
bool assign)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
@@ -1783,15 +1864,13 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg)
|
||||
int kvm_irqchip_add_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
|
||||
EventNotifier *rn, int virq)
|
||||
{
|
||||
return kvm_irqchip_assign_irqfd(s, event_notifier_get_fd(n),
|
||||
rn ? event_notifier_get_fd(rn) : -1, virq, true);
|
||||
return kvm_irqchip_assign_irqfd(s, n, rn, virq, true);
|
||||
}
|
||||
|
||||
int kvm_irqchip_remove_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
|
||||
int virq)
|
||||
{
|
||||
return kvm_irqchip_assign_irqfd(s, event_notifier_get_fd(n), -1, virq,
|
||||
false);
|
||||
return kvm_irqchip_assign_irqfd(s, n, NULL, virq, false);
|
||||
}
|
||||
|
||||
int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
|
||||
|
||||
@@ -16,4 +16,5 @@ kvm_set_ioeventfd_mmio(int fd, uint64_t addr, uint32_t val, bool assign, uint32_
|
||||
kvm_set_ioeventfd_pio(int fd, uint16_t addr, uint32_t val, bool assign, uint32_t size, bool datamatch) "fd: %d @0x%x val=0x%x assign: %d size: %d match: %d"
|
||||
kvm_set_user_memory(uint32_t slot, uint32_t flags, uint64_t guest_phys_addr, uint64_t memory_size, uint64_t userspace_addr, int ret) "Slot#%d flags=0x%x gpa=0x%"PRIx64 " size=0x%"PRIx64 " ua=0x%"PRIx64 " ret=%d"
|
||||
kvm_clear_dirty_log(uint32_t slot, uint64_t start, uint32_t size) "slot#%"PRId32" start 0x%"PRIx64" size 0x%"PRIx32
|
||||
kvm_resample_fd_notify(int gsi) "gsi %d"
|
||||
|
||||
|
||||
@@ -3,3 +3,4 @@ obj-$(call lnot,$(CONFIG_HVF)) += hvf-stub.o
|
||||
obj-$(call lnot,$(CONFIG_WHPX)) += whpx-stub.o
|
||||
obj-$(call lnot,$(CONFIG_KVM)) += kvm-stub.o
|
||||
obj-$(call lnot,$(CONFIG_TCG)) += tcg-stub.o
|
||||
obj-$(call lnot,$(CONFIG_XEN)) += xen-stub.o
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Citrix Ltd.
|
||||
* Copyright (C) 2014 Citrix Systems UK Ltd.
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2. See
|
||||
* the COPYING file in the top-level directory.
|
||||
*
|
||||
* Contributions after 2012-01-13 are licensed under the terms of the
|
||||
* GNU GPL, version 2 or (at your option) any later version.
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/xen/xen.h"
|
||||
#include "exec/memory.h"
|
||||
#include "qapi/qapi-commands-misc.h"
|
||||
|
||||
void xenstore_store_pv_console_info(int i, Chardev *chr)
|
||||
{
|
||||
}
|
||||
|
||||
int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
|
||||
{
|
||||
return -1;
|
||||
@@ -35,11 +35,6 @@ int xen_is_pirq_msi(uint32_t msi_data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr,
|
||||
Error **errp)
|
||||
{
|
||||
}
|
||||
|
||||
qemu_irq *xen_interrupt_controller_init(void)
|
||||
{
|
||||
return NULL;
|
||||
@@ -49,10 +44,6 @@ void xen_register_framebuffer(MemoryRegion *mr)
|
||||
{
|
||||
}
|
||||
|
||||
void xen_hvm_modified_memory(ram_addr_t start, ram_addr_t length)
|
||||
{
|
||||
}
|
||||
|
||||
void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory)
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
obj-y += xen-all.o
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "hw/xen/xen_pt.h"
|
||||
#include "chardev/char.h"
|
||||
#include "sysemu/accel.h"
|
||||
#include "sysemu/xen.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "migration/misc.h"
|
||||
#include "migration/global_state.h"
|
||||
@@ -31,6 +32,13 @@
|
||||
do { } while (0)
|
||||
#endif
|
||||
|
||||
static bool xen_allowed;
|
||||
|
||||
bool xen_enabled(void)
|
||||
{
|
||||
return xen_allowed;
|
||||
}
|
||||
|
||||
xc_interface *xen_xc;
|
||||
xenforeignmemory_handle *xen_fmem;
|
||||
xendevicemodel_handle *xen_dmod;
|
||||
@@ -129,12 +137,12 @@ static void xen_change_state_handler(void *opaque, int running,
|
||||
|
||||
static bool xen_get_igd_gfx_passthru(Object *obj, Error **errp)
|
||||
{
|
||||
return has_igd_gfx_passthru;
|
||||
return xen_igd_gfx_pt_enabled();
|
||||
}
|
||||
|
||||
static void xen_set_igd_gfx_passthru(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
has_igd_gfx_passthru = value;
|
||||
xen_igd_gfx_pt_set(value, errp);
|
||||
}
|
||||
|
||||
static void xen_setup_post(MachineState *ms, AccelState *accel)
|
||||
@@ -551,7 +551,9 @@ static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len)
|
||||
|
||||
qio_channel_set_blocking(s->ioc, true, NULL);
|
||||
size = tcp_chr_recv(chr, (void *) buf, len);
|
||||
qio_channel_set_blocking(s->ioc, false, NULL);
|
||||
if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) {
|
||||
qio_channel_set_blocking(s->ioc, false, NULL);
|
||||
}
|
||||
if (size == 0) {
|
||||
/* connection closed */
|
||||
tcp_chr_disconnect(chr);
|
||||
|
||||
@@ -4587,7 +4587,13 @@ fi
|
||||
if test "$tcmalloc" = "yes" ; then
|
||||
cat > $TMPC << EOF
|
||||
#include <stdlib.h>
|
||||
int main(void) { malloc(1); return 0; }
|
||||
int main(void) {
|
||||
void *tmp = malloc(1);
|
||||
if (tmp != NULL) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
EOF
|
||||
|
||||
if compile_prog "" "-ltcmalloc" ; then
|
||||
@@ -4603,7 +4609,13 @@ fi
|
||||
if test "$jemalloc" = "yes" ; then
|
||||
cat > $TMPC << EOF
|
||||
#include <stdlib.h>
|
||||
int main(void) { malloc(1); return 0; }
|
||||
int main(void) {
|
||||
void *tmp = malloc(1);
|
||||
if (tmp != NULL) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
EOF
|
||||
|
||||
if compile_prog "" "-ljemalloc" ; then
|
||||
@@ -6164,7 +6176,9 @@ if test "$sanitizers" = "yes" ; then
|
||||
#include <stdlib.h>
|
||||
int main(void) {
|
||||
void *tmp = malloc(10);
|
||||
return *(int *)(tmp + 2);
|
||||
if (tmp != NULL) {
|
||||
return *(int *)(tmp + 2);
|
||||
}
|
||||
}
|
||||
EOF
|
||||
if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
|
||||
@@ -6394,7 +6408,7 @@ if test "$softmmu" = yes ; then
|
||||
if test "$linux" = yes; then
|
||||
if test "$virtfs" != no && test "$cap_ng" = yes && test "$attr" = yes ; then
|
||||
virtfs=yes
|
||||
tools="$tools fsdev/virtfs-proxy-helper\$(EXESUF)"
|
||||
helpers="$helpers fsdev/virtfs-proxy-helper\$(EXESUF)"
|
||||
else
|
||||
if test "$virtfs" = yes; then
|
||||
error_exit "VirtFS requires libcap-ng devel and libattr devel"
|
||||
@@ -6409,7 +6423,7 @@ if test "$softmmu" = yes ; then
|
||||
fi
|
||||
mpath=no
|
||||
fi
|
||||
tools="$tools scsi/qemu-pr-helper\$(EXESUF)"
|
||||
helpers="$helpers scsi/qemu-pr-helper\$(EXESUF)"
|
||||
else
|
||||
if test "$virtfs" = yes; then
|
||||
error_exit "VirtFS is supported only on Linux"
|
||||
@@ -7654,6 +7668,7 @@ else
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
|
||||
fi
|
||||
|
||||
echo "HELPERS=$helpers" >> $config_host_mak
|
||||
echo "TOOLS=$tools" >> $config_host_mak
|
||||
echo "ROMS=$roms" >> $config_host_mak
|
||||
echo "MAKE=$make" >> $config_host_mak
|
||||
|
||||
@@ -379,7 +379,8 @@ static void icount_adjust(void)
|
||||
|
||||
seqlock_write_lock(&timers_state.vm_clock_seqlock,
|
||||
&timers_state.vm_clock_lock);
|
||||
cur_time = cpu_get_clock_locked();
|
||||
cur_time = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT,
|
||||
cpu_get_clock_locked());
|
||||
cur_icount = cpu_get_icount_locked();
|
||||
|
||||
delta = cur_icount - cur_time;
|
||||
@@ -647,6 +648,11 @@ static bool adjust_timers_state_needed(void *opaque)
|
||||
return s->icount_rt_timer != NULL;
|
||||
}
|
||||
|
||||
static bool shift_state_needed(void *opaque)
|
||||
{
|
||||
return use_icount == 2;
|
||||
}
|
||||
|
||||
/*
|
||||
* Subsection for warp timer migration is optional, because may not be created
|
||||
*/
|
||||
@@ -674,6 +680,17 @@ static const VMStateDescription icount_vmstate_adjust_timers = {
|
||||
}
|
||||
};
|
||||
|
||||
static const VMStateDescription icount_vmstate_shift = {
|
||||
.name = "timer/icount/shift",
|
||||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.needed = shift_state_needed,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_INT16(icount_time_shift, TimersState),
|
||||
VMSTATE_END_OF_LIST()
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
* This is a subsection for icount migration.
|
||||
*/
|
||||
@@ -690,6 +707,7 @@ static const VMStateDescription icount_vmstate_timers = {
|
||||
.subsections = (const VMStateDescription*[]) {
|
||||
&icount_vmstate_warp_timer,
|
||||
&icount_vmstate_adjust_timers,
|
||||
&icount_vmstate_shift,
|
||||
NULL
|
||||
}
|
||||
};
|
||||
@@ -803,8 +821,10 @@ void configure_icount(QemuOpts *opts, Error **errp)
|
||||
bool align = qemu_opt_get_bool(opts, "align", false);
|
||||
long time_shift = -1;
|
||||
|
||||
if (!option && qemu_opt_get(opts, "align")) {
|
||||
error_setg(errp, "Please specify shift option when using align");
|
||||
if (!option) {
|
||||
if (qemu_opt_get(opts, "align") != NULL) {
|
||||
error_setg(errp, "Please specify shift option when using align");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,9 +39,11 @@ target_read_memory (bfd_vma memaddr,
|
||||
struct disassemble_info *info)
|
||||
{
|
||||
CPUDebug *s = container_of(info, CPUDebug, info);
|
||||
int r;
|
||||
|
||||
cpu_memory_rw_debug(s->cpu, memaddr, myaddr, length, 0);
|
||||
return 0;
|
||||
r = cpu_memory_rw_debug(s->cpu, memaddr, myaddr, length, 0);
|
||||
|
||||
return r ? EIO : 0;
|
||||
}
|
||||
|
||||
/* Print an error message. We can assume that this is in response to
|
||||
@@ -718,10 +720,11 @@ physical_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length,
|
||||
struct disassemble_info *info)
|
||||
{
|
||||
CPUDebug *s = container_of(info, CPUDebug, info);
|
||||
MemTxResult res;
|
||||
|
||||
address_space_read(s->cpu->as, memaddr, MEMTXATTRS_UNSPECIFIED,
|
||||
myaddr, length);
|
||||
return 0;
|
||||
res = address_space_read(s->cpu->as, memaddr, MEMTXATTRS_UNSPECIFIED,
|
||||
myaddr, length);
|
||||
return res == MEMTX_OK ? 0 : EIO;
|
||||
}
|
||||
|
||||
/* Disassembler for the monitor. */
|
||||
|
||||
@@ -3546,6 +3546,7 @@ void *address_space_map(AddressSpace *as,
|
||||
|
||||
if (!memory_access_is_direct(mr, is_write)) {
|
||||
if (atomic_xchg(&bounce.in_use, true)) {
|
||||
*plen = 0;
|
||||
return NULL;
|
||||
}
|
||||
/* Avoid unbounded allocations */
|
||||
@@ -3724,7 +3725,7 @@ static inline MemoryRegion *address_space_translate_cached(
|
||||
/* Called from RCU critical section. address_space_read_cached uses this
|
||||
* out of line function when the target is an MMIO or IOMMU region.
|
||||
*/
|
||||
void
|
||||
MemTxResult
|
||||
address_space_read_cached_slow(MemoryRegionCache *cache, hwaddr addr,
|
||||
void *buf, hwaddr len)
|
||||
{
|
||||
@@ -3734,15 +3735,15 @@ address_space_read_cached_slow(MemoryRegionCache *cache, hwaddr addr,
|
||||
l = len;
|
||||
mr = address_space_translate_cached(cache, addr, &addr1, &l, false,
|
||||
MEMTXATTRS_UNSPECIFIED);
|
||||
flatview_read_continue(cache->fv,
|
||||
addr, MEMTXATTRS_UNSPECIFIED, buf, len,
|
||||
addr1, l, mr);
|
||||
return flatview_read_continue(cache->fv,
|
||||
addr, MEMTXATTRS_UNSPECIFIED, buf, len,
|
||||
addr1, l, mr);
|
||||
}
|
||||
|
||||
/* Called from RCU critical section. address_space_write_cached uses this
|
||||
* out of line function when the target is an MMIO or IOMMU region.
|
||||
*/
|
||||
void
|
||||
MemTxResult
|
||||
address_space_write_cached_slow(MemoryRegionCache *cache, hwaddr addr,
|
||||
const void *buf, hwaddr len)
|
||||
{
|
||||
@@ -3752,9 +3753,9 @@ address_space_write_cached_slow(MemoryRegionCache *cache, hwaddr addr,
|
||||
l = len;
|
||||
mr = address_space_translate_cached(cache, addr, &addr1, &l, true,
|
||||
MEMTXATTRS_UNSPECIFIED);
|
||||
flatview_write_continue(cache->fv,
|
||||
addr, MEMTXATTRS_UNSPECIFIED, buf, len,
|
||||
addr1, l, mr);
|
||||
return flatview_write_continue(cache->fv,
|
||||
addr, MEMTXATTRS_UNSPECIFIED, buf, len,
|
||||
addr1, l, mr);
|
||||
}
|
||||
|
||||
#define ARG1_DECL MemoryRegionCache *cache
|
||||
@@ -3777,6 +3778,7 @@ int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
|
||||
while (len > 0) {
|
||||
int asidx;
|
||||
MemTxAttrs attrs;
|
||||
MemTxResult res;
|
||||
|
||||
page = addr & TARGET_PAGE_MASK;
|
||||
phys_addr = cpu_get_phys_page_attrs_debug(cpu, page, &attrs);
|
||||
@@ -3789,11 +3791,14 @@ int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
|
||||
l = len;
|
||||
phys_addr += (addr & ~TARGET_PAGE_MASK);
|
||||
if (is_write) {
|
||||
address_space_write_rom(cpu->cpu_ases[asidx].as, phys_addr,
|
||||
attrs, buf, l);
|
||||
res = address_space_write_rom(cpu->cpu_ases[asidx].as, phys_addr,
|
||||
attrs, buf, l);
|
||||
} else {
|
||||
address_space_read(cpu->cpu_ases[asidx].as, phys_addr, attrs, buf,
|
||||
l);
|
||||
res = address_space_read(cpu->cpu_ases[asidx].as, phys_addr,
|
||||
attrs, buf, l);
|
||||
}
|
||||
if (res != MEMTX_OK) {
|
||||
return -1;
|
||||
}
|
||||
len -= l;
|
||||
buf += l;
|
||||
|
||||
@@ -254,11 +254,12 @@ ERST
|
||||
|
||||
{
|
||||
.name = "mtree",
|
||||
.args_type = "flatview:-f,dispatch_tree:-d,owner:-o",
|
||||
.params = "[-f][-d][-o]",
|
||||
.args_type = "flatview:-f,dispatch_tree:-d,owner:-o,disabled:-D",
|
||||
.params = "[-f][-d][-o][-D]",
|
||||
.help = "show memory tree (-f: dump flat view for address spaces;"
|
||||
"-d: dump dispatch tree, valid with -f only);"
|
||||
"-o: dump region owners/parents",
|
||||
"-o: dump region owners/parents;"
|
||||
"-D: dump disabled regions",
|
||||
.cmd = hmp_info_mtree,
|
||||
},
|
||||
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@ devices-dirs-y += usb/
|
||||
devices-dirs-$(CONFIG_VFIO) += vfio/
|
||||
devices-dirs-y += virtio/
|
||||
devices-dirs-y += watchdog/
|
||||
devices-dirs-y += xen/
|
||||
devices-dirs-$(CONFIG_XEN) += xen/
|
||||
devices-dirs-$(CONFIG_MEM_DEVICE) += mem/
|
||||
devices-dirs-$(CONFIG_NUBUS) += nubus/
|
||||
devices-dirs-y += semihosting/
|
||||
|
||||
+1
-1
@@ -30,6 +30,7 @@
|
||||
#include "hw/acpi/acpi.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "sysemu/xen.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/range.h"
|
||||
#include "exec/address-spaces.h"
|
||||
@@ -41,7 +42,6 @@
|
||||
#include "hw/mem/nvdimm.h"
|
||||
#include "hw/acpi/memory_hotplug.h"
|
||||
#include "hw/acpi/acpi_dev_interface.h"
|
||||
#include "hw/xen/xen.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "hw/core/cpu.h"
|
||||
#include "trace.h"
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "qom/object.h"
|
||||
#include "hw/qdev-core.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/virtio/vhost.h"
|
||||
|
||||
@@ -45,6 +45,10 @@ GlobalProperty hw_compat_4_2[] = {
|
||||
{ "qxl", "revision", "4" },
|
||||
{ "qxl-vga", "revision", "4" },
|
||||
{ "fw_cfg", "acpi-mr-restore", "false" },
|
||||
{ "vmport", "x-read-set-eax", "off" },
|
||||
{ "vmport", "x-signal-unsupported-cmd", "off" },
|
||||
{ "vmport", "x-report-vmx-type", "off" },
|
||||
{ "vmport", "x-cmds-v2", "off" },
|
||||
};
|
||||
const size_t hw_compat_4_2_len = G_N_ELEMENTS(hw_compat_4_2);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user