mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging
pc, pci, virtio, vhost: fixes, features Beginning of merging vDPA, new PCI ID, a new virtio balloon stat, intel iommu rework fixing a couple of security problems (no CVEs yet), fixes all over the place. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # gpg: Signature made Wed 23 May 2018 15:41:32 BST # gpg: using RSA key 281F0DB8D28D5469 # gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>" # gpg: aka "Michael S. Tsirkin <mst@redhat.com>" # Primary key fingerprint: 0270 606B 6F3C DF3D 0B17 0970 C350 3912 AFBE 8E67 # Subkey fingerprint: 5D09 FD08 71C8 F85B 94CA 8A0D 281F 0DB8 D28D 5469 * remotes/mst/tags/for_upstream: (28 commits) intel-iommu: rework the page walk logic util: implement simple iova tree intel-iommu: trace domain id during page walk intel-iommu: pass in address space when page walk intel-iommu: introduce vtd_page_walk_info intel-iommu: only do page walk for MAP notifiers intel-iommu: add iommu lock intel-iommu: remove IntelIOMMUNotifierNode intel-iommu: send PSI always even if across PDEs nvdimm: fix typo in label-size definition contrib/vhost-user-blk: enable protocol feature for vhost-user-blk hw/virtio: Fix brace Werror with clang 6.0.0 libvhost-user: Send messages with no data vhost-user+postcopy: Use qemu_set_nonblock virtio: support setting memory region based host notifier vhost-user: support receiving file descriptors in slave_read vhost-user: add Net prefix to internal state structure linux-headers: add kvm header for mips linux-headers: add unistd.h on all arches update-linux-headers.sh: unistd.h, kvm consistency ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -1787,6 +1787,12 @@ F: include/sysemu/replay.h
|
||||
F: docs/replay.txt
|
||||
F: stubs/replay.c
|
||||
|
||||
IOVA Tree
|
||||
M: Peter Xu <peterx@redhat.com>
|
||||
S: Maintained
|
||||
F: include/qemu/iova-tree.h
|
||||
F: util/iova-tree.c
|
||||
|
||||
Usermode Emulation
|
||||
------------------
|
||||
Overall
|
||||
|
||||
@@ -323,13 +323,15 @@ vu_message_write(VuDev *dev, int conn_fd, VhostUserMsg *vmsg)
|
||||
rc = sendmsg(conn_fd, &msg, 0);
|
||||
} while (rc < 0 && (errno == EINTR || errno == EAGAIN));
|
||||
|
||||
do {
|
||||
if (vmsg->data) {
|
||||
rc = write(conn_fd, vmsg->data, vmsg->size);
|
||||
} else {
|
||||
rc = write(conn_fd, p + VHOST_USER_HDR_SIZE, vmsg->size);
|
||||
}
|
||||
} while (rc < 0 && (errno == EINTR || errno == EAGAIN));
|
||||
if (vmsg->size) {
|
||||
do {
|
||||
if (vmsg->data) {
|
||||
rc = write(conn_fd, vmsg->data, vmsg->size);
|
||||
} else {
|
||||
rc = write(conn_fd, p + VHOST_USER_HDR_SIZE, vmsg->size);
|
||||
}
|
||||
} while (rc < 0 && (errno == EINTR || errno == EAGAIN));
|
||||
}
|
||||
|
||||
if (rc <= 0) {
|
||||
vu_panic(dev, "Error while writing: %s", strerror(errno));
|
||||
|
||||
@@ -311,6 +311,12 @@ vub_get_features(VuDev *dev)
|
||||
1ull << VHOST_USER_F_PROTOCOL_FEATURES;
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
vub_get_protocol_features(VuDev *dev)
|
||||
{
|
||||
return 1ull << VHOST_USER_PROTOCOL_F_CONFIG;
|
||||
}
|
||||
|
||||
static int
|
||||
vub_get_config(VuDev *vu_dev, uint8_t *config, uint32_t len)
|
||||
{
|
||||
@@ -373,6 +379,7 @@ vub_set_config(VuDev *vu_dev, const uint8_t *data,
|
||||
static const VuDevIface vub_iface = {
|
||||
.get_features = vub_get_features,
|
||||
.queue_set_started = vub_queue_set_started,
|
||||
.get_protocol_features = vub_get_protocol_features,
|
||||
.get_config = vub_get_config,
|
||||
.set_config = vub_set_config,
|
||||
};
|
||||
|
||||
@@ -62,6 +62,7 @@ PCI devices (other than virtio):
|
||||
1b36:000a PCI-PCI bridge (multiseat)
|
||||
1b36:000b PCIe Expander Bridge (-device pxb-pcie)
|
||||
1b36:000d PCI xhci usb host adapter
|
||||
1b36:000f mdpy (mdev sample device), linux/samples/vfio-mdev/mdpy.c
|
||||
|
||||
All these devices are documented in docs/specs.
|
||||
|
||||
|
||||
@@ -34,6 +34,8 @@ which will return a dictionary containing:
|
||||
- stat-total-memory
|
||||
- stat-available-memory
|
||||
- stat-disk-caches
|
||||
- stat-htlb-pgalloc
|
||||
- stat-htlb-pgfail
|
||||
|
||||
o A key named last-update, which contains the last stats update
|
||||
timestamp in seconds. Since this timestamp is generated by the host,
|
||||
|
||||
+296
-100
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -26,7 +26,7 @@
|
||||
#include "qapi/error.h"
|
||||
|
||||
#include <linux/kvm.h>
|
||||
#include <linux/kvm_para.h>
|
||||
#include "standard-headers/asm-x86/kvm_para.h"
|
||||
|
||||
#define TYPE_KVM_CLOCK "kvmclock"
|
||||
#define KVM_CLOCK(obj) OBJECT_CHECK(KVMClockState, (obj), TYPE_KVM_CLOCK)
|
||||
|
||||
@@ -39,9 +39,10 @@ vtd_fault_disabled(void) "Fault processing disabled for context entry"
|
||||
vtd_replay_ce_valid(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t domain, uint64_t hi, uint64_t lo) "replay valid context device %02"PRIx8":%02"PRIx8".%02"PRIx8" domain 0x%"PRIx16" hi 0x%"PRIx64" lo 0x%"PRIx64
|
||||
vtd_replay_ce_invalid(uint8_t bus, uint8_t dev, uint8_t fn) "replay invalid context device %02"PRIx8":%02"PRIx8".%02"PRIx8
|
||||
vtd_page_walk_level(uint64_t addr, uint32_t level, uint64_t start, uint64_t end) "walk (base=0x%"PRIx64", level=%"PRIu32") iova range 0x%"PRIx64" - 0x%"PRIx64
|
||||
vtd_page_walk_one(uint32_t level, uint64_t iova, uint64_t gpa, uint64_t mask, int perm) "detected page level 0x%"PRIx32" iova 0x%"PRIx64" -> gpa 0x%"PRIx64" mask 0x%"PRIx64" perm %d"
|
||||
vtd_page_walk_one(uint16_t domain, uint64_t iova, uint64_t gpa, uint64_t mask, int perm) "domain 0x%"PRIu16" iova 0x%"PRIx64" -> gpa 0x%"PRIx64" mask 0x%"PRIx64" perm %d"
|
||||
vtd_page_walk_one_skip_map(uint64_t iova, uint64_t mask, uint64_t translated) "iova 0x%"PRIx64" mask 0x%"PRIx64" translated 0x%"PRIx64
|
||||
vtd_page_walk_one_skip_unmap(uint64_t iova, uint64_t mask) "iova 0x%"PRIx64" mask 0x%"PRIx64
|
||||
vtd_page_walk_skip_read(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to unable to read"
|
||||
vtd_page_walk_skip_perm(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to perm empty"
|
||||
vtd_page_walk_skip_reserve(uint64_t iova, uint64_t next) "Page walk skip iova 0x%"PRIx64" - 0x%"PRIx64" due to rsrv set"
|
||||
vtd_switch_address_space(uint8_t bus, uint8_t slot, uint8_t fn, bool on) "Device %02x:%02x.%x switching address space (iommu enabled=%d)"
|
||||
vtd_as_unmap_whole(uint8_t bus, uint8_t slot, uint8_t fn, uint64_t iova, uint64_t size) "Device %02x:%02x.%x start 0x%"PRIx64" size 0x%"PRIx64
|
||||
|
||||
+1
-1
@@ -89,7 +89,7 @@ static void nvdimm_set_unarmed(Object *obj, bool value, Error **errp)
|
||||
|
||||
static void nvdimm_init(Object *obj)
|
||||
{
|
||||
object_property_add(obj, NVDIMM_LABLE_SIZE_PROP, "int",
|
||||
object_property_add(obj, NVDIMM_LABEL_SIZE_PROP, "int",
|
||||
nvdimm_get_label_size, nvdimm_set_label_size, NULL,
|
||||
NULL, NULL);
|
||||
object_property_add_bool(obj, NVDIMM_UNARMED_PROP,
|
||||
|
||||
+11
-6
@@ -535,13 +535,15 @@ static void mch_realize(PCIDevice *d, Error **errp)
|
||||
|
||||
/* if *disabled* show SMRAM to all CPUs */
|
||||
memory_region_init_alias(&mch->smram_region, OBJECT(mch), "smram-region",
|
||||
mch->pci_address_space, 0xa0000, 0x20000);
|
||||
memory_region_add_subregion_overlap(mch->system_memory, 0xa0000,
|
||||
mch->pci_address_space, MCH_HOST_BRIDGE_SMRAM_C_BASE,
|
||||
MCH_HOST_BRIDGE_SMRAM_C_SIZE);
|
||||
memory_region_add_subregion_overlap(mch->system_memory, MCH_HOST_BRIDGE_SMRAM_C_BASE,
|
||||
&mch->smram_region, 1);
|
||||
memory_region_set_enabled(&mch->smram_region, true);
|
||||
|
||||
memory_region_init_alias(&mch->open_high_smram, OBJECT(mch), "smram-open-high",
|
||||
mch->ram_memory, 0xa0000, 0x20000);
|
||||
mch->ram_memory, MCH_HOST_BRIDGE_SMRAM_C_BASE,
|
||||
MCH_HOST_BRIDGE_SMRAM_C_SIZE);
|
||||
memory_region_add_subregion_overlap(mch->system_memory, 0xfeda0000,
|
||||
&mch->open_high_smram, 1);
|
||||
memory_region_set_enabled(&mch->open_high_smram, false);
|
||||
@@ -550,11 +552,14 @@ static void mch_realize(PCIDevice *d, Error **errp)
|
||||
memory_region_init(&mch->smram, OBJECT(mch), "smram", 1ull << 32);
|
||||
memory_region_set_enabled(&mch->smram, true);
|
||||
memory_region_init_alias(&mch->low_smram, OBJECT(mch), "smram-low",
|
||||
mch->ram_memory, 0xa0000, 0x20000);
|
||||
mch->ram_memory, MCH_HOST_BRIDGE_SMRAM_C_BASE,
|
||||
MCH_HOST_BRIDGE_SMRAM_C_SIZE);
|
||||
memory_region_set_enabled(&mch->low_smram, true);
|
||||
memory_region_add_subregion(&mch->smram, 0xa0000, &mch->low_smram);
|
||||
memory_region_add_subregion(&mch->smram, MCH_HOST_BRIDGE_SMRAM_C_BASE,
|
||||
&mch->low_smram);
|
||||
memory_region_init_alias(&mch->high_smram, OBJECT(mch), "smram-high",
|
||||
mch->ram_memory, 0xa0000, 0x20000);
|
||||
mch->ram_memory, MCH_HOST_BRIDGE_SMRAM_C_BASE,
|
||||
MCH_HOST_BRIDGE_SMRAM_C_SIZE);
|
||||
memory_region_set_enabled(&mch->high_smram, true);
|
||||
memory_region_add_subregion(&mch->smram, 0xfeda0000, &mch->high_smram);
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ vhost_region_add_section(const char *name, uint64_t gpa, uint64_t size, uint64_t
|
||||
vhost_region_add_section_merge(const char *name, uint64_t new_size, uint64_t gpa, uint64_t owr) "%s: size: 0x%"PRIx64 " gpa: 0x%"PRIx64 " owr: 0x%"PRIx64
|
||||
vhost_region_add_section_aligned(const char *name, uint64_t gpa, uint64_t size, uint64_t host) "%s: 0x%"PRIx64"+0x%"PRIx64" @ 0x%"PRIx64
|
||||
vhost_section(const char *name, int r) "%s:%d"
|
||||
vhost_iotlb_miss(void *dev, int step) "%p step %d"
|
||||
|
||||
# hw/virtio/vhost-user.c
|
||||
vhost_user_postcopy_end_entry(void) ""
|
||||
|
||||
+42
-3
@@ -852,14 +852,44 @@ static void slave_read(void *opaque)
|
||||
VhostUserHeader hdr = { 0, };
|
||||
VhostUserPayload payload = { 0, };
|
||||
int size, ret = 0;
|
||||
struct iovec iov;
|
||||
struct msghdr msgh;
|
||||
int fd = -1;
|
||||
char control[CMSG_SPACE(sizeof(fd))];
|
||||
struct cmsghdr *cmsg;
|
||||
size_t fdsize;
|
||||
|
||||
memset(&msgh, 0, sizeof(msgh));
|
||||
msgh.msg_iov = &iov;
|
||||
msgh.msg_iovlen = 1;
|
||||
msgh.msg_control = control;
|
||||
msgh.msg_controllen = sizeof(control);
|
||||
|
||||
/* Read header */
|
||||
size = read(u->slave_fd, &hdr, VHOST_USER_HDR_SIZE);
|
||||
iov.iov_base = &hdr;
|
||||
iov.iov_len = VHOST_USER_HDR_SIZE;
|
||||
|
||||
size = recvmsg(u->slave_fd, &msgh, 0);
|
||||
if (size != VHOST_USER_HDR_SIZE) {
|
||||
error_report("Failed to read from slave.");
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (msgh.msg_flags & MSG_CTRUNC) {
|
||||
error_report("Truncated message.");
|
||||
goto err;
|
||||
}
|
||||
|
||||
for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg != NULL;
|
||||
cmsg = CMSG_NXTHDR(&msgh, cmsg)) {
|
||||
if (cmsg->cmsg_level == SOL_SOCKET &&
|
||||
cmsg->cmsg_type == SCM_RIGHTS) {
|
||||
fdsize = cmsg->cmsg_len - CMSG_LEN(0);
|
||||
memcpy(&fd, CMSG_DATA(cmsg), fdsize);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hdr.size > VHOST_USER_PAYLOAD_SIZE) {
|
||||
error_report("Failed to read msg header."
|
||||
" Size %d exceeds the maximum %zu.", hdr.size,
|
||||
@@ -883,9 +913,15 @@ static void slave_read(void *opaque)
|
||||
break;
|
||||
default:
|
||||
error_report("Received unexpected msg type.");
|
||||
if (fd != -1) {
|
||||
close(fd);
|
||||
}
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
/* Message handlers need to make sure that fd will be consumed. */
|
||||
fd = -1;
|
||||
|
||||
/*
|
||||
* REPLY_ACK feature handling. Other reply types has to be managed
|
||||
* directly in their request handlers.
|
||||
@@ -918,6 +954,9 @@ err:
|
||||
qemu_set_fd_handler(u->slave_fd, NULL, NULL, NULL);
|
||||
close(u->slave_fd);
|
||||
u->slave_fd = -1;
|
||||
if (fd != -1) {
|
||||
close(fd);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1076,7 +1115,7 @@ static int vhost_user_postcopy_advise(struct vhost_dev *dev, Error **errp)
|
||||
error_setg(errp, "%s: Failed to get ufd", __func__);
|
||||
return -1;
|
||||
}
|
||||
fcntl(ufd, F_SETFL, O_NONBLOCK);
|
||||
qemu_set_nonblock(ufd);
|
||||
|
||||
/* register ufd with userfault thread */
|
||||
u->postcopy_fd.fd = ufd;
|
||||
@@ -1316,7 +1355,7 @@ static bool vhost_user_requires_shm_log(struct vhost_dev *dev)
|
||||
|
||||
static int vhost_user_migration_done(struct vhost_dev *dev, char* mac_addr)
|
||||
{
|
||||
VhostUserMsg msg = { 0 };
|
||||
VhostUserMsg msg = { };
|
||||
|
||||
assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_USER);
|
||||
|
||||
|
||||
@@ -894,12 +894,15 @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
trace_vhost_iotlb_miss(dev, 1);
|
||||
|
||||
iotlb = address_space_get_iotlb_entry(dev->vdev->dma_as,
|
||||
iova, write);
|
||||
if (iotlb.target_as != NULL) {
|
||||
ret = vhost_memory_region_lookup(dev, iotlb.translated_addr,
|
||||
&uaddr, &len);
|
||||
if (ret) {
|
||||
trace_vhost_iotlb_miss(dev, 3);
|
||||
error_report("Fail to lookup the translated address "
|
||||
"%"PRIx64, iotlb.translated_addr);
|
||||
goto out;
|
||||
@@ -911,10 +914,14 @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)
|
||||
ret = vhost_backend_update_device_iotlb(dev, iova, uaddr,
|
||||
len, iotlb.perm);
|
||||
if (ret) {
|
||||
trace_vhost_iotlb_miss(dev, 4);
|
||||
error_report("Fail to update device iotlb");
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
trace_vhost_iotlb_miss(dev, 2);
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
|
||||
|
||||
@@ -52,6 +52,8 @@ static const char *balloon_stat_names[] = {
|
||||
[VIRTIO_BALLOON_S_MEMTOT] = "stat-total-memory",
|
||||
[VIRTIO_BALLOON_S_AVAIL] = "stat-available-memory",
|
||||
[VIRTIO_BALLOON_S_CACHES] = "stat-disk-caches",
|
||||
[VIRTIO_BALLOON_S_HTLB_PGALLOC] = "stat-htlb-pgalloc",
|
||||
[VIRTIO_BALLOON_S_HTLB_PGFAIL] = "stat-htlb-pgfail",
|
||||
[VIRTIO_BALLOON_S_NR] = NULL
|
||||
};
|
||||
|
||||
|
||||
@@ -1037,6 +1037,27 @@ assign_error:
|
||||
return r;
|
||||
}
|
||||
|
||||
static int virtio_pci_set_host_notifier_mr(DeviceState *d, int n,
|
||||
MemoryRegion *mr, bool assign)
|
||||
{
|
||||
VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
|
||||
int offset;
|
||||
|
||||
if (n >= VIRTIO_QUEUE_MAX || !virtio_pci_modern(proxy) ||
|
||||
virtio_pci_queue_mem_mult(proxy) != memory_region_size(mr)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (assign) {
|
||||
offset = virtio_pci_queue_mem_mult(proxy) * n;
|
||||
memory_region_add_subregion_overlap(&proxy->notify.mr, offset, mr, 1);
|
||||
} else {
|
||||
memory_region_del_subregion(&proxy->notify.mr, mr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void virtio_pci_vmstate_change(DeviceState *d, bool running)
|
||||
{
|
||||
VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
|
||||
@@ -2652,6 +2673,7 @@ static void virtio_pci_bus_class_init(ObjectClass *klass, void *data)
|
||||
k->has_extra_state = virtio_pci_has_extra_state;
|
||||
k->query_guest_notifiers = virtio_pci_query_guest_notifiers;
|
||||
k->set_guest_notifiers = virtio_pci_set_guest_notifiers;
|
||||
k->set_host_notifier_mr = virtio_pci_set_host_notifier_mr;
|
||||
k->vmstate_change = virtio_pci_vmstate_change;
|
||||
k->pre_plugged = virtio_pci_pre_plugged;
|
||||
k->device_plugged = virtio_pci_device_plugged;
|
||||
|
||||
@@ -2454,6 +2454,19 @@ EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq)
|
||||
return &vq->host_notifier;
|
||||
}
|
||||
|
||||
int virtio_queue_set_host_notifier_mr(VirtIODevice *vdev, int n,
|
||||
MemoryRegion *mr, bool assign)
|
||||
{
|
||||
BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
|
||||
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
|
||||
|
||||
if (k->set_host_notifier_mr) {
|
||||
return k->set_host_notifier_mr(qbus->parent, n, mr, assign);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void virtio_device_set_child_bus_name(VirtIODevice *vdev, char *bus_name)
|
||||
{
|
||||
g_free(vdev->bus_name);
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "hw/i386/ioapic.h"
|
||||
#include "hw/pci/msi.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "qemu/iova-tree.h"
|
||||
|
||||
#define TYPE_INTEL_IOMMU_DEVICE "intel-iommu"
|
||||
#define INTEL_IOMMU_DEVICE(obj) \
|
||||
@@ -67,7 +68,6 @@ typedef union VTD_IR_TableEntry VTD_IR_TableEntry;
|
||||
typedef union VTD_IR_MSIAddress VTD_IR_MSIAddress;
|
||||
typedef struct VTDIrq VTDIrq;
|
||||
typedef struct VTD_MSIMessage VTD_MSIMessage;
|
||||
typedef struct IntelIOMMUNotifierNode IntelIOMMUNotifierNode;
|
||||
|
||||
/* Context-Entry */
|
||||
struct VTDContextEntry {
|
||||
@@ -93,6 +93,10 @@ struct VTDAddressSpace {
|
||||
MemoryRegion iommu_ir; /* Interrupt region: 0xfeeXXXXX */
|
||||
IntelIOMMUState *iommu_state;
|
||||
VTDContextCacheEntry context_cache_entry;
|
||||
QLIST_ENTRY(VTDAddressSpace) next;
|
||||
/* Superset of notifier flags that this address space has */
|
||||
IOMMUNotifierFlag notifier_flags;
|
||||
IOVATree *iova_tree; /* Traces mapped IOVA ranges */
|
||||
};
|
||||
|
||||
struct VTDBus {
|
||||
@@ -253,11 +257,6 @@ struct VTD_MSIMessage {
|
||||
/* When IR is enabled, all MSI/MSI-X data bits should be zero */
|
||||
#define VTD_IR_MSI_DATA (0)
|
||||
|
||||
struct IntelIOMMUNotifierNode {
|
||||
VTDAddressSpace *vtd_as;
|
||||
QLIST_ENTRY(IntelIOMMUNotifierNode) next;
|
||||
};
|
||||
|
||||
/* The iommu (DMAR) device state struct */
|
||||
struct IntelIOMMUState {
|
||||
X86IOMMUState x86_iommu;
|
||||
@@ -295,7 +294,7 @@ struct IntelIOMMUState {
|
||||
GHashTable *vtd_as_by_busptr; /* VTDBus objects indexed by PCIBus* reference */
|
||||
VTDBus *vtd_as_by_bus_num[VTD_PCI_BUS_MAX]; /* VTDBus objects indexed by bus number */
|
||||
/* list of registered notifiers */
|
||||
QLIST_HEAD(, IntelIOMMUNotifierNode) notifiers_list;
|
||||
QLIST_HEAD(, VTDAddressSpace) vtd_as_with_notifiers;
|
||||
|
||||
/* interrupt remapping */
|
||||
bool intr_enabled; /* Whether guest enabled IR */
|
||||
@@ -305,6 +304,12 @@ struct IntelIOMMUState {
|
||||
OnOffAuto intr_eim; /* Toggle for EIM cabability */
|
||||
bool buggy_eim; /* Force buggy EIM unless eim=off */
|
||||
uint8_t aw_bits; /* Host/IOVA address width (in bits) */
|
||||
|
||||
/*
|
||||
* Protects IOMMU states in general. Currently it protects the
|
||||
* per-IOMMU IOTLB cache, and context entry cache in VTDAddressSpace.
|
||||
*/
|
||||
QemuMutex iommu_lock;
|
||||
};
|
||||
|
||||
/* Find the VTD Address space associated with the given bus pointer,
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
#define NVDIMM_GET_CLASS(obj) OBJECT_GET_CLASS(NVDIMMClass, (obj), \
|
||||
TYPE_NVDIMM)
|
||||
|
||||
#define NVDIMM_LABLE_SIZE_PROP "label-size"
|
||||
#define NVDIMM_LABEL_SIZE_PROP "label-size"
|
||||
#define NVDIMM_UNARMED_PROP "unarmed"
|
||||
|
||||
struct NVDIMMDevice {
|
||||
|
||||
@@ -101,6 +101,7 @@ extern bool pci_available;
|
||||
#define PCI_DEVICE_ID_REDHAT_PCIE_RP 0x000c
|
||||
#define PCI_DEVICE_ID_REDHAT_XHCI 0x000d
|
||||
#define PCI_DEVICE_ID_REDHAT_PCIE_BRIDGE 0x000e
|
||||
#define PCI_DEVICE_ID_REDHAT_MDPY 0x000f
|
||||
#define PCI_DEVICE_ID_REDHAT_QXL 0x0100
|
||||
|
||||
#define FMT_PCIBUS PRIx64
|
||||
|
||||
@@ -52,6 +52,8 @@ typedef struct VirtioBusClass {
|
||||
bool (*has_extra_state)(DeviceState *d);
|
||||
bool (*query_guest_notifiers)(DeviceState *d);
|
||||
int (*set_guest_notifiers)(DeviceState *d, int nvqs, bool assign);
|
||||
int (*set_host_notifier_mr)(DeviceState *d, int n,
|
||||
MemoryRegion *mr, bool assign);
|
||||
void (*vmstate_change)(DeviceState *d, bool running);
|
||||
/*
|
||||
* Expose the features the transport layer supports before
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user