mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/bonzini-gitlab/tags/for-upstream' into staging
* Fuzzing improvements (Qiuhao, Alexander) * i386: Fix BMI decoding for instructions with the 0x66 prefix (David) * initial attempt at fixing event_notifier emulation (Maxim) * i386: PKS emulation, fix for "qemu-system-i386 -cpu host" (myself) * meson: RBD test fixes (myself) * meson: TCI warnings (Philippe) * Leaner build for --disable-guest-agent, --disable-system and --disable-tools (Philippe, Stefan) * --enable-tcg-interpreter fix (Richard) * i386: SVM feature bits (Wei) * KVM bugfix (Thomas H.) * Add missing MemoryRegionOps callbacks (PJP) # gpg: Signature made Mon 08 Feb 2021 14:15:35 GMT # 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-gitlab/tags/for-upstream: (46 commits) target/i386: Expose VMX entry/exit load pkrs control bits target/i386: Add support for save/load IA32_PKRS MSR imx7-ccm: add digprog mmio write method tz-ppc: add dummy read/write methods spapr_pci: add spapr msi read method nvram: add nrf51_soc flash read method prep: add ppc-parity write method vfio: add quirk device write method pci-host: designware: add pcie-msi read method hw/pci-host: add pci-intack write method cpu-throttle: Remove timer_mod() from cpu_throttle_set() replay: rng-builtin support pc-bios/descriptors: fix paths in json files replay: fix replay of the interrupts accel/kvm/kvm-all: Fix wrong return code handling in dirty log code qapi/meson: Restrict UI module to system emulation and tools qapi/meson: Restrict system-mode specific modules qapi/meson: Remove QMP from user-mode emulation qapi/meson: Restrict qdev code to system-mode emulation meson: Restrict emulation code ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -2541,6 +2541,7 @@ F: qapi/qom.json
|
||||
F: qapi/qdev.json
|
||||
F: scripts/coccinelle/qom-parent-type.cocci
|
||||
F: softmmu/qdev-monitor.c
|
||||
F: stubs/qdev.c
|
||||
F: qom/
|
||||
F: tests/check-qom-interface.c
|
||||
F: tests/check-qom-proplist.c
|
||||
|
||||
+12
-9
@@ -644,16 +644,19 @@ static int kvm_physical_sync_dirty_bitmap(KVMMemoryListener *kml,
|
||||
|
||||
d.dirty_bitmap = mem->dirty_bmap;
|
||||
d.slot = mem->slot | (kml->as_id << 16);
|
||||
if (kvm_vm_ioctl(s, KVM_GET_DIRTY_LOG, &d) == -1) {
|
||||
DPRINTF("ioctl failed %d\n", errno);
|
||||
ret = -1;
|
||||
ret = kvm_vm_ioctl(s, KVM_GET_DIRTY_LOG, &d);
|
||||
if (ret == -ENOENT) {
|
||||
/* kernel does not have dirty bitmap in this slot */
|
||||
ret = 0;
|
||||
} else if (ret < 0) {
|
||||
error_report("ioctl KVM_GET_DIRTY_LOG failed: %d", errno);
|
||||
goto out;
|
||||
} else {
|
||||
subsection.offset_within_region += slot_offset;
|
||||
subsection.size = int128_make64(slot_size);
|
||||
kvm_get_dirty_pages_log_range(&subsection, d.dirty_bitmap);
|
||||
}
|
||||
|
||||
subsection.offset_within_region += slot_offset;
|
||||
subsection.size = int128_make64(slot_size);
|
||||
kvm_get_dirty_pages_log_range(&subsection, d.dirty_bitmap);
|
||||
|
||||
slot_offset += slot_size;
|
||||
start_addr += slot_size;
|
||||
size -= slot_size;
|
||||
@@ -750,8 +753,8 @@ static int kvm_log_clear_one_slot(KVMSlot *mem, int as_id, uint64_t start,
|
||||
d.num_pages = bmap_npages;
|
||||
d.slot = mem->slot | (as_id << 16);
|
||||
|
||||
if (kvm_vm_ioctl(s, KVM_CLEAR_DIRTY_LOG, &d) == -1) {
|
||||
ret = -errno;
|
||||
ret = kvm_vm_ioctl(s, KVM_CLEAR_DIRTY_LOG, &d);
|
||||
if (ret < 0 && ret != -ENOENT) {
|
||||
error_report("%s: KVM_CLEAR_DIRTY_LOG failed, slot=%d, "
|
||||
"start=0x%"PRIx64", size=0x%"PRIx32", errno=%d",
|
||||
__func__, d.slot, (uint64_t)d.first_page,
|
||||
|
||||
@@ -81,7 +81,13 @@ void icount_handle_deadline(void)
|
||||
int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
|
||||
QEMU_TIMER_ATTR_ALL);
|
||||
|
||||
if (deadline == 0) {
|
||||
/*
|
||||
* Instructions, interrupts, and exceptions are processed in cpu-exec.
|
||||
* Don't interrupt cpu thread, when these events are waiting
|
||||
* (i.e., there is no checkpoint)
|
||||
*/
|
||||
if (deadline == 0
|
||||
&& (replay_mode != REPLAY_MODE_PLAY || replay_has_checkpoint())) {
|
||||
icount_notify_aio_contexts();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -494,6 +494,16 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
|
||||
host_memory_backend_get_share, host_memory_backend_set_share);
|
||||
object_class_property_set_description(oc, "share",
|
||||
"Mark the memory as private to QEMU or shared");
|
||||
/*
|
||||
* Do not delete/rename option. This option must be considered stable
|
||||
* (as if it didn't have the 'x-' prefix including deprecation period) as
|
||||
* long as 4.0 and older machine types exists.
|
||||
* Option will be used by upper layers to override (disable) canonical path
|
||||
* for ramblock-id set by compat properties on old machine types ( <= 4.0),
|
||||
* to keep migration working when backend is used for main RAM with
|
||||
* -machine memory-backend= option (main RAM historically used prefix-less
|
||||
* ramblock-id).
|
||||
*/
|
||||
object_class_property_add_bool(oc, "x-use-canonical-path-for-ramblock-id",
|
||||
host_memory_backend_get_use_canonical_path,
|
||||
host_memory_backend_set_use_canonical_path);
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qemu/guest-random.h"
|
||||
#include "qom/object.h"
|
||||
#include "sysemu/replay.h"
|
||||
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(RngBuiltin, RNG_BUILTIN)
|
||||
|
||||
@@ -37,7 +38,7 @@ static void rng_builtin_request_entropy(RngBackend *b, RngRequest *req)
|
||||
{
|
||||
RngBuiltin *s = RNG_BUILTIN(b);
|
||||
|
||||
qemu_bh_schedule(s->bh);
|
||||
replay_bh_schedule_event(s->bh);
|
||||
}
|
||||
|
||||
static void rng_builtin_init(Object *obj)
|
||||
|
||||
@@ -1764,7 +1764,7 @@ Advanced options (experts only):
|
||||
--with-trace-file=NAME Full PATH,NAME of file to store traces
|
||||
Default:trace-<pid>
|
||||
--disable-slirp disable SLIRP userspace network connectivity
|
||||
--enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)
|
||||
--enable-tcg-interpreter enable TCI (TCG with bytecode interpreter, experimental and slow)
|
||||
--enable-malloc-trim enable libc malloc_trim() for memory optimization
|
||||
--oss-lib path to OSS library
|
||||
--cpu=CPU Build for host CPU [$cpu]
|
||||
|
||||
@@ -100,7 +100,7 @@ In meson.build::
|
||||
# Detect dependency
|
||||
sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
|
||||
method: 'pkg-config',
|
||||
static: enable_static)
|
||||
kwargs: static_kwargs)
|
||||
|
||||
# Create config-host.h (if applicable)
|
||||
config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
|
||||
|
||||
+32
-3
@@ -119,7 +119,7 @@ Adding a new fuzzer
|
||||
|
||||
Coverage over virtual devices can be improved by adding additional fuzzers.
|
||||
Fuzzers are kept in ``tests/qtest/fuzz/`` and should be added to
|
||||
``tests/qtest/fuzz/Makefile.include``
|
||||
``tests/qtest/fuzz/meson.build``
|
||||
|
||||
Fuzzers can rely on both qtest and libqos to communicate with virtual devices.
|
||||
|
||||
@@ -128,8 +128,7 @@ Fuzzers can rely on both qtest and libqos to communicate with virtual devices.
|
||||
2. Write the fuzzing code using the libqtest/libqos API. See existing fuzzers
|
||||
for reference.
|
||||
|
||||
3. Register the fuzzer in ``tests/fuzz/Makefile.include`` by appending the
|
||||
corresponding object to fuzz-obj-y
|
||||
3. Add the fuzzer to ``tests/qtest/fuzz/meson.build``.
|
||||
|
||||
Fuzzers can be more-or-less thought of as special qtest programs which can
|
||||
modify the qtest commands and/or qtest command arguments based on inputs
|
||||
@@ -181,6 +180,36 @@ To ensure that these env variables have been configured correctly, we can use::
|
||||
|
||||
The output should contain a complete list of matched MemoryRegions.
|
||||
|
||||
OSS-Fuzz
|
||||
--------
|
||||
QEMU is continuously fuzzed on `OSS-Fuzz` __(https://github.com/google/oss-fuzz).
|
||||
By default, the OSS-Fuzz build will try to fuzz every fuzz-target. Since the
|
||||
generic-fuzz target requires additional information provided in environment
|
||||
variables, we pre-define some generic-fuzz configs in
|
||||
``tests/qtest/fuzz/generic_fuzz_configs.h``. Each config must specify:
|
||||
|
||||
- ``.name``: To identify the fuzzer config
|
||||
|
||||
- ``.args`` OR ``.argfunc``: A string or pointer to a function returning a
|
||||
string. These strings are used to specify the ``QEMU_FUZZ_ARGS``
|
||||
environment variable. ``argfunc`` is useful when the config relies on e.g.
|
||||
a dynamically created temp directory, or a free tcp/udp port.
|
||||
|
||||
- ``.objects``: A string that specifies the ``QEMU_FUZZ_OBJECTS`` environment
|
||||
variable.
|
||||
|
||||
To fuzz additional devices/device configuration on OSS-Fuzz, send patches for
|
||||
either a new device-specific fuzzer or a new generic-fuzz config.
|
||||
|
||||
Build details:
|
||||
|
||||
- The Dockerfile that sets up the environment for building QEMU's
|
||||
fuzzers on OSS-Fuzz can be fund in the OSS-Fuzz repository
|
||||
__(https://github.com/google/oss-fuzz/blob/master/projects/qemu/Dockerfile)
|
||||
|
||||
- The script responsible for building the fuzzers can be found in the
|
||||
QEMU source tree at ``scripts/oss-fuzz/build.sh``
|
||||
|
||||
Implementation Details / Fuzzer Lifecycle
|
||||
-----------------------------------------
|
||||
|
||||
|
||||
+4
-2
@@ -46,9 +46,11 @@ if build_docs
|
||||
meson.source_root() / 'docs/sphinx/qmp_lexer.py',
|
||||
qapi_gen_depends ]
|
||||
|
||||
have_ga = have_tools and config_host.has_key('CONFIG_GUEST_AGENT')
|
||||
|
||||
man_pages = {
|
||||
'qemu-ga.8': (have_tools ? 'man8' : ''),
|
||||
'qemu-ga-ref.7': 'man7',
|
||||
'qemu-ga.8': (have_ga ? 'man8' : ''),
|
||||
'qemu-ga-ref.7': (have_ga ? 'man7' : ''),
|
||||
'qemu-qmp-ref.7': 'man7',
|
||||
'qemu-storage-daemon-qmp-ref.7': (have_tools ? 'man7' : ''),
|
||||
'qemu-img.1': (have_tools ? 'man1' : ''),
|
||||
|
||||
@@ -131,8 +131,16 @@ static const struct MemoryRegionOps imx7_set_clr_tog_ops = {
|
||||
},
|
||||
};
|
||||
|
||||
static void imx7_digprog_write(void *opaque, hwaddr addr,
|
||||
uint64_t data, unsigned size)
|
||||
{
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"Guest write to read-only ANALOG_DIGPROG register\n");
|
||||
}
|
||||
|
||||
static const struct MemoryRegionOps imx7_digprog_ops = {
|
||||
.read = imx7_set_clr_tog_read,
|
||||
.write = imx7_digprog_write,
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
.impl = {
|
||||
.min_access_size = 4,
|
||||
|
||||
@@ -196,7 +196,21 @@ static bool tz_ppc_dummy_accepts(void *opaque, hwaddr addr,
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
static uint64_t tz_ppc_dummy_read(void *opaque, hwaddr addr, unsigned size)
|
||||
{
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
static void tz_ppc_dummy_write(void *opaque, hwaddr addr,
|
||||
uint64_t data, unsigned size)
|
||||
{
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
static const MemoryRegionOps tz_ppc_dummy_ops = {
|
||||
/* define r/w methods to avoid assert failure in memory_region_init_io */
|
||||
.read = tz_ppc_dummy_read,
|
||||
.write = tz_ppc_dummy_write,
|
||||
.valid.accepts = tz_ppc_dummy_accepts,
|
||||
};
|
||||
|
||||
|
||||
@@ -273,6 +273,15 @@ static const MemoryRegionOps io_ops = {
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static uint64_t flash_read(void *opaque, hwaddr offset, unsigned size)
|
||||
{
|
||||
/*
|
||||
* This is a rom_device MemoryRegion which is always in
|
||||
* romd_mode (we never put it in MMIO mode), so reads always
|
||||
* go directly to RAM and never come here.
|
||||
*/
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
static void flash_write(void *opaque, hwaddr offset, uint64_t value,
|
||||
unsigned int size)
|
||||
@@ -300,6 +309,7 @@ static void flash_write(void *opaque, hwaddr offset, uint64_t value,
|
||||
|
||||
|
||||
static const MemoryRegionOps flash_ops = {
|
||||
.read = flash_read,
|
||||
.write = flash_write,
|
||||
.valid.min_access_size = 4,
|
||||
.valid.max_access_size = 4,
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/log.h"
|
||||
#include "hw/pci/msi.h"
|
||||
#include "hw/pci/pci_bridge.h"
|
||||
#include "hw/pci/pci_host.h"
|
||||
@@ -63,6 +64,23 @@ designware_pcie_root_to_host(DesignwarePCIERoot *root)
|
||||
return DESIGNWARE_PCIE_HOST(bus->parent);
|
||||
}
|
||||
|
||||
static uint64_t designware_pcie_root_msi_read(void *opaque, hwaddr addr,
|
||||
unsigned size)
|
||||
{
|
||||
/*
|
||||
* Attempts to read from the MSI address are undefined in
|
||||
* the PCI specifications. For this hardware, the datasheet
|
||||
* specifies that a read from the magic address is simply not
|
||||
* intercepted by the MSI controller, and will go out to the
|
||||
* AHB/AXI bus like any other PCI-device-initiated DMA read.
|
||||
* This is not trivial to implement in QEMU, so since
|
||||
* well-behaved guests won't ever ask a PCI device to DMA from
|
||||
* this address we just log the missing functionality.
|
||||
*/
|
||||
qemu_log_mask(LOG_UNIMP, "%s not implemented\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void designware_pcie_root_msi_write(void *opaque, hwaddr addr,
|
||||
uint64_t val, unsigned len)
|
||||
{
|
||||
@@ -77,6 +95,7 @@ static void designware_pcie_root_msi_write(void *opaque, hwaddr addr,
|
||||
}
|
||||
|
||||
static const MemoryRegionOps designware_pci_host_msi_ops = {
|
||||
.read = designware_pcie_root_msi_read,
|
||||
.write = designware_pcie_root_msi_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
.valid = {
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/datadir.h"
|
||||
#include "qemu/units.h"
|
||||
#include "qemu/log.h"
|
||||
#include "qapi/error.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/pci/pci_bus.h"
|
||||
@@ -121,8 +122,15 @@ static uint64_t raven_intack_read(void *opaque, hwaddr addr,
|
||||
return pic_read_irq(isa_pic);
|
||||
}
|
||||
|
||||
static void raven_intack_write(void *opaque, hwaddr addr,
|
||||
uint64_t data, unsigned size)
|
||||
{
|
||||
qemu_log_mask(LOG_UNIMP, "%s not implemented\n", __func__);
|
||||
}
|
||||
|
||||
static const MemoryRegionOps raven_intack_ops = {
|
||||
.read = raven_intack_read,
|
||||
.write = raven_intack_write,
|
||||
.valid = {
|
||||
.max_access_size = 1,
|
||||
},
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/log.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
@@ -235,8 +236,15 @@ static uint64_t ppc_parity_error_readl(void *opaque, hwaddr addr,
|
||||
return val;
|
||||
}
|
||||
|
||||
static void ppc_parity_error_writel(void *opaque, hwaddr addr,
|
||||
uint64_t data, unsigned size)
|
||||
{
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid access\n", __func__);
|
||||
}
|
||||
|
||||
static const MemoryRegionOps ppc_parity_error_ops = {
|
||||
.read = ppc_parity_error_readl,
|
||||
.write = ppc_parity_error_writel,
|
||||
.valid = {
|
||||
.min_access_size = 4,
|
||||
.max_access_size = 4,
|
||||
|
||||
+12
-2
@@ -53,6 +53,7 @@
|
||||
#include "sysemu/hostmem.h"
|
||||
#include "sysemu/numa.h"
|
||||
#include "hw/ppc/spapr_numa.h"
|
||||
#include "qemu/log.h"
|
||||
|
||||
/* Copied from the kernel arch/powerpc/platforms/pseries/msi.c */
|
||||
#define RTAS_QUERY_FN 0
|
||||
@@ -739,6 +740,12 @@ static PCIINTxRoute spapr_route_intx_pin_to_irq(void *opaque, int pin)
|
||||
return route;
|
||||
}
|
||||
|
||||
static uint64_t spapr_msi_read(void *opaque, hwaddr addr, unsigned size)
|
||||
{
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid access\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* MSI/MSIX memory region implementation.
|
||||
* The handler handles both MSI and MSIX.
|
||||
@@ -756,8 +763,11 @@ static void spapr_msi_write(void *opaque, hwaddr addr,
|
||||
}
|
||||
|
||||
static const MemoryRegionOps spapr_msi_ops = {
|
||||
/* There is no .read as the read result is undefined by PCI spec */
|
||||
.read = NULL,
|
||||
/*
|
||||
* .read result is undefined by PCI spec.
|
||||
* define .read method to avoid assert failure in memory_region_init_io
|
||||
*/
|
||||
.read = spapr_msi_read,
|
||||
.write = spapr_msi_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN
|
||||
};
|
||||
|
||||
@@ -126,6 +126,7 @@ int virtio_scsi_dataplane_start(VirtIODevice *vdev)
|
||||
{
|
||||
int i;
|
||||
int rc;
|
||||
int vq_init_count = 0;
|
||||
BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
|
||||
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
|
||||
VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(vdev);
|
||||
@@ -153,17 +154,22 @@ int virtio_scsi_dataplane_start(VirtIODevice *vdev)
|
||||
if (rc) {
|
||||
goto fail_vrings;
|
||||
}
|
||||
|
||||
vq_init_count++;
|
||||
rc = virtio_scsi_vring_init(s, vs->event_vq, 1,
|
||||
virtio_scsi_data_plane_handle_event);
|
||||
if (rc) {
|
||||
goto fail_vrings;
|
||||
}
|
||||
|
||||
vq_init_count++;
|
||||
for (i = 0; i < vs->conf.num_queues; i++) {
|
||||
rc = virtio_scsi_vring_init(s, vs->cmd_vqs[i], i + 2,
|
||||
virtio_scsi_data_plane_handle_cmd);
|
||||
if (rc) {
|
||||
goto fail_vrings;
|
||||
}
|
||||
vq_init_count++;
|
||||
}
|
||||
|
||||
s->dataplane_starting = false;
|
||||
@@ -174,7 +180,7 @@ int virtio_scsi_dataplane_start(VirtIODevice *vdev)
|
||||
fail_vrings:
|
||||
aio_wait_bh_oneshot(s->ctx, virtio_scsi_dataplane_stop_bh, s);
|
||||
aio_context_release(s->ctx);
|
||||
for (i = 0; i < vs->conf.num_queues + 2; i++) {
|
||||
for (i = 0; i < vq_init_count; i++) {
|
||||
virtio_bus_set_host_notifier(VIRTIO_BUS(qbus), i, false);
|
||||
virtio_bus_cleanup_host_notifier(VIRTIO_BUS(qbus), i);
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include CONFIG_DEVICES
|
||||
#include "exec/memop.h"
|
||||
#include "qemu/units.h"
|
||||
#include "qemu/log.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qemu/module.h"
|
||||
@@ -264,8 +265,15 @@ static uint64_t vfio_ati_3c3_quirk_read(void *opaque,
|
||||
return data;
|
||||
}
|
||||
|
||||
static void vfio_ati_3c3_quirk_write(void *opaque, hwaddr addr,
|
||||
uint64_t data, unsigned size)
|
||||
{
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid access\n", __func__);
|
||||
}
|
||||
|
||||
static const MemoryRegionOps vfio_ati_3c3_quirk = {
|
||||
.read = vfio_ati_3c3_quirk_read,
|
||||
.write = vfio_ati_3c3_quirk_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
|
||||
@@ -45,13 +45,11 @@ DECLARE_OBJ_CHECKERS(IOMMUMemoryRegion, IOMMUMemoryRegionClass,
|
||||
#ifdef CONFIG_FUZZ
|
||||
void fuzz_dma_read_cb(size_t addr,
|
||||
size_t len,
|
||||
MemoryRegion *mr,
|
||||
bool is_write);
|
||||
MemoryRegion *mr);
|
||||
#else
|
||||
static inline void fuzz_dma_read_cb(size_t addr,
|
||||
size_t len,
|
||||
MemoryRegion *mr,
|
||||
bool is_write)
|
||||
MemoryRegion *mr)
|
||||
{
|
||||
/* Do Nothing */
|
||||
}
|
||||
@@ -2514,7 +2512,7 @@ address_space_read_cached(MemoryRegionCache *cache, hwaddr addr,
|
||||
void *buf, hwaddr len)
|
||||
{
|
||||
assert(addr < cache->len && len <= cache->len - addr);
|
||||
fuzz_dma_read_cb(cache->xlat + addr, len, cache->mrs.mr, false);
|
||||
fuzz_dma_read_cb(cache->xlat + addr, len, cache->mrs.mr);
|
||||
if (likely(cache->ptr)) {
|
||||
memcpy(buf, cache->ptr + addr, len);
|
||||
return MEMTX_OK;
|
||||
|
||||
@@ -28,7 +28,7 @@ static inline uint32_t ADDRESS_SPACE_LD_CACHED(l)(MemoryRegionCache *cache,
|
||||
hwaddr addr, MemTxAttrs attrs, MemTxResult *result)
|
||||
{
|
||||
assert(addr < cache->len && 4 <= cache->len - addr);
|
||||
fuzz_dma_read_cb(cache->xlat + addr, 4, cache->mrs.mr, false);
|
||||
fuzz_dma_read_cb(cache->xlat + addr, 4, cache->mrs.mr);
|
||||
if (likely(cache->ptr)) {
|
||||
return LD_P(l)(cache->ptr + addr);
|
||||
} else {
|
||||
@@ -40,7 +40,7 @@ static inline uint64_t ADDRESS_SPACE_LD_CACHED(q)(MemoryRegionCache *cache,
|
||||
hwaddr addr, MemTxAttrs attrs, MemTxResult *result)
|
||||
{
|
||||
assert(addr < cache->len && 8 <= cache->len - addr);
|
||||
fuzz_dma_read_cb(cache->xlat + addr, 8, cache->mrs.mr, false);
|
||||
fuzz_dma_read_cb(cache->xlat + addr, 8, cache->mrs.mr);
|
||||
if (likely(cache->ptr)) {
|
||||
return LD_P(q)(cache->ptr + addr);
|
||||
} else {
|
||||
@@ -52,7 +52,7 @@ static inline uint32_t ADDRESS_SPACE_LD_CACHED(uw)(MemoryRegionCache *cache,
|
||||
hwaddr addr, MemTxAttrs attrs, MemTxResult *result)
|
||||
{
|
||||
assert(addr < cache->len && 2 <= cache->len - addr);
|
||||
fuzz_dma_read_cb(cache->xlat + addr, 2, cache->mrs.mr, false);
|
||||
fuzz_dma_read_cb(cache->xlat + addr, 2, cache->mrs.mr);
|
||||
if (likely(cache->ptr)) {
|
||||
return LD_P(uw)(cache->ptr + addr);
|
||||
} else {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user