Import from AlmaLinux stable repository
This commit is contained in:
parent
cc70d981a7
commit
3cc7e40cee
38
SOURCES/kvm-Enable-amd-iommu-device.patch
Normal file
38
SOURCES/kvm-Enable-amd-iommu-device.patch
Normal file
@ -0,0 +1,38 @@
|
||||
From 0608561efc441f234d9aaf45f1867ffb5c43cffe Mon Sep 17 00:00:00 2001
|
||||
From: John Allen <john.allen@amd.com>
|
||||
Date: Wed, 11 Jun 2025 15:41:14 -0500
|
||||
Subject: [PATCH 26/57] Enable amd-iommu device
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 380: Add ability to manually specify the AMDVI-PCI device
|
||||
RH-Jira: RHEL-70925
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [3/3] 852500a18275e14bcd94d598ccd0ee33b76578dc (johnalle/qemu-kvm-fork)
|
||||
|
||||
Now that the amdvi-pci device that amd-iommu creates can be specified
|
||||
manually, amd-iommu device can be enabled.
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-70925
|
||||
|
||||
Upstream: RHEL ONLY
|
||||
|
||||
Signed-off-by: John Allen <johnalle@redhat.com>
|
||||
---
|
||||
configs/devices/x86_64-softmmu/x86_64-rh-devices.mak | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
index 3e5f693b62..2b15fdc2db 100644
|
||||
--- a/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
+++ b/configs/devices/x86_64-softmmu/x86_64-rh-devices.mak
|
||||
@@ -97,6 +97,7 @@ CONFIG_VIRTIO_MEM=y
|
||||
CONFIG_VIRTIO_PCI=y
|
||||
CONFIG_VIRTIO_VGA=y
|
||||
CONFIG_VIRTIO_IOMMU=y
|
||||
+CONFIG_AMD_IOMMU=y
|
||||
CONFIG_VMMOUSE=y
|
||||
CONFIG_VMPORT=y
|
||||
CONFIG_VTD=y
|
||||
--
|
||||
2.39.3
|
||||
|
||||
141
SOURCES/kvm-amd_iommu-Add-support-for-pass-though-mode.patch
Normal file
141
SOURCES/kvm-amd_iommu-Add-support-for-pass-though-mode.patch
Normal file
@ -0,0 +1,141 @@
|
||||
From 4114553452f7187283aefa001bc8342fc65b6b72 Mon Sep 17 00:00:00 2001
|
||||
From: John Allen <john.allen@amd.com>
|
||||
Date: Wed, 11 Dec 2024 15:06:48 -0600
|
||||
Subject: [PATCH 04/57] amd_iommu: Add support for pass though mode
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 303: Interrupt Remap support for emulated amd viommu
|
||||
RH-Jira: RHEL-66202
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [2/5] 0434fefd554baf27fb9d93026af513c621f8cdb0 (johnalle/qemu-kvm-fork)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-66202
|
||||
|
||||
commit c1f46999ef506d9854534560a94d02cf3cf9edd1
|
||||
Author: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Fri Sep 27 12:29:10 2024 -0500
|
||||
|
||||
amd_iommu: Add support for pass though mode
|
||||
|
||||
Introduce 'nodma' shared memory region to support PT mode
|
||||
so that for each device, we only create an alias to shared memory
|
||||
region when DMA-remapping is disabled.
|
||||
|
||||
Reviewed-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Signed-off-by: Santosh Shukla <santosh.shukla@amd.com>
|
||||
Message-Id: <20240927172913.121477-3-santosh.shukla@amd.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
|
||||
Signed-off-by: John Allen <john.allen@amd.com>
|
||||
---
|
||||
hw/i386/amd_iommu.c | 49 ++++++++++++++++++++++++++++++++++++---------
|
||||
hw/i386/amd_iommu.h | 2 ++
|
||||
2 files changed, 42 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index 148b5ee51d..567cb8adc9 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -60,8 +60,9 @@ struct AMDVIAddressSpace {
|
||||
uint8_t bus_num; /* bus number */
|
||||
uint8_t devfn; /* device function */
|
||||
AMDVIState *iommu_state; /* AMDVI - one per machine */
|
||||
- MemoryRegion root; /* AMDVI Root memory map region */
|
||||
+ MemoryRegion root; /* AMDVI Root memory map region */
|
||||
IOMMUMemoryRegion iommu; /* Device's address translation region */
|
||||
+ MemoryRegion iommu_nodma; /* Alias of shared nodma memory region */
|
||||
MemoryRegion iommu_ir; /* Device's interrupt remapping region */
|
||||
AddressSpace as; /* device's corresponding address space */
|
||||
};
|
||||
@@ -1412,6 +1413,7 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
AMDVIState *s = opaque;
|
||||
AMDVIAddressSpace **iommu_as, *amdvi_dev_as;
|
||||
int bus_num = pci_bus_num(bus);
|
||||
+ X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s);
|
||||
|
||||
iommu_as = s->address_spaces[bus_num];
|
||||
|
||||
@@ -1436,13 +1438,13 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
* Memory region relationships looks like (Address range shows
|
||||
* only lower 32 bits to make it short in length...):
|
||||
*
|
||||
- * |-----------------+-------------------+----------|
|
||||
- * | Name | Address range | Priority |
|
||||
- * |-----------------+-------------------+----------+
|
||||
- * | amdvi_root | 00000000-ffffffff | 0 |
|
||||
- * | amdvi_iommu | 00000000-ffffffff | 1 |
|
||||
- * | amdvi_iommu_ir | fee00000-feefffff | 64 |
|
||||
- * |-----------------+-------------------+----------|
|
||||
+ * |--------------------+-------------------+----------|
|
||||
+ * | Name | Address range | Priority |
|
||||
+ * |--------------------+-------------------+----------+
|
||||
+ * | amdvi-root | 00000000-ffffffff | 0 |
|
||||
+ * | amdvi-iommu_nodma | 00000000-ffffffff | 0 |
|
||||
+ * | amdvi-iommu_ir | fee00000-feefffff | 64 |
|
||||
+ * |--------------------+-------------------+----------|
|
||||
*/
|
||||
memory_region_init_iommu(&amdvi_dev_as->iommu,
|
||||
sizeof(amdvi_dev_as->iommu),
|
||||
@@ -1461,7 +1463,25 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
64);
|
||||
memory_region_add_subregion_overlap(&amdvi_dev_as->root, 0,
|
||||
MEMORY_REGION(&amdvi_dev_as->iommu),
|
||||
- 1);
|
||||
+ 0);
|
||||
+
|
||||
+ /* Build the DMA Disabled alias to shared memory */
|
||||
+ memory_region_init_alias(&amdvi_dev_as->iommu_nodma, OBJECT(s),
|
||||
+ "amdvi-sys", &s->mr_sys, 0,
|
||||
+ memory_region_size(&s->mr_sys));
|
||||
+ memory_region_add_subregion_overlap(&amdvi_dev_as->root, 0,
|
||||
+ &amdvi_dev_as->iommu_nodma,
|
||||
+ 0);
|
||||
+
|
||||
+ if (!x86_iommu->pt_supported) {
|
||||
+ memory_region_set_enabled(&amdvi_dev_as->iommu_nodma, false);
|
||||
+ memory_region_set_enabled(MEMORY_REGION(&amdvi_dev_as->iommu),
|
||||
+ true);
|
||||
+ } else {
|
||||
+ memory_region_set_enabled(MEMORY_REGION(&amdvi_dev_as->iommu),
|
||||
+ false);
|
||||
+ memory_region_set_enabled(&amdvi_dev_as->iommu_nodma, true);
|
||||
+ }
|
||||
}
|
||||
return &iommu_as[devfn]->as;
|
||||
}
|
||||
@@ -1602,6 +1622,17 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
|
||||
"amdvi-mmio", AMDVI_MMIO_SIZE);
|
||||
memory_region_add_subregion(get_system_memory(), AMDVI_BASE_ADDR,
|
||||
&s->mr_mmio);
|
||||
+
|
||||
+ /* Create the share memory regions by all devices */
|
||||
+ memory_region_init(&s->mr_sys, OBJECT(s), "amdvi-sys", UINT64_MAX);
|
||||
+
|
||||
+ /* set up the DMA disabled memory region */
|
||||
+ memory_region_init_alias(&s->mr_nodma, OBJECT(s),
|
||||
+ "amdvi-nodma", get_system_memory(), 0,
|
||||
+ memory_region_size(get_system_memory()));
|
||||
+ memory_region_add_subregion_overlap(&s->mr_sys, 0,
|
||||
+ &s->mr_nodma, 0);
|
||||
+
|
||||
pci_setup_iommu(bus, &amdvi_iommu_ops, s);
|
||||
amdvi_init(s);
|
||||
}
|
||||
diff --git a/hw/i386/amd_iommu.h b/hw/i386/amd_iommu.h
|
||||
index e5c2ae94f2..be417e51c4 100644
|
||||
--- a/hw/i386/amd_iommu.h
|
||||
+++ b/hw/i386/amd_iommu.h
|
||||
@@ -354,6 +354,8 @@ struct AMDVIState {
|
||||
uint32_t pprlog_tail; /* ppr log tail */
|
||||
|
||||
MemoryRegion mr_mmio; /* MMIO region */
|
||||
+ MemoryRegion mr_sys;
|
||||
+ MemoryRegion mr_nodma;
|
||||
uint8_t mmior[AMDVI_MMIO_SIZE]; /* read/write MMIO */
|
||||
uint8_t w1cmask[AMDVI_MMIO_SIZE]; /* read/write 1 clear mask */
|
||||
uint8_t romask[AMDVI_MMIO_SIZE]; /* MMIO read/only mask */
|
||||
--
|
||||
2.39.3
|
||||
|
||||
66
SOURCES/kvm-amd_iommu-Check-APIC-ID-255-for-XTSup.patch
Normal file
66
SOURCES/kvm-amd_iommu-Check-APIC-ID-255-for-XTSup.patch
Normal file
@ -0,0 +1,66 @@
|
||||
From 0397ebacdba6539147d9986255c3f81cbfdabf1e Mon Sep 17 00:00:00 2001
|
||||
From: John Allen <john.allen@amd.com>
|
||||
Date: Wed, 11 Dec 2024 15:07:03 -0600
|
||||
Subject: [PATCH 07/57] amd_iommu: Check APIC ID > 255 for XTSup
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 303: Interrupt Remap support for emulated amd viommu
|
||||
RH-Jira: RHEL-66202
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [5/5] f39b3e3cdefc2b562f1ad2ef939a37bf404f355a (johnalle/qemu-kvm-fork)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-66202
|
||||
|
||||
commit b12cb3819baf6d9ee8140d4dd6d36fa829e2c6d9
|
||||
Author: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Fri Sep 27 12:29:13 2024 -0500
|
||||
|
||||
amd_iommu: Check APIC ID > 255 for XTSup
|
||||
|
||||
The XTSup mode enables x2APIC support for AMD IOMMU, which is needed
|
||||
to support vcpu w/ APIC ID > 255.
|
||||
|
||||
Reviewed-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Signed-off-by: Santosh Shukla <santosh.shukla@amd.com>
|
||||
Message-Id: <20240927172913.121477-6-santosh.shukla@amd.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
|
||||
Signed-off-by: John Allen <john.allen@amd.com>
|
||||
---
|
||||
hw/i386/amd_iommu.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index 82d76dfca9..d804656ea8 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "trace.h"
|
||||
#include "hw/i386/apic-msidef.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
+#include "kvm/kvm_i386.h"
|
||||
|
||||
/* used AMD-Vi MMIO registers */
|
||||
const char *amdvi_mmio_low[] = {
|
||||
@@ -1651,6 +1652,16 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
|
||||
memory_region_add_subregion_overlap(&s->mr_sys, AMDVI_INT_ADDR_FIRST,
|
||||
&s->mr_ir, 1);
|
||||
|
||||
+ /* AMD IOMMU with x2APIC mode requires xtsup=on */
|
||||
+ if (x86ms->apic_id_limit > 255 && !s->xtsup) {
|
||||
+ error_report("AMD IOMMU with x2APIC confguration requires xtsup=on");
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+ if (s->xtsup && kvm_irqchip_is_split() && !kvm_enable_x2apic()) {
|
||||
+ error_report("AMD IOMMU xtsup=on requires support on the KVM side");
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+
|
||||
pci_setup_iommu(bus, &amdvi_iommu_ops, s);
|
||||
amdvi_init(s);
|
||||
}
|
||||
--
|
||||
2.39.3
|
||||
|
||||
94
SOURCES/kvm-amd_iommu-Rename-variable-mmio-to-mr_mmio.patch
Normal file
94
SOURCES/kvm-amd_iommu-Rename-variable-mmio-to-mr_mmio.patch
Normal file
@ -0,0 +1,94 @@
|
||||
From f733325d3d91576ae9f6e341faabc301542fc6c8 Mon Sep 17 00:00:00 2001
|
||||
From: John Allen <john.allen@amd.com>
|
||||
Date: Wed, 11 Dec 2024 15:06:44 -0600
|
||||
Subject: [PATCH 03/57] amd_iommu: Rename variable mmio to mr_mmio
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 303: Interrupt Remap support for emulated amd viommu
|
||||
RH-Jira: RHEL-66202
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [1/5] 1996a48efb7210d4d1e0b929be2d115d672e1a02 (johnalle/qemu-kvm-fork)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-66202
|
||||
|
||||
commit 2e6f051cfc58e69dcb392cd245d8f01b0c2e963f
|
||||
Author: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Fri Sep 27 12:29:09 2024 -0500
|
||||
|
||||
amd_iommu: Rename variable mmio to mr_mmio
|
||||
|
||||
Rename the MMIO memory region variable 'mmio' to 'mr_mmio'
|
||||
so to correctly name align with struct AMDVIState::variable type.
|
||||
|
||||
No functional change intended.
|
||||
|
||||
Reviewed-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Signed-off-by: Santosh Shukla <santosh.shukla@amd.com>
|
||||
Message-Id: <20240927172913.121477-2-santosh.shukla@amd.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
|
||||
Signed-off-by: John Allen <john.allen@amd.com>
|
||||
---
|
||||
hw/i386/acpi-build.c | 4 ++--
|
||||
hw/i386/amd_iommu.c | 6 +++---
|
||||
hw/i386/amd_iommu.h | 2 +-
|
||||
3 files changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
|
||||
index 5d4bd2b710..032fb1f904 100644
|
||||
--- a/hw/i386/acpi-build.c
|
||||
+++ b/hw/i386/acpi-build.c
|
||||
@@ -2397,7 +2397,7 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id,
|
||||
/* Capability offset */
|
||||
build_append_int_noprefix(table_data, s->pci.capab_offset, 2);
|
||||
/* IOMMU base address */
|
||||
- build_append_int_noprefix(table_data, s->mmio.addr, 8);
|
||||
+ build_append_int_noprefix(table_data, s->mr_mmio.addr, 8);
|
||||
/* PCI Segment Group */
|
||||
build_append_int_noprefix(table_data, 0, 2);
|
||||
/* IOMMU info */
|
||||
@@ -2432,7 +2432,7 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id,
|
||||
/* Capability offset */
|
||||
build_append_int_noprefix(table_data, s->pci.capab_offset, 2);
|
||||
/* IOMMU base address */
|
||||
- build_append_int_noprefix(table_data, s->mmio.addr, 8);
|
||||
+ build_append_int_noprefix(table_data, s->mr_mmio.addr, 8);
|
||||
/* PCI Segment Group */
|
||||
build_append_int_noprefix(table_data, 0, 2);
|
||||
/* IOMMU info */
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index 87643d2891..148b5ee51d 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -1598,10 +1598,10 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
|
||||
x86ms->ioapic_as = amdvi_host_dma_iommu(bus, s, AMDVI_IOAPIC_SB_DEVID);
|
||||
|
||||
/* set up MMIO */
|
||||
- memory_region_init_io(&s->mmio, OBJECT(s), &mmio_mem_ops, s, "amdvi-mmio",
|
||||
- AMDVI_MMIO_SIZE);
|
||||
+ memory_region_init_io(&s->mr_mmio, OBJECT(s), &mmio_mem_ops, s,
|
||||
+ "amdvi-mmio", AMDVI_MMIO_SIZE);
|
||||
memory_region_add_subregion(get_system_memory(), AMDVI_BASE_ADDR,
|
||||
- &s->mmio);
|
||||
+ &s->mr_mmio);
|
||||
pci_setup_iommu(bus, &amdvi_iommu_ops, s);
|
||||
amdvi_init(s);
|
||||
}
|
||||
diff --git a/hw/i386/amd_iommu.h b/hw/i386/amd_iommu.h
|
||||
index 73619fe9ea..e5c2ae94f2 100644
|
||||
--- a/hw/i386/amd_iommu.h
|
||||
+++ b/hw/i386/amd_iommu.h
|
||||
@@ -353,7 +353,7 @@ struct AMDVIState {
|
||||
uint32_t pprlog_head; /* ppr log head */
|
||||
uint32_t pprlog_tail; /* ppr log tail */
|
||||
|
||||
- MemoryRegion mmio; /* MMIO region */
|
||||
+ MemoryRegion mr_mmio; /* MMIO region */
|
||||
uint8_t mmior[AMDVI_MMIO_SIZE]; /* read/write MMIO */
|
||||
uint8_t w1cmask[AMDVI_MMIO_SIZE]; /* read/write 1 clear mask */
|
||||
uint8_t romask[AMDVI_MMIO_SIZE]; /* MMIO read/only mask */
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -0,0 +1,81 @@
|
||||
From 17ce6ac0d8edb04ba79bb39d3f695cd0506a9dc2 Mon Sep 17 00:00:00 2001
|
||||
From: John Allen <john.allen@amd.com>
|
||||
Date: Wed, 11 Dec 2024 15:06:59 -0600
|
||||
Subject: [PATCH 06/57] amd_iommu: Send notification when invalidate interrupt
|
||||
entry cache
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 303: Interrupt Remap support for emulated amd viommu
|
||||
RH-Jira: RHEL-66202
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [4/5] d57e8fb4e69f3c01d32673bf658aae5067d6b969 (johnalle/qemu-kvm-fork)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-66202
|
||||
|
||||
commit f84aad4d718b83d2a4d90485992e5421430032e1
|
||||
Author: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Fri Sep 27 12:29:12 2024 -0500
|
||||
|
||||
amd_iommu: Send notification when invalidate interrupt entry cache
|
||||
|
||||
In order to support AMD IOMMU interrupt remapping emulation with PCI
|
||||
pass-through devices, QEMU needs to notify VFIO when guest IOMMU driver
|
||||
updates and invalidate the guest interrupt remapping table (IRT), and
|
||||
communicate information so that the host IOMMU driver can update
|
||||
the shadowed interrupt remapping table in the host IOMMU.
|
||||
|
||||
Therefore, send notification when guest IOMMU emulates the IRT
|
||||
invalidation commands.
|
||||
|
||||
Reviewed-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Signed-off-by: Santosh Shukla <santosh.shukla@amd.com>
|
||||
Message-Id: <20240927172913.121477-5-santosh.shukla@amd.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
|
||||
Signed-off-by: John Allen <john.allen@amd.com>
|
||||
---
|
||||
hw/i386/amd_iommu.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index 8fcf5eacb4..82d76dfca9 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -431,6 +431,12 @@ static void amdvi_complete_ppr(AMDVIState *s, uint64_t *cmd)
|
||||
trace_amdvi_ppr_exec();
|
||||
}
|
||||
|
||||
+static void amdvi_intremap_inval_notify_all(AMDVIState *s, bool global,
|
||||
+ uint32_t index, uint32_t mask)
|
||||
+{
|
||||
+ x86_iommu_iec_notify_all(X86_IOMMU_DEVICE(s), global, index, mask);
|
||||
+}
|
||||
+
|
||||
static void amdvi_inval_all(AMDVIState *s, uint64_t *cmd)
|
||||
{
|
||||
if (extract64(cmd[0], 0, 60) || cmd[1]) {
|
||||
@@ -438,6 +444,9 @@ static void amdvi_inval_all(AMDVIState *s, uint64_t *cmd)
|
||||
s->cmdbuf + s->cmdbuf_head);
|
||||
}
|
||||
|
||||
+ /* Notify global invalidation */
|
||||
+ amdvi_intremap_inval_notify_all(s, true, 0, 0);
|
||||
+
|
||||
amdvi_iotlb_reset(s);
|
||||
trace_amdvi_all_inval();
|
||||
}
|
||||
@@ -486,6 +495,9 @@ static void amdvi_inval_inttable(AMDVIState *s, uint64_t *cmd)
|
||||
return;
|
||||
}
|
||||
|
||||
+ /* Notify global invalidation */
|
||||
+ amdvi_intremap_inval_notify_all(s, true, 0, 0);
|
||||
+
|
||||
trace_amdvi_intr_inval();
|
||||
}
|
||||
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -0,0 +1,105 @@
|
||||
From 4859d41adfaae8933e074dcefdc81edd3832c914 Mon Sep 17 00:00:00 2001
|
||||
From: John Allen <john.allen@amd.com>
|
||||
Date: Wed, 11 Dec 2024 15:06:55 -0600
|
||||
Subject: [PATCH 05/57] amd_iommu: Use shared memory region for Interrupt
|
||||
Remapping
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 303: Interrupt Remap support for emulated amd viommu
|
||||
RH-Jira: RHEL-66202
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [3/5] 48c0513c80257bfbd12c2cf3bab2503bd95d0b1c (johnalle/qemu-kvm-fork)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-66202
|
||||
|
||||
commit 9fc9dbac61ddde7d8df37e84c8e02cec249d3222
|
||||
Author: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Fri Sep 27 12:29:11 2024 -0500
|
||||
|
||||
amd_iommu: Use shared memory region for Interrupt Remapping
|
||||
|
||||
Use shared memory region for interrupt remapping which can be
|
||||
aliased by all devices.
|
||||
|
||||
Reviewed-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Signed-off-by: Santosh Shukla <santosh.shukla@amd.com>
|
||||
Message-Id: <20240927172913.121477-4-santosh.shukla@amd.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
|
||||
Signed-off-by: John Allen <john.allen@amd.com>
|
||||
---
|
||||
hw/i386/amd_iommu.c | 22 ++++++++++++++--------
|
||||
hw/i386/amd_iommu.h | 1 +
|
||||
2 files changed, 15 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index 567cb8adc9..8fcf5eacb4 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -1443,7 +1443,7 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
* |--------------------+-------------------+----------+
|
||||
* | amdvi-root | 00000000-ffffffff | 0 |
|
||||
* | amdvi-iommu_nodma | 00000000-ffffffff | 0 |
|
||||
- * | amdvi-iommu_ir | fee00000-feefffff | 64 |
|
||||
+ * | amdvi-iommu_ir | fee00000-feefffff | 1 |
|
||||
* |--------------------+-------------------+----------|
|
||||
*/
|
||||
memory_region_init_iommu(&amdvi_dev_as->iommu,
|
||||
@@ -1454,13 +1454,6 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
memory_region_init(&amdvi_dev_as->root, OBJECT(s),
|
||||
"amdvi_root", UINT64_MAX);
|
||||
address_space_init(&amdvi_dev_as->as, &amdvi_dev_as->root, name);
|
||||
- memory_region_init_io(&amdvi_dev_as->iommu_ir, OBJECT(s),
|
||||
- &amdvi_ir_ops, s, "amd_iommu_ir",
|
||||
- AMDVI_INT_ADDR_SIZE);
|
||||
- memory_region_add_subregion_overlap(&amdvi_dev_as->root,
|
||||
- AMDVI_INT_ADDR_FIRST,
|
||||
- &amdvi_dev_as->iommu_ir,
|
||||
- 64);
|
||||
memory_region_add_subregion_overlap(&amdvi_dev_as->root, 0,
|
||||
MEMORY_REGION(&amdvi_dev_as->iommu),
|
||||
0);
|
||||
@@ -1472,6 +1465,13 @@ static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
|
||||
memory_region_add_subregion_overlap(&amdvi_dev_as->root, 0,
|
||||
&amdvi_dev_as->iommu_nodma,
|
||||
0);
|
||||
+ /* Build the Interrupt Remapping alias to shared memory */
|
||||
+ memory_region_init_alias(&amdvi_dev_as->iommu_ir, OBJECT(s),
|
||||
+ "amdvi-ir", &s->mr_ir, 0,
|
||||
+ memory_region_size(&s->mr_ir));
|
||||
+ memory_region_add_subregion_overlap(MEMORY_REGION(&amdvi_dev_as->iommu),
|
||||
+ AMDVI_INT_ADDR_FIRST,
|
||||
+ &amdvi_dev_as->iommu_ir, 1);
|
||||
|
||||
if (!x86_iommu->pt_supported) {
|
||||
memory_region_set_enabled(&amdvi_dev_as->iommu_nodma, false);
|
||||
@@ -1633,6 +1633,12 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
|
||||
memory_region_add_subregion_overlap(&s->mr_sys, 0,
|
||||
&s->mr_nodma, 0);
|
||||
|
||||
+ /* set up the Interrupt Remapping memory region */
|
||||
+ memory_region_init_io(&s->mr_ir, OBJECT(s), &amdvi_ir_ops,
|
||||
+ s, "amdvi-ir", AMDVI_INT_ADDR_SIZE);
|
||||
+ memory_region_add_subregion_overlap(&s->mr_sys, AMDVI_INT_ADDR_FIRST,
|
||||
+ &s->mr_ir, 1);
|
||||
+
|
||||
pci_setup_iommu(bus, &amdvi_iommu_ops, s);
|
||||
amdvi_init(s);
|
||||
}
|
||||
diff --git a/hw/i386/amd_iommu.h b/hw/i386/amd_iommu.h
|
||||
index be417e51c4..e0dac4d9a9 100644
|
||||
--- a/hw/i386/amd_iommu.h
|
||||
+++ b/hw/i386/amd_iommu.h
|
||||
@@ -356,6 +356,7 @@ struct AMDVIState {
|
||||
MemoryRegion mr_mmio; /* MMIO region */
|
||||
MemoryRegion mr_sys;
|
||||
MemoryRegion mr_nodma;
|
||||
+ MemoryRegion mr_ir;
|
||||
uint8_t mmior[AMDVI_MMIO_SIZE]; /* read/write MMIO */
|
||||
uint8_t w1cmask[AMDVI_MMIO_SIZE]; /* read/write 1 clear mask */
|
||||
uint8_t romask[AMDVI_MMIO_SIZE]; /* MMIO read/only mask */
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
From 173beb6698538dcffefab36772e107ffb0b4fbbd Mon Sep 17 00:00:00 2001
|
||||
From: Shaoqin Huang <shahuang@redhat.com>
|
||||
Date: Mon, 28 Apr 2025 04:34:27 -0400
|
||||
Subject: [PATCH 2/5] arm: Use arm_virt_compat_set() to apply the compat
|
||||
|
||||
RH-Author: Shaoqin Huang <shahuang@redhat.com>
|
||||
RH-MergeRequest: 353: virtio-net: disable USO for virt-rhel9.6
|
||||
RH-Jira: RHEL-80313
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
|
||||
RH-Commit: [2/2] 6e7a158e65296928040e70622b3cee59e45c1c36 (shahuang/qemu-kvm)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-80313
|
||||
Upstream Status: RHEL only
|
||||
|
||||
Since the pauth and uso both should apply for the latest machine type,
|
||||
move them to the arm_virt_compat_set() which applies the compat to all
|
||||
machine types automatically.
|
||||
|
||||
Signed-off-by: Shaoqin Huang <shahuang@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 896deaa025..2aef94e776 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -127,6 +127,10 @@ static void arm_virt_compat_set(MachineClass *mc)
|
||||
arm_virt_compat_len);
|
||||
compat_props_add(mc->compat_props, arm_rhel_compat,
|
||||
arm_rhel_compat_len);
|
||||
+ compat_props_add(mc->compat_props, arm_rhel9_compat,
|
||||
+ arm_rhel9_compat_len);
|
||||
+ compat_props_add(mc->compat_props, hw_compat_rhel_9,
|
||||
+ hw_compat_rhel_9_len);
|
||||
}
|
||||
|
||||
#define DEFINE_VIRT_MACHINE_IMPL(latest, ...) \
|
||||
@@ -3599,10 +3603,6 @@ DEFINE_VIRT_MACHINE(2, 6)
|
||||
|
||||
static void virt_rhel_machine_9_6_0_options(MachineClass *mc)
|
||||
{
|
||||
- compat_props_add(mc->compat_props, arm_rhel9_compat, arm_rhel9_compat_len);
|
||||
-
|
||||
- /* NB: remember to move this line to the *latest* RHEL 9 machine */
|
||||
- compat_props_add(mc->compat_props, hw_compat_rhel_9, hw_compat_rhel_9_len);
|
||||
}
|
||||
DEFINE_VIRT_MACHINE_AS_LATEST(9, 6, 0)
|
||||
|
||||
--
|
||||
2.48.1
|
||||
|
||||
145
SOURCES/kvm-block-Add-new-bdrv_co_is_all_zeroes-function.patch
Normal file
145
SOURCES/kvm-block-Add-new-bdrv_co_is_all_zeroes-function.patch
Normal file
@ -0,0 +1,145 @@
|
||||
From f2cd96a040dd7863484d22a3995a2904605dadde Mon Sep 17 00:00:00 2001
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Fri, 9 May 2025 15:40:21 -0500
|
||||
Subject: [PATCH 06/16] block: Add new bdrv_co_is_all_zeroes() function
|
||||
|
||||
RH-Author: Eric Blake <eblake@redhat.com>
|
||||
RH-MergeRequest: 365: blockdev-mirror: More efficient handling of sparse mirrors
|
||||
RH-Jira: RHEL-82906 RHEL-83015
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-Commit: [4/14] aabcba8323df698a72842f299e9242a5eee3aea6 (ebblake/centos-qemu-kvm)
|
||||
|
||||
There are some optimizations that require knowing if an image starts
|
||||
out as reading all zeroes, such as making blockdev-mirror faster by
|
||||
skipping the copying of source zeroes to the destination. The
|
||||
existing bdrv_co_is_zero_fast() is a good building block for answering
|
||||
this question, but it tends to give an answer of 0 for a file we just
|
||||
created via QMP 'blockdev-create' or similar (such as 'qemu-img create
|
||||
-f raw'). Why? Because file-posix.c insists on allocating a tiny
|
||||
header to any file rather than leaving it 100% sparse, due to some
|
||||
filesystems that are unable to answer alignment probes on a hole. But
|
||||
teaching file-posix.c to read the tiny header doesn't scale - the
|
||||
problem of a small header is also visible when libvirt sets up an NBD
|
||||
client to a just-created file on a migration destination host.
|
||||
|
||||
So, we need a wrapper function that handles a bit more complexity in a
|
||||
common manner for all block devices - when the BDS is mostly a hole,
|
||||
but has a small non-hole header, it is still worth the time to read
|
||||
that header and check if it reads as all zeroes before giving up and
|
||||
returning a pessimistic answer.
|
||||
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250509204341.3553601-19-eblake@redhat.com>
|
||||
(cherry picked from commit 52726096707c5c8b90597c445de897fa64d56e73)
|
||||
Conflicts:
|
||||
block/io.c - context with header names
|
||||
Jira: https://issues.redhat.com/browse/RHEL-82906
|
||||
Jira: https://issues.redhat.com/browse/RHEL-83015
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
---
|
||||
block/io.c | 62 ++++++++++++++++++++++++++++++++++++++++
|
||||
include/block/block-io.h | 2 ++
|
||||
2 files changed, 64 insertions(+)
|
||||
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index 293c5dd393..1f01337599 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -38,10 +38,14 @@
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "sysemu/replay.h"
|
||||
+#include "qemu/units.h"
|
||||
|
||||
/* Maximum bounce buffer for copy-on-read and write zeroes, in bytes */
|
||||
#define MAX_BOUNCE_BUFFER (32768 << BDRV_SECTOR_BITS)
|
||||
|
||||
+/* Maximum read size for checking if data reads as zero, in bytes */
|
||||
+#define MAX_ZERO_CHECK_BUFFER (128 * KiB)
|
||||
+
|
||||
static void coroutine_fn GRAPH_RDLOCK
|
||||
bdrv_parent_cb_resize(BlockDriverState *bs);
|
||||
|
||||
@@ -2774,6 +2778,64 @@ int coroutine_fn bdrv_co_is_zero_fast(BlockDriverState *bs, int64_t offset,
|
||||
return 1;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Check @bs (and its backing chain) to see if the entire image is known
|
||||
+ * to read as zeroes.
|
||||
+ * Return 1 if that is the case, 0 otherwise and -errno on error.
|
||||
+ * This test is meant to be fast rather than accurate so returning 0
|
||||
+ * does not guarantee non-zero data; however, a return of 1 is reliable,
|
||||
+ * and this function can report 1 in more cases than bdrv_co_is_zero_fast.
|
||||
+ */
|
||||
+int coroutine_fn bdrv_co_is_all_zeroes(BlockDriverState *bs)
|
||||
+{
|
||||
+ int ret;
|
||||
+ int64_t pnum, bytes;
|
||||
+ char *buf;
|
||||
+ QEMUIOVector local_qiov;
|
||||
+ IO_CODE();
|
||||
+
|
||||
+ bytes = bdrv_co_getlength(bs);
|
||||
+ if (bytes < 0) {
|
||||
+ return bytes;
|
||||
+ }
|
||||
+
|
||||
+ /* First probe - see if the entire image reads as zero */
|
||||
+ ret = bdrv_co_common_block_status_above(bs, NULL, false, BDRV_WANT_ZERO,
|
||||
+ 0, bytes, &pnum, NULL, NULL,
|
||||
+ NULL);
|
||||
+ if (ret < 0) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+ if (ret & BDRV_BLOCK_ZERO) {
|
||||
+ return bdrv_co_is_zero_fast(bs, pnum, bytes - pnum);
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Because of the way 'blockdev-create' works, raw files tend to
|
||||
+ * be created with a non-sparse region at the front to make
|
||||
+ * alignment probing easier. If the block starts with only a
|
||||
+ * small allocated region, it is still worth the effort to see if
|
||||
+ * the rest of the image is still sparse, coupled with manually
|
||||
+ * reading the first region to see if it reads zero after all.
|
||||
+ */
|
||||
+ if (pnum > MAX_ZERO_CHECK_BUFFER) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+ ret = bdrv_co_is_zero_fast(bs, pnum, bytes - pnum);
|
||||
+ if (ret <= 0) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+ /* Only the head of the image is unknown, and it's small. Read it. */
|
||||
+ buf = qemu_blockalign(bs, pnum);
|
||||
+ qemu_iovec_init_buf(&local_qiov, buf, pnum);
|
||||
+ ret = bdrv_driver_preadv(bs, 0, pnum, &local_qiov, 0, 0);
|
||||
+ if (ret >= 0) {
|
||||
+ ret = buffer_is_zero(buf, pnum);
|
||||
+ }
|
||||
+ qemu_vfree(buf);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
int coroutine_fn bdrv_co_is_allocated(BlockDriverState *bs, int64_t offset,
|
||||
int64_t bytes, int64_t *pnum)
|
||||
{
|
||||
diff --git a/include/block/block-io.h b/include/block/block-io.h
|
||||
index b49e0537dd..b99cc98d26 100644
|
||||
--- a/include/block/block-io.h
|
||||
+++ b/include/block/block-io.h
|
||||
@@ -161,6 +161,8 @@ bdrv_is_allocated_above(BlockDriverState *bs, BlockDriverState *base,
|
||||
|
||||
int coroutine_fn GRAPH_RDLOCK
|
||||
bdrv_co_is_zero_fast(BlockDriverState *bs, int64_t offset, int64_t bytes);
|
||||
+int coroutine_fn GRAPH_RDLOCK
|
||||
+bdrv_co_is_all_zeroes(BlockDriverState *bs);
|
||||
|
||||
int GRAPH_RDLOCK
|
||||
bdrv_apply_auto_read_only(BlockDriverState *bs, const char *errmsg,
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -0,0 +1,689 @@
|
||||
From 26f5d221dd16137bed3527ee120cdf085e2c7e23 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Fri, 9 May 2025 15:40:18 -0500
|
||||
Subject: [PATCH 03/16] block: Expand block status mode from bool to flags
|
||||
|
||||
RH-Author: Eric Blake <eblake@redhat.com>
|
||||
RH-MergeRequest: 365: blockdev-mirror: More efficient handling of sparse mirrors
|
||||
RH-Jira: RHEL-82906 RHEL-83015
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-Commit: [1/14] 9de5245def80e9815ed306e4abce9caec56cef6f (ebblake/centos-qemu-kvm)
|
||||
|
||||
This patch is purely mechanical, changing bool want_zero into an
|
||||
unsigned int for bitwise-or of flags. As of this patch, all
|
||||
implementations are unchanged (the old want_zero==true is now
|
||||
mode==BDRV_WANT_PRECISE which is a superset of BDRV_WANT_ZERO); but
|
||||
the callers in io.c that used to pass want_zero==false are now
|
||||
prepared for future driver changes that can now distinguish bewteen
|
||||
BDRV_WANT_ZERO vs. BDRV_WANT_ALLOCATED. The next patch will actually
|
||||
change the file-posix driver along those lines, now that we have
|
||||
more-specific hints.
|
||||
|
||||
As for the background why this patch is useful: right now, the
|
||||
file-posix driver recognizes that if allocation is being queried, the
|
||||
entire image can be reported as allocated (there is no backing file to
|
||||
refer to) - but this throws away information on whether the entire
|
||||
image reads as zero (trivially true if lseek(SEEK_HOLE) at offset 0
|
||||
returns -ENXIO, a bit more complicated to prove if the raw file was
|
||||
created with 'qemu-img create' since we intentionally allocate a small
|
||||
chunk of all-zero data to help with alignment probing). Later patches
|
||||
will add a generic algorithm for seeing if an entire file reads as
|
||||
zeroes.
|
||||
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250509204341.3553601-16-eblake@redhat.com>
|
||||
(cherry picked from commit c33159dec79069514f78faecfe268439226b0f5b)
|
||||
Jira: https://issues.redhat.com/browse/RHEL-82906
|
||||
Jira: https://issues.redhat.com/browse/RHEL-83015
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
---
|
||||
block/blkdebug.c | 6 ++--
|
||||
block/copy-before-write.c | 4 +--
|
||||
block/coroutines.h | 4 +--
|
||||
block/file-posix.c | 4 +--
|
||||
block/gluster.c | 4 +--
|
||||
block/io.c | 51 ++++++++++++++++----------------
|
||||
block/iscsi.c | 6 ++--
|
||||
block/nbd.c | 4 +--
|
||||
block/null.c | 6 ++--
|
||||
block/parallels.c | 6 ++--
|
||||
block/qcow.c | 2 +-
|
||||
block/qcow2.c | 6 ++--
|
||||
block/qed.c | 6 ++--
|
||||
block/quorum.c | 4 +--
|
||||
block/raw-format.c | 4 +--
|
||||
block/rbd.c | 6 ++--
|
||||
block/snapshot-access.c | 4 +--
|
||||
block/vdi.c | 4 +--
|
||||
block/vmdk.c | 2 +-
|
||||
block/vpc.c | 2 +-
|
||||
block/vvfat.c | 6 ++--
|
||||
include/block/block-common.h | 11 +++++++
|
||||
include/block/block_int-common.h | 27 +++++++++--------
|
||||
include/block/block_int-io.h | 4 +--
|
||||
tests/unit/test-block-iothread.c | 2 +-
|
||||
25 files changed, 99 insertions(+), 86 deletions(-)
|
||||
|
||||
diff --git a/block/blkdebug.c b/block/blkdebug.c
|
||||
index c95c818c38..736ae2b56b 100644
|
||||
--- a/block/blkdebug.c
|
||||
+++ b/block/blkdebug.c
|
||||
@@ -751,9 +751,9 @@ blkdebug_co_pdiscard(BlockDriverState *bs, int64_t offset, int64_t bytes)
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-blkdebug_co_block_status(BlockDriverState *bs, bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
- BlockDriverState **file)
|
||||
+blkdebug_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes, int64_t *pnum,
|
||||
+ int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
int err;
|
||||
|
||||
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
||||
index 853e01a1eb..36488cdeca 100644
|
||||
--- a/block/copy-before-write.c
|
||||
+++ b/block/copy-before-write.c
|
||||
@@ -290,8 +290,8 @@ cbw_co_preadv_snapshot(BlockDriverState *bs, int64_t offset, int64_t bytes,
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-cbw_co_snapshot_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset, int64_t bytes,
|
||||
+cbw_co_snapshot_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes,
|
||||
int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
diff --git a/block/coroutines.h b/block/coroutines.h
|
||||
index f3226682d6..811ef12e43 100644
|
||||
--- a/block/coroutines.h
|
||||
+++ b/block/coroutines.h
|
||||
@@ -47,7 +47,7 @@ int coroutine_fn GRAPH_RDLOCK
|
||||
bdrv_co_common_block_status_above(BlockDriverState *bs,
|
||||
BlockDriverState *base,
|
||||
bool include_base,
|
||||
- bool want_zero,
|
||||
+ unsigned int mode,
|
||||
int64_t offset,
|
||||
int64_t bytes,
|
||||
int64_t *pnum,
|
||||
@@ -78,7 +78,7 @@ int co_wrapper_mixed_bdrv_rdlock
|
||||
bdrv_common_block_status_above(BlockDriverState *bs,
|
||||
BlockDriverState *base,
|
||||
bool include_base,
|
||||
- bool want_zero,
|
||||
+ unsigned int mode,
|
||||
int64_t offset,
|
||||
int64_t bytes,
|
||||
int64_t *pnum,
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index f17a3f4d10..9ca55620ca 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -3277,7 +3277,7 @@ static int find_allocation(BlockDriverState *bs, off_t start,
|
||||
* well exceed it.
|
||||
*/
|
||||
static int coroutine_fn raw_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero,
|
||||
+ unsigned int mode,
|
||||
int64_t offset,
|
||||
int64_t bytes, int64_t *pnum,
|
||||
int64_t *map,
|
||||
@@ -3293,7 +3293,7 @@ static int coroutine_fn raw_co_block_status(BlockDriverState *bs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (!want_zero) {
|
||||
+ if (mode != BDRV_WANT_PRECISE) {
|
||||
*pnum = bytes;
|
||||
*map = offset;
|
||||
*file = bs;
|
||||
diff --git a/block/gluster.c b/block/gluster.c
|
||||
index f8b415f381..ae5c45666b 100644
|
||||
--- a/block/gluster.c
|
||||
+++ b/block/gluster.c
|
||||
@@ -1466,7 +1466,7 @@ exit:
|
||||
* (Based on raw_co_block_status() from file-posix.c.)
|
||||
*/
|
||||
static int coroutine_fn qemu_gluster_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero,
|
||||
+ unsigned int mode,
|
||||
int64_t offset,
|
||||
int64_t bytes,
|
||||
int64_t *pnum,
|
||||
@@ -1483,7 +1483,7 @@ static int coroutine_fn qemu_gluster_co_block_status(BlockDriverState *bs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (!want_zero) {
|
||||
+ if (mode != BDRV_WANT_PRECISE) {
|
||||
*pnum = bytes;
|
||||
*map = offset;
|
||||
*file = bs;
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index 3e189837a1..daaafe00d7 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -2360,10 +2360,8 @@ int bdrv_flush_all(void)
|
||||
* Drivers not implementing the functionality are assumed to not support
|
||||
* backing files, hence all their sectors are reported as allocated.
|
||||
*
|
||||
- * If 'want_zero' is true, the caller is querying for mapping
|
||||
- * purposes, with a focus on valid BDRV_BLOCK_OFFSET_VALID, _DATA, and
|
||||
- * _ZERO where possible; otherwise, the result favors larger 'pnum',
|
||||
- * with a focus on accurate BDRV_BLOCK_ALLOCATED.
|
||||
+ * 'mode' serves as a hint as to which results are favored; see the
|
||||
+ * BDRV_WANT_* macros for details.
|
||||
*
|
||||
* If 'offset' is beyond the end of the disk image the return value is
|
||||
* BDRV_BLOCK_EOF and 'pnum' is set to 0.
|
||||
@@ -2383,7 +2381,7 @@ int bdrv_flush_all(void)
|
||||
* set to the host mapping and BDS corresponding to the guest offset.
|
||||
*/
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-bdrv_co_do_block_status(BlockDriverState *bs, bool want_zero,
|
||||
+bdrv_co_do_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
int64_t offset, int64_t bytes,
|
||||
int64_t *pnum, int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
@@ -2472,7 +2470,7 @@ bdrv_co_do_block_status(BlockDriverState *bs, bool want_zero,
|
||||
local_file = bs;
|
||||
local_map = aligned_offset;
|
||||
} else {
|
||||
- ret = bs->drv->bdrv_co_block_status(bs, want_zero, aligned_offset,
|
||||
+ ret = bs->drv->bdrv_co_block_status(bs, mode, aligned_offset,
|
||||
aligned_bytes, pnum, &local_map,
|
||||
&local_file);
|
||||
|
||||
@@ -2484,10 +2482,10 @@ bdrv_co_do_block_status(BlockDriverState *bs, bool want_zero,
|
||||
* the cache requires an RCU update, so double check here to avoid
|
||||
* such an update if possible.
|
||||
*
|
||||
- * Check want_zero, because we only want to update the cache when we
|
||||
+ * Check mode, because we only want to update the cache when we
|
||||
* have accurate information about what is zero and what is data.
|
||||
*/
|
||||
- if (want_zero &&
|
||||
+ if (mode == BDRV_WANT_PRECISE &&
|
||||
ret == (BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID) &&
|
||||
QLIST_EMPTY(&bs->children))
|
||||
{
|
||||
@@ -2544,7 +2542,7 @@ bdrv_co_do_block_status(BlockDriverState *bs, bool want_zero,
|
||||
|
||||
if (ret & BDRV_BLOCK_RAW) {
|
||||
assert(ret & BDRV_BLOCK_OFFSET_VALID && local_file);
|
||||
- ret = bdrv_co_do_block_status(local_file, want_zero, local_map,
|
||||
+ ret = bdrv_co_do_block_status(local_file, mode, local_map,
|
||||
*pnum, pnum, &local_map, &local_file);
|
||||
goto out;
|
||||
}
|
||||
@@ -2556,7 +2554,7 @@ bdrv_co_do_block_status(BlockDriverState *bs, bool want_zero,
|
||||
|
||||
if (!cow_bs) {
|
||||
ret |= BDRV_BLOCK_ZERO;
|
||||
- } else if (want_zero) {
|
||||
+ } else if (mode == BDRV_WANT_PRECISE) {
|
||||
int64_t size2 = bdrv_co_getlength(cow_bs);
|
||||
|
||||
if (size2 >= 0 && offset >= size2) {
|
||||
@@ -2565,14 +2563,14 @@ bdrv_co_do_block_status(BlockDriverState *bs, bool want_zero,
|
||||
}
|
||||
}
|
||||
|
||||
- if (want_zero && ret & BDRV_BLOCK_RECURSE &&
|
||||
+ if (mode == BDRV_WANT_PRECISE && ret & BDRV_BLOCK_RECURSE &&
|
||||
local_file && local_file != bs &&
|
||||
(ret & BDRV_BLOCK_DATA) && !(ret & BDRV_BLOCK_ZERO) &&
|
||||
(ret & BDRV_BLOCK_OFFSET_VALID)) {
|
||||
int64_t file_pnum;
|
||||
int ret2;
|
||||
|
||||
- ret2 = bdrv_co_do_block_status(local_file, want_zero, local_map,
|
||||
+ ret2 = bdrv_co_do_block_status(local_file, mode, local_map,
|
||||
*pnum, &file_pnum, NULL, NULL);
|
||||
if (ret2 >= 0) {
|
||||
/* Ignore errors. This is just providing extra information, it
|
||||
@@ -2623,7 +2621,7 @@ int coroutine_fn
|
||||
bdrv_co_common_block_status_above(BlockDriverState *bs,
|
||||
BlockDriverState *base,
|
||||
bool include_base,
|
||||
- bool want_zero,
|
||||
+ unsigned int mode,
|
||||
int64_t offset,
|
||||
int64_t bytes,
|
||||
int64_t *pnum,
|
||||
@@ -2650,7 +2648,7 @@ bdrv_co_common_block_status_above(BlockDriverState *bs,
|
||||
return 0;
|
||||
}
|
||||
|
||||
- ret = bdrv_co_do_block_status(bs, want_zero, offset, bytes, pnum,
|
||||
+ ret = bdrv_co_do_block_status(bs, mode, offset, bytes, pnum,
|
||||
map, file);
|
||||
++*depth;
|
||||
if (ret < 0 || *pnum == 0 || ret & BDRV_BLOCK_ALLOCATED || bs == base) {
|
||||
@@ -2667,7 +2665,7 @@ bdrv_co_common_block_status_above(BlockDriverState *bs,
|
||||
for (p = bdrv_filter_or_cow_bs(bs); include_base || p != base;
|
||||
p = bdrv_filter_or_cow_bs(p))
|
||||
{
|
||||
- ret = bdrv_co_do_block_status(p, want_zero, offset, bytes, pnum,
|
||||
+ ret = bdrv_co_do_block_status(p, mode, offset, bytes, pnum,
|
||||
map, file);
|
||||
++*depth;
|
||||
if (ret < 0) {
|
||||
@@ -2730,7 +2728,8 @@ int coroutine_fn bdrv_co_block_status_above(BlockDriverState *bs,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
IO_CODE();
|
||||
- return bdrv_co_common_block_status_above(bs, base, false, true, offset,
|
||||
+ return bdrv_co_common_block_status_above(bs, base, false,
|
||||
+ BDRV_WANT_PRECISE, offset,
|
||||
bytes, pnum, map, file, NULL);
|
||||
}
|
||||
|
||||
@@ -2761,8 +2760,9 @@ int coroutine_fn bdrv_co_is_zero_fast(BlockDriverState *bs, int64_t offset,
|
||||
return 1;
|
||||
}
|
||||
|
||||
- ret = bdrv_co_common_block_status_above(bs, NULL, false, false, offset,
|
||||
- bytes, &pnum, NULL, NULL, NULL);
|
||||
+ ret = bdrv_co_common_block_status_above(bs, NULL, false, BDRV_WANT_ZERO,
|
||||
+ offset, bytes, &pnum, NULL, NULL,
|
||||
+ NULL);
|
||||
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
@@ -2778,9 +2778,9 @@ int coroutine_fn bdrv_co_is_allocated(BlockDriverState *bs, int64_t offset,
|
||||
int64_t dummy;
|
||||
IO_CODE();
|
||||
|
||||
- ret = bdrv_co_common_block_status_above(bs, bs, true, false, offset,
|
||||
- bytes, pnum ? pnum : &dummy, NULL,
|
||||
- NULL, NULL);
|
||||
+ ret = bdrv_co_common_block_status_above(bs, bs, true, BDRV_WANT_ALLOCATED,
|
||||
+ offset, bytes, pnum ? pnum : &dummy,
|
||||
+ NULL, NULL, NULL);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@@ -2813,7 +2813,8 @@ int coroutine_fn bdrv_co_is_allocated_above(BlockDriverState *bs,
|
||||
int ret;
|
||||
IO_CODE();
|
||||
|
||||
- ret = bdrv_co_common_block_status_above(bs, base, include_base, false,
|
||||
+ ret = bdrv_co_common_block_status_above(bs, base, include_base,
|
||||
+ BDRV_WANT_ALLOCATED,
|
||||
offset, bytes, pnum, NULL, NULL,
|
||||
&depth);
|
||||
if (ret < 0) {
|
||||
@@ -3710,8 +3711,8 @@ bdrv_co_preadv_snapshot(BdrvChild *child, int64_t offset, int64_t bytes,
|
||||
}
|
||||
|
||||
int coroutine_fn
|
||||
-bdrv_co_snapshot_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset, int64_t bytes,
|
||||
+bdrv_co_snapshot_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes,
|
||||
int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
@@ -3729,7 +3730,7 @@ bdrv_co_snapshot_block_status(BlockDriverState *bs,
|
||||
}
|
||||
|
||||
bdrv_inc_in_flight(bs);
|
||||
- ret = drv->bdrv_co_snapshot_block_status(bs, want_zero, offset, bytes,
|
||||
+ ret = drv->bdrv_co_snapshot_block_status(bs, mode, offset, bytes,
|
||||
pnum, map, file);
|
||||
bdrv_dec_in_flight(bs);
|
||||
|
||||
diff --git a/block/iscsi.c b/block/iscsi.c
|
||||
index 979bf90cb7..d7caa4b363 100644
|
||||
--- a/block/iscsi.c
|
||||
+++ b/block/iscsi.c
|
||||
@@ -694,9 +694,9 @@ out_unlock:
|
||||
|
||||
|
||||
static int coroutine_fn iscsi_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum,
|
||||
- int64_t *map,
|
||||
+ unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes,
|
||||
+ int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
IscsiLun *iscsilun = bs->opaque;
|
||||
diff --git a/block/nbd.c b/block/nbd.c
|
||||
index d464315766..a359aa236e 100644
|
||||
--- a/block/nbd.c
|
||||
+++ b/block/nbd.c
|
||||
@@ -1397,8 +1397,8 @@ nbd_client_co_pdiscard(BlockDriverState *bs, int64_t offset, int64_t bytes)
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK nbd_client_co_block_status(
|
||||
- BlockDriverState *bs, bool want_zero, int64_t offset, int64_t bytes,
|
||||
- int64_t *pnum, int64_t *map, BlockDriverState **file)
|
||||
+ BlockDriverState *bs, unsigned int mode, int64_t offset,
|
||||
+ int64_t bytes, int64_t *pnum, int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
int ret, request_ret;
|
||||
NBDExtent64 extent = { 0 };
|
||||
diff --git a/block/null.c b/block/null.c
|
||||
index 4730acc1eb..95021230c8 100644
|
||||
--- a/block/null.c
|
||||
+++ b/block/null.c
|
||||
@@ -227,9 +227,9 @@ static int null_reopen_prepare(BDRVReopenState *reopen_state,
|
||||
}
|
||||
|
||||
static int coroutine_fn null_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum,
|
||||
- int64_t *map,
|
||||
+ unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes,
|
||||
+ int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
BDRVNullState *s = bs->opaque;
|
||||
diff --git a/block/parallels.c b/block/parallels.c
|
||||
index 9205a0864f..22ea7834fd 100644
|
||||
--- a/block/parallels.c
|
||||
+++ b/block/parallels.c
|
||||
@@ -416,9 +416,9 @@ parallels_co_flush_to_os(BlockDriverState *bs)
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-parallels_co_block_status(BlockDriverState *bs, bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
- BlockDriverState **file)
|
||||
+parallels_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes, int64_t *pnum,
|
||||
+ int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
BDRVParallelsState *s = bs->opaque;
|
||||
int count;
|
||||
diff --git a/block/qcow.c b/block/qcow.c
|
||||
index c2f89db055..2e18c42d8f 100644
|
||||
--- a/block/qcow.c
|
||||
+++ b/block/qcow.c
|
||||
@@ -530,7 +530,7 @@ get_cluster_offset(BlockDriverState *bs, uint64_t offset, int allocate,
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-qcow_co_block_status(BlockDriverState *bs, bool want_zero,
|
||||
+qcow_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
int64_t offset, int64_t bytes, int64_t *pnum,
|
||||
int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
diff --git a/block/qcow2.c b/block/qcow2.c
|
||||
index a4cffb628c..788da07fee 100644
|
||||
--- a/block/qcow2.c
|
||||
+++ b/block/qcow2.c
|
||||
@@ -2147,9 +2147,9 @@ static void qcow2_join_options(QDict *options, QDict *old_options)
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-qcow2_co_block_status(BlockDriverState *bs, bool want_zero, int64_t offset,
|
||||
- int64_t count, int64_t *pnum, int64_t *map,
|
||||
- BlockDriverState **file)
|
||||
+qcow2_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t count, int64_t *pnum,
|
||||
+ int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
BDRVQcow2State *s = bs->opaque;
|
||||
uint64_t host_offset;
|
||||
diff --git a/block/qed.c b/block/qed.c
|
||||
index fa5bc11085..b135e981e5 100644
|
||||
--- a/block/qed.c
|
||||
+++ b/block/qed.c
|
||||
@@ -832,9 +832,9 @@ fail:
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-bdrv_qed_co_block_status(BlockDriverState *bs, bool want_zero, int64_t pos,
|
||||
- int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
- BlockDriverState **file)
|
||||
+bdrv_qed_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t pos, int64_t bytes, int64_t *pnum,
|
||||
+ int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
BDRVQEDState *s = bs->opaque;
|
||||
size_t len = MIN(bytes, SIZE_MAX);
|
||||
diff --git a/block/quorum.c b/block/quorum.c
|
||||
index db8fe891c4..bb4ed9483e 100644
|
||||
--- a/block/quorum.c
|
||||
+++ b/block/quorum.c
|
||||
@@ -1226,7 +1226,7 @@ static void quorum_child_perm(BlockDriverState *bs, BdrvChild *c,
|
||||
* region contains zeroes, and BDRV_BLOCK_DATA otherwise.
|
||||
*/
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-quorum_co_block_status(BlockDriverState *bs, bool want_zero,
|
||||
+quorum_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
int64_t offset, int64_t count,
|
||||
int64_t *pnum, int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
@@ -1238,7 +1238,7 @@ quorum_co_block_status(BlockDriverState *bs, bool want_zero,
|
||||
for (i = 0; i < s->num_children; i++) {
|
||||
int64_t bytes;
|
||||
ret = bdrv_co_common_block_status_above(s->children[i]->bs, NULL, false,
|
||||
- want_zero, offset, count,
|
||||
+ mode, offset, count,
|
||||
&bytes, NULL, NULL, NULL);
|
||||
if (ret < 0) {
|
||||
quorum_report_bad(QUORUM_OP_TYPE_READ, offset, count,
|
||||
diff --git a/block/raw-format.c b/block/raw-format.c
|
||||
index ac7e8495f6..623bca87a6 100644
|
||||
--- a/block/raw-format.c
|
||||
+++ b/block/raw-format.c
|
||||
@@ -283,8 +283,8 @@ fail:
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-raw_co_block_status(BlockDriverState *bs, bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
+raw_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
BDRVRawState *s = bs->opaque;
|
||||
diff --git a/block/rbd.c b/block/rbd.c
|
||||
index 9c0fd0cb3f..627f8eb05a 100644
|
||||
--- a/block/rbd.c
|
||||
+++ b/block/rbd.c
|
||||
@@ -1504,9 +1504,9 @@ static int qemu_rbd_diff_iterate_cb(uint64_t offs, size_t len,
|
||||
}
|
||||
|
||||
static int coroutine_fn qemu_rbd_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum,
|
||||
- int64_t *map,
|
||||
+ unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes,
|
||||
+ int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
BDRVRBDState *s = bs->opaque;
|
||||
diff --git a/block/snapshot-access.c b/block/snapshot-access.c
|
||||
index 84d0d13f86..972b8f2e68 100644
|
||||
--- a/block/snapshot-access.c
|
||||
+++ b/block/snapshot-access.c
|
||||
@@ -41,11 +41,11 @@ snapshot_access_co_preadv_part(BlockDriverState *bs,
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
snapshot_access_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset,
|
||||
+ unsigned int mode, int64_t offset,
|
||||
int64_t bytes, int64_t *pnum,
|
||||
int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
- return bdrv_co_snapshot_block_status(bs->file->bs, want_zero, offset,
|
||||
+ return bdrv_co_snapshot_block_status(bs->file->bs, mode, offset,
|
||||
bytes, pnum, map, file);
|
||||
}
|
||||
|
||||
diff --git a/block/vdi.c b/block/vdi.c
|
||||
index 6363da08ce..028fe68488 100644
|
||||
--- a/block/vdi.c
|
||||
+++ b/block/vdi.c
|
||||
@@ -521,8 +521,8 @@ static int vdi_reopen_prepare(BDRVReopenState *state,
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-vdi_co_block_status(BlockDriverState *bs, bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
+vdi_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes, int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
BDRVVdiState *s = (BDRVVdiState *)bs->opaque;
|
||||
diff --git a/block/vmdk.c b/block/vmdk.c
|
||||
index 78f6433607..6f1af82078 100644
|
||||
--- a/block/vmdk.c
|
||||
+++ b/block/vmdk.c
|
||||
@@ -1777,7 +1777,7 @@ static inline uint64_t vmdk_find_offset_in_cluster(VmdkExtent *extent,
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-vmdk_co_block_status(BlockDriverState *bs, bool want_zero,
|
||||
+vmdk_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
int64_t offset, int64_t bytes, int64_t *pnum,
|
||||
int64_t *map, BlockDriverState **file)
|
||||
{
|
||||
diff --git a/block/vpc.c b/block/vpc.c
|
||||
index d95a204612..0dd641b614 100644
|
||||
--- a/block/vpc.c
|
||||
+++ b/block/vpc.c
|
||||
@@ -721,7 +721,7 @@ fail:
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
-vpc_co_block_status(BlockDriverState *bs, bool want_zero,
|
||||
+vpc_co_block_status(BlockDriverState *bs, unsigned int mode,
|
||||
int64_t offset, int64_t bytes,
|
||||
int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
diff --git a/block/vvfat.c b/block/vvfat.c
|
||||
index 8ffe8b3b9b..d59231357e 100644
|
||||
--- a/block/vvfat.c
|
||||
+++ b/block/vvfat.c
|
||||
@@ -3135,9 +3135,9 @@ vvfat_co_pwritev(BlockDriverState *bs, int64_t offset, int64_t bytes,
|
||||
}
|
||||
|
||||
static int coroutine_fn vvfat_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset,
|
||||
- int64_t bytes, int64_t *n,
|
||||
- int64_t *map,
|
||||
+ unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes,
|
||||
+ int64_t *n, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
{
|
||||
*n = bytes;
|
||||
diff --git a/include/block/block-common.h b/include/block/block-common.h
|
||||
index 7030669f04..5beee6402b 100644
|
||||
--- a/include/block/block-common.h
|
||||
+++ b/include/block/block-common.h
|
||||
@@ -333,6 +333,17 @@ typedef enum {
|
||||
#define BDRV_BLOCK_RECURSE 0x40
|
||||
#define BDRV_BLOCK_COMPRESSED 0x80
|
||||
|
||||
+/*
|
||||
+ * Block status hints: the bitwise-or of these flags emphasize what
|
||||
+ * the caller hopes to learn, and some drivers may be able to give
|
||||
+ * faster answers by doing less work when the hint permits.
|
||||
+ */
|
||||
+#define BDRV_WANT_ZERO BDRV_BLOCK_ZERO
|
||||
+#define BDRV_WANT_OFFSET_VALID BDRV_BLOCK_OFFSET_VALID
|
||||
+#define BDRV_WANT_ALLOCATED BDRV_BLOCK_ALLOCATED
|
||||
+#define BDRV_WANT_PRECISE (BDRV_WANT_ZERO | BDRV_WANT_OFFSET_VALID | \
|
||||
+ BDRV_WANT_OFFSET_VALID)
|
||||
+
|
||||
typedef QTAILQ_HEAD(BlockReopenQueue, BlockReopenQueueEntry) BlockReopenQueue;
|
||||
|
||||
typedef struct BDRVReopenState {
|
||||
diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
|
||||
index ebb4e56a50..a9c0daa2a4 100644
|
||||
--- a/include/block/block_int-common.h
|
||||
+++ b/include/block/block_int-common.h
|
||||
@@ -608,15 +608,16 @@ struct BlockDriver {
|
||||
* according to the current layer, and should only need to set
|
||||
* BDRV_BLOCK_DATA, BDRV_BLOCK_ZERO, BDRV_BLOCK_OFFSET_VALID,
|
||||
* and/or BDRV_BLOCK_RAW; if the current layer defers to a backing
|
||||
- * layer, the result should be 0 (and not BDRV_BLOCK_ZERO). See
|
||||
- * block.h for the overall meaning of the bits. As a hint, the
|
||||
- * flag want_zero is true if the caller cares more about precise
|
||||
- * mappings (favor accurate _OFFSET_VALID/_ZERO) or false for
|
||||
- * overall allocation (favor larger *pnum, perhaps by reporting
|
||||
- * _DATA instead of _ZERO). The block layer guarantees input
|
||||
- * clamped to bdrv_getlength() and aligned to request_alignment,
|
||||
- * as well as non-NULL pnum, map, and file; in turn, the driver
|
||||
- * must return an error or set pnum to an aligned non-zero value.
|
||||
+ * layer, the result should be 0 (and not BDRV_BLOCK_ZERO). The
|
||||
+ * caller will synthesize BDRV_BLOCK_ALLOCATED based on the
|
||||
+ * non-zero results. See block.h for the overall meaning of the
|
||||
+ * bits. As a hint, the flags in @mode may include a bitwise-or
|
||||
+ * of BDRV_WANT_ALLOCATED, BDRV_WANT_OFFSET_VALID, or
|
||||
+ * BDRV_WANT_ZERO based on what the caller is looking for in the
|
||||
+ * results. The block layer guarantees input clamped to
|
||||
+ * bdrv_getlength() and aligned to request_alignment, as well as
|
||||
+ * non-NULL pnum, map, and file; in turn, the driver must return
|
||||
+ * an error or set pnum to an aligned non-zero value.
|
||||
*
|
||||
* Note that @bytes is just a hint on how big of a region the
|
||||
* caller wants to inspect. It is not a limit on *pnum.
|
||||
@@ -628,8 +629,8 @@ struct BlockDriver {
|
||||
* to clamping *pnum for return to its caller.
|
||||
*/
|
||||
int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_block_status)(
|
||||
- BlockDriverState *bs,
|
||||
- bool want_zero, int64_t offset, int64_t bytes, int64_t *pnum,
|
||||
+ BlockDriverState *bs, unsigned int mode,
|
||||
+ int64_t offset, int64_t bytes, int64_t *pnum,
|
||||
int64_t *map, BlockDriverState **file);
|
||||
|
||||
/*
|
||||
@@ -653,8 +654,8 @@ struct BlockDriver {
|
||||
QEMUIOVector *qiov, size_t qiov_offset);
|
||||
|
||||
int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_snapshot_block_status)(
|
||||
- BlockDriverState *bs, bool want_zero, int64_t offset, int64_t bytes,
|
||||
- int64_t *pnum, int64_t *map, BlockDriverState **file);
|
||||
+ BlockDriverState *bs, unsigned int mode, int64_t offset,
|
||||
+ int64_t bytes, int64_t *pnum, int64_t *map, BlockDriverState **file);
|
||||
|
||||
int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_pdiscard_snapshot)(
|
||||
BlockDriverState *bs, int64_t offset, int64_t bytes);
|
||||
diff --git a/include/block/block_int-io.h b/include/block/block_int-io.h
|
||||
index 4a7cf2b4fd..4f94eb3c5a 100644
|
||||
--- a/include/block/block_int-io.h
|
||||
+++ b/include/block/block_int-io.h
|
||||
@@ -38,8 +38,8 @@
|
||||
int coroutine_fn GRAPH_RDLOCK bdrv_co_preadv_snapshot(BdrvChild *child,
|
||||
int64_t offset, int64_t bytes, QEMUIOVector *qiov, size_t qiov_offset);
|
||||
int coroutine_fn GRAPH_RDLOCK bdrv_co_snapshot_block_status(
|
||||
- BlockDriverState *bs, bool want_zero, int64_t offset, int64_t bytes,
|
||||
- int64_t *pnum, int64_t *map, BlockDriverState **file);
|
||||
+ BlockDriverState *bs, unsigned int mode, int64_t offset,
|
||||
+ int64_t bytes, int64_t *pnum, int64_t *map, BlockDriverState **file);
|
||||
int coroutine_fn GRAPH_RDLOCK bdrv_co_pdiscard_snapshot(BlockDriverState *bs,
|
||||
int64_t offset, int64_t bytes);
|
||||
|
||||
diff --git a/tests/unit/test-block-iothread.c b/tests/unit/test-block-iothread.c
|
||||
index 3766d5de6b..373b72fdd8 100644
|
||||
--- a/tests/unit/test-block-iothread.c
|
||||
+++ b/tests/unit/test-block-iothread.c
|
||||
@@ -63,7 +63,7 @@ bdrv_test_co_truncate(BlockDriverState *bs, int64_t offset, bool exact,
|
||||
}
|
||||
|
||||
static int coroutine_fn bdrv_test_co_block_status(BlockDriverState *bs,
|
||||
- bool want_zero,
|
||||
+ unsigned int mode,
|
||||
int64_t offset, int64_t count,
|
||||
int64_t *pnum, int64_t *map,
|
||||
BlockDriverState **file)
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -0,0 +1,90 @@
|
||||
From 9f8158e56beae4221e91feb5a98cb4db9076cac4 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Fri, 9 May 2025 15:40:20 -0500
|
||||
Subject: [PATCH 05/16] block: Let bdrv_co_is_zero_fast consolidate adjacent
|
||||
extents
|
||||
|
||||
RH-Author: Eric Blake <eblake@redhat.com>
|
||||
RH-MergeRequest: 365: blockdev-mirror: More efficient handling of sparse mirrors
|
||||
RH-Jira: RHEL-82906 RHEL-83015
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-Commit: [3/14] 98bf9ff773d9a36f8a8e294e38629e3f20c41334 (ebblake/centos-qemu-kvm)
|
||||
|
||||
Some BDS drivers have a cap on how much block status they can supply
|
||||
in one query (for example, NBD talking to an older server cannot
|
||||
inspect more than 4G per query; and qcow2 tends to cap its answers
|
||||
rather than cross a cluster boundary of an L1 table). Although the
|
||||
existing callers of bdrv_co_is_zero_fast are not passing in that large
|
||||
of a 'bytes' parameter, an upcoming caller wants to query the entire
|
||||
image at once, and will thus benefit from being able to treat adjacent
|
||||
zero regions in a coalesced manner, rather than claiming the region is
|
||||
non-zero merely because pnum was truncated and didn't match the
|
||||
incoming bytes.
|
||||
|
||||
While refactoring this into a loop, note that there is no need to
|
||||
assign pnum prior to calling bdrv_co_common_block_status_above() (it
|
||||
is guaranteed to be assigned deeper in the callstack).
|
||||
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250509204341.3553601-18-eblake@redhat.com>
|
||||
(cherry picked from commit 31bf15d97dd1d205a3b264675f9a1b3bd1939068)
|
||||
Jira: https://issues.redhat.com/browse/RHEL-82906
|
||||
Jira: https://issues.redhat.com/browse/RHEL-83015
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
---
|
||||
block/io.c | 27 +++++++++++++++------------
|
||||
1 file changed, 15 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index daaafe00d7..293c5dd393 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -2747,28 +2747,31 @@ int coroutine_fn bdrv_co_block_status(BlockDriverState *bs, int64_t offset,
|
||||
* by @offset and @bytes is known to read as zeroes.
|
||||
* Return 1 if that is the case, 0 otherwise and -errno on error.
|
||||
* This test is meant to be fast rather than accurate so returning 0
|
||||
- * does not guarantee non-zero data.
|
||||
+ * does not guarantee non-zero data; but a return of 1 is reliable.
|
||||
*/
|
||||
int coroutine_fn bdrv_co_is_zero_fast(BlockDriverState *bs, int64_t offset,
|
||||
int64_t bytes)
|
||||
{
|
||||
int ret;
|
||||
- int64_t pnum = bytes;
|
||||
+ int64_t pnum;
|
||||
IO_CODE();
|
||||
|
||||
- if (!bytes) {
|
||||
- return 1;
|
||||
- }
|
||||
-
|
||||
- ret = bdrv_co_common_block_status_above(bs, NULL, false, BDRV_WANT_ZERO,
|
||||
- offset, bytes, &pnum, NULL, NULL,
|
||||
- NULL);
|
||||
+ while (bytes) {
|
||||
+ ret = bdrv_co_common_block_status_above(bs, NULL, false,
|
||||
+ BDRV_WANT_ZERO, offset, bytes,
|
||||
+ &pnum, NULL, NULL, NULL);
|
||||
|
||||
- if (ret < 0) {
|
||||
- return ret;
|
||||
+ if (ret < 0) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+ if (!(ret & BDRV_BLOCK_ZERO)) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+ offset += pnum;
|
||||
+ bytes -= pnum;
|
||||
}
|
||||
|
||||
- return (pnum == bytes) && (ret & BDRV_BLOCK_ZERO);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
int coroutine_fn bdrv_co_is_allocated(BlockDriverState *bs, int64_t offset,
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
From ecdc254dbaa7995a94f67e7dfafb17137d15759e Mon Sep 17 00:00:00 2001
|
||||
From e629a362860977161e43ed80bb59d1d05a06b2f2 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Thu, 17 Apr 2025 11:05:28 -0400
|
||||
Subject: [PATCH 2/3] block/io: skip head/tail requests on EINVAL
|
||||
Subject: [PATCH 4/5] block/io: skip head/tail requests on EINVAL
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 450: file-posix: probe discard alignment on Linux block devices
|
||||
RH-Jira: RHEL-87734
|
||||
RH-MergeRequest: 355: file-posix: probe discard alignment on Linux block devices
|
||||
RH-Jira: RHEL-86032
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Commit: [2/3] 30b17fc1828c45cf958b8254999ce1ef1f100868
|
||||
RH-Commit: [2/3] 0028fb11f18e16e2aba9506eabb2383c406d17b5 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
When guests send misaligned discard requests, the block layer breaks
|
||||
them up into a misaligned head, an aligned main body, and a misaligned
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 9f8ff1d0ef010b9c0339869f655ee9af6b10dcd5 Mon Sep 17 00:00:00 2001
|
||||
From d38bdce712f572e1920e3344132ff6600d657de2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:41 +0100
|
||||
Subject: [PATCH 04/31] block: skip automatic zero-init of large array in
|
||||
Subject: [PATCH 29/57] block: skip automatic zero-init of large array in
|
||||
ioq_submit
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [3/30] 0a24695ab7f3a11ab61b12ae2b95bd45a7babc05
|
||||
RH-Commit: [3/30] 301a08b3acdcd95634dec5dab1d96fcfe3abf3be (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'ioq_submit' method has a struct array that is 8k in size.
|
||||
Skip the automatic zero-init of this array to eliminate the
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From c336909ad95540147d9cfed843874ddd986ad917 Mon Sep 17 00:00:00 2001
|
||||
From 1e8798a3adbbfc42167aaba0ee18175deac37193 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:42 +0100
|
||||
Subject: [PATCH 05/31] chardev/char-fd: skip automatic zero-init of large
|
||||
Subject: [PATCH 30/57] chardev/char-fd: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [4/30] e9adf42d47ddd90cc15862e711de0a90d1d25e0a
|
||||
RH-Commit: [4/30] b16fe5c9af4756e1856cd330df02a1a09d9f33ea (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'fd_chr_read' method has a 4k byte array used for copying
|
||||
data between the socket and device. Skip the automatic zero-init
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 489ead1e7d721c0f689626e6d5d22241ffdd7bc8 Mon Sep 17 00:00:00 2001
|
||||
From 74311b0ee8e211fccff211b975e4ae9236c063dc Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:43 +0100
|
||||
Subject: [PATCH 06/31] chardev/char-pty: skip automatic zero-init of large
|
||||
Subject: [PATCH 31/57] chardev/char-pty: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [5/30] 09be65fa8c25dadbd472321cacc96badf0a2d963
|
||||
RH-Commit: [5/30] a3b8458c30f485551093f292c00c20b0e118df77 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'pty_chr_read' method has a 4k byte array used for copying
|
||||
data between the PTY and device. Skip the automatic zero-init
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 67cf0b18b68071b7b0a036b715f9d406f0bc1ec7 Mon Sep 17 00:00:00 2001
|
||||
From d56a8ce56f0de70ab2de266a80e25cf309e72fda Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:44 +0100
|
||||
Subject: [PATCH 07/31] chardev/char-socket: skip automatic zero-init of large
|
||||
Subject: [PATCH 32/57] chardev/char-socket: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [6/30] fa1d406d2f9be389090614d666466fb94f480f84
|
||||
RH-Commit: [6/30] 86a2ac03efa1838fb30931c38945ee77de9bbe06 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'tcp_chr_read' method has a 4k byte array used for copying
|
||||
data between the socket and device. Skip the automatic zero-init
|
||||
|
||||
@ -0,0 +1,48 @@
|
||||
From dd4ab64754a52f1e50273cb8153567b0d2f382de Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
||||
Subject: [PATCH 071/115] cpu: Don't set vcpu_dirty when guest_state_protected
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [71/115] c876a59ee5bbfccea9837ac373a2e664354db3ae (bonzini/rhel-qemu-kvm)
|
||||
|
||||
QEMU calls kvm_arch_put_registers() when vcpu_dirty is true in
|
||||
kvm_vcpu_exec(). However, for confidential guest, like TDX, putting
|
||||
registers is disallowed due to guest state is protected.
|
||||
|
||||
Only set vcpu_dirty to true with guest state is not protected when
|
||||
creating the vcpu.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-43-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit b4b7fb5a773e1d2215c2aaa99789eca51914b78f)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
accel/kvm/kvm-all.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||||
index c1605bc4fa..43c10c82f6 100644
|
||||
--- a/accel/kvm/kvm-all.c
|
||||
+++ b/accel/kvm/kvm-all.c
|
||||
@@ -456,7 +456,9 @@ int kvm_create_vcpu(CPUState *cpu)
|
||||
|
||||
cpu->kvm_fd = kvm_fd;
|
||||
cpu->kvm_state = s;
|
||||
- cpu->vcpu_dirty = true;
|
||||
+ if (!s->guest_state_protected) {
|
||||
+ cpu->vcpu_dirty = true;
|
||||
+ }
|
||||
cpu->dirty_pages = 0;
|
||||
cpu->throttle_us_per_full = 0;
|
||||
|
||||
--
|
||||
2.50.1
|
||||
|
||||
76
SOURCES/kvm-cpu-Remove-nr_cores-from-struct-CPUState.patch
Normal file
76
SOURCES/kvm-cpu-Remove-nr_cores-from-struct-CPUState.patch
Normal file
@ -0,0 +1,76 @@
|
||||
From c57b5e38fd95a68f36a342e19ba7ccb6cbb07948 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:44 +0200
|
||||
Subject: [PATCH 014/115] cpu: Remove nr_cores from struct CPUState
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [14/115] 80f6414c5f8f5e963b0f2251147b8a1ca04f55e4 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
There is no user of it now, remove it.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20241219110125.1266461-9-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 6e090ffe0d188e1f09d4efcd10d82158f92abfbb)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit d4c699c310519b99bedf1bdb516cab230d5d846c)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
hw/core/cpu-common.c | 1 -
|
||||
include/hw/core/cpu.h | 2 --
|
||||
system/cpus.c | 1 -
|
||||
3 files changed, 4 deletions(-)
|
||||
|
||||
diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
|
||||
index 7982ecd39a..1ac8ab488f 100644
|
||||
--- a/hw/core/cpu-common.c
|
||||
+++ b/hw/core/cpu-common.c
|
||||
@@ -242,7 +242,6 @@ static void cpu_common_initfn(Object *obj)
|
||||
cpu->cluster_index = UNASSIGNED_CLUSTER_INDEX;
|
||||
/* user-mode doesn't have configurable SMP topology */
|
||||
/* the default value is changed by qemu_init_vcpu() for system-mode */
|
||||
- cpu->nr_cores = 1;
|
||||
cpu->nr_threads = 1;
|
||||
cpu->cflags_next_tb = -1;
|
||||
|
||||
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
|
||||
index 1c9c775df6..d90e3b3f2c 100644
|
||||
--- a/include/hw/core/cpu.h
|
||||
+++ b/include/hw/core/cpu.h
|
||||
@@ -402,7 +402,6 @@ struct qemu_work_item;
|
||||
* Under TCG this value is propagated to @tcg_cflags.
|
||||
* See TranslationBlock::TCG CF_CLUSTER_MASK.
|
||||
* @tcg_cflags: Pre-computed cflags for this cpu.
|
||||
- * @nr_cores: Number of cores within this CPU package.
|
||||
* @nr_threads: Number of threads within this CPU core.
|
||||
* @thread: Host thread details, only live once @created is #true
|
||||
* @sem: WIN32 only semaphore used only for qtest
|
||||
@@ -461,7 +460,6 @@ struct CPUState {
|
||||
CPUClass *cc;
|
||||
/*< public >*/
|
||||
|
||||
- int nr_cores;
|
||||
int nr_threads;
|
||||
|
||||
struct QemuThread *thread;
|
||||
diff --git a/system/cpus.c b/system/cpus.c
|
||||
index 1c818ff682..909d8128e8 100644
|
||||
--- a/system/cpus.c
|
||||
+++ b/system/cpus.c
|
||||
@@ -666,7 +666,6 @@ void qemu_init_vcpu(CPUState *cpu)
|
||||
{
|
||||
MachineState *ms = MACHINE(qdev_get_machine());
|
||||
|
||||
- cpu->nr_cores = machine_topo_get_cores_per_socket(ms);
|
||||
cpu->nr_threads = ms->smp.threads;
|
||||
cpu->stopped = true;
|
||||
cpu->random_seed = qemu_guest_random_seed_thread_part1();
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,74 @@
|
||||
From 4df071fec89ab867f8e2d970de48256034e4b286 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:29:04 +0200
|
||||
Subject: [PATCH 005/115] crypto: Define macros for hash algorithm digest
|
||||
lengths
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [5/115] f5f6e0c3cd10baf7a490b67dd6c0542bddba8dfe (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Signed-off-by: Dorjoy Chowdhury <dorjoychy111@gmail.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
(cherry picked from commit 5d04de7de54e163b056980be10ee1c281a600276)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
crypto/hash.c | 14 +++++++-------
|
||||
include/crypto/hash.h | 8 ++++++++
|
||||
2 files changed, 15 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/crypto/hash.c b/crypto/hash.c
|
||||
index b0f8228bdc..8087f5dae6 100644
|
||||
--- a/crypto/hash.c
|
||||
+++ b/crypto/hash.c
|
||||
@@ -23,13 +23,13 @@
|
||||
#include "hashpriv.h"
|
||||
|
||||
static size_t qcrypto_hash_alg_size[QCRYPTO_HASH_ALG__MAX] = {
|
||||
- [QCRYPTO_HASH_ALG_MD5] = 16,
|
||||
- [QCRYPTO_HASH_ALG_SHA1] = 20,
|
||||
- [QCRYPTO_HASH_ALG_SHA224] = 28,
|
||||
- [QCRYPTO_HASH_ALG_SHA256] = 32,
|
||||
- [QCRYPTO_HASH_ALG_SHA384] = 48,
|
||||
- [QCRYPTO_HASH_ALG_SHA512] = 64,
|
||||
- [QCRYPTO_HASH_ALG_RIPEMD160] = 20,
|
||||
+ [QCRYPTO_HASH_ALG_MD5] = QCRYPTO_HASH_DIGEST_LEN_MD5,
|
||||
+ [QCRYPTO_HASH_ALG_SHA1] = QCRYPTO_HASH_DIGEST_LEN_SHA1,
|
||||
+ [QCRYPTO_HASH_ALG_SHA224] = QCRYPTO_HASH_DIGEST_LEN_SHA224,
|
||||
+ [QCRYPTO_HASH_ALG_SHA256] = QCRYPTO_HASH_DIGEST_LEN_SHA256,
|
||||
+ [QCRYPTO_HASH_ALG_SHA384] = QCRYPTO_HASH_DIGEST_LEN_SHA384,
|
||||
+ [QCRYPTO_HASH_ALG_SHA512] = QCRYPTO_HASH_DIGEST_LEN_SHA512,
|
||||
+ [QCRYPTO_HASH_ALG_RIPEMD160] = QCRYPTO_HASH_DIGEST_LEN_RIPEMD160,
|
||||
};
|
||||
|
||||
size_t qcrypto_hash_digest_len(QCryptoHashAlgorithm alg)
|
||||
diff --git a/include/crypto/hash.h b/include/crypto/hash.h
|
||||
index 54d87aa2a1..a113cc3b04 100644
|
||||
--- a/include/crypto/hash.h
|
||||
+++ b/include/crypto/hash.h
|
||||
@@ -23,6 +23,14 @@
|
||||
|
||||
#include "qapi/qapi-types-crypto.h"
|
||||
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_MD5 16
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_SHA1 20
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_SHA224 28
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_SHA256 32
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_SHA384 48
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_SHA512 64
|
||||
+#define QCRYPTO_HASH_DIGEST_LEN_RIPEMD160 20
|
||||
+
|
||||
/* See also "QCryptoHashAlgorithm" defined in qapi/crypto.json */
|
||||
|
||||
/**
|
||||
--
|
||||
2.50.1
|
||||
|
||||
222
SOURCES/kvm-docs-Add-TDX-documentation.patch
Normal file
222
SOURCES/kvm-docs-Add-TDX-documentation.patch
Normal file
@ -0,0 +1,222 @@
|
||||
From a9c7bbb7a32ba2ea5cd76b87c41f1fbdd789fb3b Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
||||
Subject: [PATCH 084/115] docs: Add TDX documentation
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [84/115] 4f9930f4415e7195bf5bbbcc0d79cfc6aaa385e1 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Add docs/system/i386/tdx.rst for TDX support, and add tdx in
|
||||
confidential-guest-support.rst
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-56-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit dc1424319311f86449c6825ceec2364ee645a363)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
docs/system/confidential-guest-support.rst | 1 +
|
||||
docs/system/i386/tdx.rst | 161 +++++++++++++++++++++
|
||||
docs/system/target-i386.rst | 1 +
|
||||
3 files changed, 163 insertions(+)
|
||||
create mode 100644 docs/system/i386/tdx.rst
|
||||
|
||||
diff --git a/docs/system/confidential-guest-support.rst b/docs/system/confidential-guest-support.rst
|
||||
index 0c490dbda2..66129fbab6 100644
|
||||
--- a/docs/system/confidential-guest-support.rst
|
||||
+++ b/docs/system/confidential-guest-support.rst
|
||||
@@ -38,6 +38,7 @@ Supported mechanisms
|
||||
Currently supported confidential guest mechanisms are:
|
||||
|
||||
* AMD Secure Encrypted Virtualization (SEV) (see :doc:`i386/amd-memory-encryption`)
|
||||
+* Intel Trust Domain Extension (TDX) (see :doc:`i386/tdx`)
|
||||
* POWER Protected Execution Facility (PEF) (see :ref:`power-papr-protected-execution-facility-pef`)
|
||||
* s390x Protected Virtualization (PV) (see :doc:`s390x/protvirt`)
|
||||
|
||||
diff --git a/docs/system/i386/tdx.rst b/docs/system/i386/tdx.rst
|
||||
new file mode 100644
|
||||
index 0000000000..8131750b64
|
||||
--- /dev/null
|
||||
+++ b/docs/system/i386/tdx.rst
|
||||
@@ -0,0 +1,161 @@
|
||||
+Intel Trusted Domain eXtension (TDX)
|
||||
+====================================
|
||||
+
|
||||
+Intel Trusted Domain eXtensions (TDX) refers to an Intel technology that extends
|
||||
+Virtual Machine Extensions (VMX) and Multi-Key Total Memory Encryption (MKTME)
|
||||
+with a new kind of virtual machine guest called a Trust Domain (TD). A TD runs
|
||||
+in a CPU mode that is designed to protect the confidentiality of its memory
|
||||
+contents and its CPU state from any other software, including the hosting
|
||||
+Virtual Machine Monitor (VMM), unless explicitly shared by the TD itself.
|
||||
+
|
||||
+Prerequisites
|
||||
+-------------
|
||||
+
|
||||
+To run TD, the physical machine needs to have TDX module loaded and initialized
|
||||
+while KVM hypervisor has TDX support and has TDX enabled. If those requirements
|
||||
+are met, the ``KVM_CAP_VM_TYPES`` will report the support of ``KVM_X86_TDX_VM``.
|
||||
+
|
||||
+Trust Domain Virtual Firmware (TDVF)
|
||||
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
+
|
||||
+Trust Domain Virtual Firmware (TDVF) is required to provide TD services to boot
|
||||
+TD Guest OS. TDVF needs to be copied to guest private memory and measured before
|
||||
+the TD boots.
|
||||
+
|
||||
+KVM vcpu ioctl ``KVM_TDX_INIT_MEM_REGION`` can be used to populate the TDVF
|
||||
+content into its private memory.
|
||||
+
|
||||
+Since TDX doesn't support readonly memslot, TDVF cannot be mapped as pflash
|
||||
+device and it actually works as RAM. "-bios" option is chosen to load TDVF.
|
||||
+
|
||||
+OVMF is the opensource firmware that implements the TDVF support. Thus the
|
||||
+command line to specify and load TDVF is ``-bios OVMF.fd``
|
||||
+
|
||||
+Feature Configuration
|
||||
+---------------------
|
||||
+
|
||||
+Unlike non-TDX VM, the CPU features (enumerated by CPU or MSR) of a TD are not
|
||||
+under full control of VMM. VMM can only configure part of features of a TD on
|
||||
+``KVM_TDX_INIT_VM`` command of VM scope ``MEMORY_ENCRYPT_OP`` ioctl.
|
||||
+
|
||||
+The configurable features have three types:
|
||||
+
|
||||
+- Attributes:
|
||||
+ - PKS (bit 30) controls whether Supervisor Protection Keys is exposed to TD,
|
||||
+ which determines related CPUID bit and CR4 bit;
|
||||
+ - PERFMON (bit 63) controls whether PMU is exposed to TD.
|
||||
+
|
||||
+- XSAVE related features (XFAM):
|
||||
+ XFAM is a 64b mask, which has the same format as XCR0 or IA32_XSS MSR. It
|
||||
+ determines the set of extended features available for use by the guest TD.
|
||||
+
|
||||
+- CPUID features:
|
||||
+ Only some bits of some CPUID leaves are directly configurable by VMM.
|
||||
+
|
||||
+What features can be configured is reported via TDX capabilities.
|
||||
+
|
||||
+TDX capabilities
|
||||
+~~~~~~~~~~~~~~~~
|
||||
+
|
||||
+The VM scope ``MEMORY_ENCRYPT_OP`` ioctl provides command ``KVM_TDX_CAPABILITIES``
|
||||
+to get the TDX capabilities from KVM. It returns a data structure of
|
||||
+``struct kvm_tdx_capabilities``, which tells the supported configuration of
|
||||
+attributes, XFAM and CPUIDs.
|
||||
+
|
||||
+TD attributes
|
||||
+~~~~~~~~~~~~~
|
||||
+
|
||||
+QEMU supports configuring raw 64-bit TD attributes directly via "attributes"
|
||||
+property of "tdx-guest" object. Note, it's users' responsibility to provide a
|
||||
+valid value because some bits may not supported by current QEMU or KVM yet.
|
||||
+
|
||||
+QEMU also supports the configuration of individual attribute bits that are
|
||||
+supported by it, via properties of "tdx-guest" object.
|
||||
+E.g., "sept-ve-disable" (bit 28).
|
||||
+
|
||||
+MSR based features
|
||||
+~~~~~~~~~~~~~~~~~~
|
||||
+
|
||||
+Current KVM doesn't support MSR based feature (e.g., MSR_IA32_ARCH_CAPABILITIES)
|
||||
+configuration for TDX, and it's a future work to enable it in QEMU when KVM adds
|
||||
+support of it.
|
||||
+
|
||||
+Feature check
|
||||
+~~~~~~~~~~~~~
|
||||
+
|
||||
+QEMU checks if the final (CPU) features, determined by given cpu model and
|
||||
+explicit feature adjustment of "+featureA/-featureB", can be supported or not.
|
||||
+It can produce feature not supported warning like
|
||||
+
|
||||
+ "warning: host doesn't support requested feature: CPUID.07H:EBX.intel-pt [bit 25]"
|
||||
+
|
||||
+It can also produce warning like
|
||||
+
|
||||
+ "warning: TDX forcibly sets the feature: CPUID.80000007H:EDX.invtsc [bit 8]"
|
||||
+
|
||||
+if the fixed-1 feature is requested to be disabled explicitly. This is newly
|
||||
+added to QEMU for TDX because TDX has fixed-1 features that are forcibly enabled
|
||||
+by TDX module and VMM cannot disable them.
|
||||
+
|
||||
+Launching a TD (TDX VM)
|
||||
+-----------------------
|
||||
+
|
||||
+To launch a TD, the necessary command line options are tdx-guest object and
|
||||
+split kernel-irqchip, as below:
|
||||
+
|
||||
+.. parsed-literal::
|
||||
+
|
||||
+ |qemu_system_x86| \\
|
||||
+ -accel kvm \\
|
||||
+ -cpu host \\
|
||||
+ -object tdx-guest,id=tdx0 \\
|
||||
+ -machine ...,confidential-guest-support=tdx0 \\
|
||||
+ -bios OVMF.fd \\
|
||||
+
|
||||
+Restrictions
|
||||
+------------
|
||||
+
|
||||
+ - kernel-irqchip must be split;
|
||||
+
|
||||
+ This is set by default for TDX guest if kernel-irqchip is left on its default
|
||||
+ 'auto' setting.
|
||||
+
|
||||
+ - No readonly support for private memory;
|
||||
+
|
||||
+ - No SMM support: SMM support requires manipulating the guest register states
|
||||
+ which is not allowed;
|
||||
+
|
||||
+Debugging
|
||||
+---------
|
||||
+
|
||||
+Bit 0 of TD attributes, is DEBUG bit, which decides if the TD runs in off-TD
|
||||
+debug mode. When in off-TD debug mode, TD's VCPU state and private memory are
|
||||
+accessible via given SEAMCALLs. This requires KVM to expose APIs to invoke those
|
||||
+SEAMCALLs and corresonponding QEMU change.
|
||||
+
|
||||
+It's targeted as future work.
|
||||
+
|
||||
+TD attestation
|
||||
+--------------
|
||||
+
|
||||
+In TD guest, the attestation process is used to verify the TDX guest
|
||||
+trustworthiness to other entities before provisioning secrets to the guest.
|
||||
+
|
||||
+TD attestation is initiated first by calling TDG.MR.REPORT inside TD to get the
|
||||
+REPORT. Then the REPORT data needs to be converted into a remotely verifiable
|
||||
+Quote by SGX Quoting Enclave (QE).
|
||||
+
|
||||
+It's a future work in QEMU to add support of TD attestation since it lacks
|
||||
+support in current KVM.
|
||||
+
|
||||
+Live Migration
|
||||
+--------------
|
||||
+
|
||||
+Future work.
|
||||
+
|
||||
+References
|
||||
+----------
|
||||
+
|
||||
+- `TDX Homepage <https://www.intel.com/content/www/us/en/developer/articles/technical/intel-trust-domain-extensions.html>`__
|
||||
+
|
||||
+- `SGX QE <https://github.com/intel/SGXDataCenterAttestationPrimitives/tree/master/QuoteGeneration>`__
|
||||
diff --git a/docs/system/target-i386.rst b/docs/system/target-i386.rst
|
||||
index 1b8a1f248a..4d58cdbc4e 100644
|
||||
--- a/docs/system/target-i386.rst
|
||||
+++ b/docs/system/target-i386.rst
|
||||
@@ -29,6 +29,7 @@ Architectural features
|
||||
i386/kvm-pv
|
||||
i386/sgx
|
||||
i386/amd-memory-encryption
|
||||
+ i386/tdx
|
||||
|
||||
OS requirements
|
||||
~~~~~~~~~~~~~~~
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
From 389c3c6b4215c9be3fd784c73af0e9795e796380 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Tue, 18 Feb 2025 19:25:35 +0100
|
||||
Subject: [PATCH 5/9] docs/devel/reset: Document reset expectations for DMA and
|
||||
IOMMU
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 341: Fix vIOMMU reset order
|
||||
RH-Jira: RHEL-7188
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Commit: [5/5] be8b9d9e34a2b301430dfa229c6785ab17d3fb16 (eauger1/centos-qemu-kvm)
|
||||
|
||||
To avoid any translation faults, the IOMMUs are expected to be
|
||||
reset after the devices they protect. Document that we expect
|
||||
DMA requests to be stopped during the 'enter' or 'hold' phase
|
||||
while IOMMUs should be reset during the 'exit' phase.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||||
Message-Id: <20250218182737.76722-6-eric.auger@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit dd6d545e8f2d9a0e8a8c287ec16469f03ef5c198)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
docs/devel/reset.rst | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/docs/devel/reset.rst b/docs/devel/reset.rst
|
||||
index 9746a4e8a0..24ab630465 100644
|
||||
--- a/docs/devel/reset.rst
|
||||
+++ b/docs/devel/reset.rst
|
||||
@@ -123,6 +123,11 @@ The *exit* phase is executed only when the last reset operation ends. Therefore
|
||||
the object does not need to care how many of reset controllers it has and how
|
||||
many of them have started a reset.
|
||||
|
||||
+DMA capable devices are expected to cancel all outstanding DMA operations
|
||||
+during either 'enter' or 'hold' phases. IOMMUs are expected to reset during
|
||||
+the 'exit' phase and this sequencing makes sure no outstanding DMA request
|
||||
+will fault.
|
||||
+
|
||||
|
||||
Handling reset in a resettable object
|
||||
-------------------------------------
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
From 762f24e92b93c0e8cbb5b0abe135d29fb444737d Mon Sep 17 00:00:00 2001
|
||||
From d565fe385b3c45a41fa8e25942220aff38a04fc3 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 29 Apr 2025 17:05:41 +0200
|
||||
Subject: [PATCH 1/2] file-posix: Define DM_MPATH_PROBE_PATHS
|
||||
Subject: [PATCH 2/3] file-posix: Define DM_MPATH_PROBE_PATHS
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 456: file-posix: Fix multipath failover with SCSI passthrough [9.6.z]
|
||||
RH-Jira: RHEL-95407
|
||||
RH-MergeRequest: 372: file-posix: Fix multipath failover with SCSI passthrough [9.7]
|
||||
RH-Jira: RHEL-95408
|
||||
RH-Acked-by: Hanna Czenczek <hreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [1/2] 0d9ec74bf3bb999c8baa929e0d25682680fa1731 (kmwolf/rhel-qemu-kvm)
|
||||
RH-Commit: [1/2] 7615906833a6bb2b4645fa5cd60d78aa9631cb7c (kmwolf/centos-qemu-kvm)
|
||||
|
||||
While the kernel side isn't merged yet and we're still using old kernel
|
||||
headers, just define DM_MPATH_PROBE_PATHS manually.
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
From e7fac8bb7cedcb600bea245fc45089c7ff1e9728 Mon Sep 17 00:00:00 2001
|
||||
From 3515c6541f71817727a3a8b18ec5252644b51bc0 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Tue, 29 Apr 2025 17:56:54 +0200
|
||||
Subject: [PATCH 3/3] file-posix: Fix crash on discard_granularity == 0
|
||||
Subject: [PATCH 5/5] file-posix: Fix crash on discard_granularity == 0
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 450: file-posix: probe discard alignment on Linux block devices
|
||||
RH-Jira: RHEL-87734
|
||||
RH-MergeRequest: 355: file-posix: probe discard alignment on Linux block devices
|
||||
RH-Jira: RHEL-86032
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Commit: [3/3] 89a47a6fceb2222593cff4d8c85376c210dc7cc2
|
||||
RH-Commit: [3/3] b8139a4c5b19efff1f15c314447a6abb89db0ae7 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
Block devices that don't support discard have a discard_granularity of
|
||||
0. Currently, this results in a division by zero when we try to make
|
||||
|
||||
@ -1,15 +1,15 @@
|
||||
From 50b1a3ec7cfea5a92069e043e8f77a2595480d20 Mon Sep 17 00:00:00 2001
|
||||
From 95c651ba1177bd88dbd9b52fe2ec8fedadcdb5c8 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Thu, 22 May 2025 15:08:03 +0200
|
||||
Subject: [PATCH 2/2] file-posix: Probe paths and retry SG_IO on potential path
|
||||
Subject: [PATCH 3/3] file-posix: Probe paths and retry SG_IO on potential path
|
||||
errors
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-MergeRequest: 456: file-posix: Fix multipath failover with SCSI passthrough [9.6.z]
|
||||
RH-Jira: RHEL-95407
|
||||
RH-MergeRequest: 372: file-posix: Fix multipath failover with SCSI passthrough [9.7]
|
||||
RH-Jira: RHEL-95408
|
||||
RH-Acked-by: Hanna Czenczek <hreitz@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Commit: [2/2] 2f4aed9004889e9df25e30c2273f2524a67c666c (kmwolf/rhel-qemu-kvm)
|
||||
RH-Commit: [2/2] 4312e9ec609e511afdfb6634e1d2370032d41543 (kmwolf/centos-qemu-kvm)
|
||||
|
||||
When scsi-block is used on a host multipath device, it runs into the
|
||||
problem that the kernel dm-mpath doesn't know anything about SCSI or
|
||||
|
||||
@ -0,0 +1,64 @@
|
||||
From 39e0c370357a414abacd64fb6a172e7b25eb4d82 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Fri, 9 May 2025 15:40:19 -0500
|
||||
Subject: [PATCH 04/16] file-posix, gluster: Handle zero block status hint
|
||||
better
|
||||
|
||||
RH-Author: Eric Blake <eblake@redhat.com>
|
||||
RH-MergeRequest: 365: blockdev-mirror: More efficient handling of sparse mirrors
|
||||
RH-Jira: RHEL-82906 RHEL-83015
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-Commit: [2/14] 1f7b47ce5f5fb321aee41a16accf5bce3d1bfe95 (ebblake/centos-qemu-kvm)
|
||||
|
||||
Although the previous patch to change 'bool want_zero' into a bitmask
|
||||
made no semantic change, it is now time to differentiate. When the
|
||||
caller specifically wants to know what parts of the file read as zero,
|
||||
we need to use lseek and actually reporting holes, rather than
|
||||
short-circuiting and advertising full allocation.
|
||||
|
||||
This change will be utilized in later patches to let mirroring
|
||||
optimize for the case when the destination already reads as zeroes.
|
||||
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Message-ID: <20250509204341.3553601-17-eblake@redhat.com>
|
||||
(cherry picked from commit a6a0a7fb0e327d17594c971b4a39de14e025b415)
|
||||
Jira: https://issues.redhat.com/browse/RHEL-82906
|
||||
Jira: https://issues.redhat.com/browse/RHEL-83015
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
---
|
||||
block/file-posix.c | 3 ++-
|
||||
block/gluster.c | 2 +-
|
||||
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index 9ca55620ca..ce5da2b4c2 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -3293,7 +3293,8 @@ static int coroutine_fn raw_co_block_status(BlockDriverState *bs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (mode != BDRV_WANT_PRECISE) {
|
||||
+ if (!(mode & BDRV_WANT_ZERO)) {
|
||||
+ /* There is no backing file - all bytes are allocated in this file. */
|
||||
*pnum = bytes;
|
||||
*map = offset;
|
||||
*file = bs;
|
||||
diff --git a/block/gluster.c b/block/gluster.c
|
||||
index ae5c45666b..175c70164c 100644
|
||||
--- a/block/gluster.c
|
||||
+++ b/block/gluster.c
|
||||
@@ -1483,7 +1483,7 @@ static int coroutine_fn qemu_gluster_co_block_status(BlockDriverState *bs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
- if (mode != BDRV_WANT_PRECISE) {
|
||||
+ if (!(mode & BDRV_WANT_ZERO)) {
|
||||
*pnum = bytes;
|
||||
*map = offset;
|
||||
*file = bs;
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,15 +1,15 @@
|
||||
From 821ddc7a25a4463f3d9f32c7ae2190f56d597c1b Mon Sep 17 00:00:00 2001
|
||||
From 29ae77d77cabc3582267cb8a7c4fe10d279a21e6 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Thu, 17 Apr 2025 11:05:27 -0400
|
||||
Subject: [PATCH 1/3] file-posix: probe discard alignment on Linux block
|
||||
Subject: [PATCH 3/5] file-posix: probe discard alignment on Linux block
|
||||
devices
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 450: file-posix: probe discard alignment on Linux block devices
|
||||
RH-Jira: RHEL-87734
|
||||
RH-MergeRequest: 355: file-posix: probe discard alignment on Linux block devices
|
||||
RH-Jira: RHEL-86032
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
||||
RH-Commit: [1/3] 89037a51ad7f2d9344e506679c1300b7d4f805ab
|
||||
RH-Commit: [1/3] bb3c17b0da6edeb209874e97d4e2c3b1762a1749 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
Populate the pdiscard_alignment block limit so the block layer is able
|
||||
align discard requests correctly.
|
||||
|
||||
@ -0,0 +1,233 @@
|
||||
From 43245dc5a297d6c4097a0191af4f818e416a3f45 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:46 +0200
|
||||
Subject: [PATCH 051/115] headers: Add definitions from UEFI spec for volumes,
|
||||
resources, etc...
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [51/115] c44f8b832aa268a5b2d3e98a8ce6bfbda7e1c684 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Add UEFI definitions for literals, enums, structs, GUIDs, etc... that
|
||||
will be used by TDX to build the UEFI Hand-Off Block (HOB) that is passed
|
||||
to the Trusted Domain Virtual Firmware (TDVF).
|
||||
|
||||
All values come from the UEFI specification [1], PI spec [2] and TDVF
|
||||
design guide[3].
|
||||
|
||||
[1] UEFI Specification v2.1.0 https://uefi.org/sites/default/files/resources/UEFI_Spec_2_10_Aug29.pdf
|
||||
[2] UEFI PI spec v1.8 https://uefi.org/sites/default/files/resources/UEFI_PI_Spec_1_8_March3.pdf
|
||||
[3] https://software.intel.com/content/dam/develop/external/us/en/documents/tdx-virtual-firmware-design-guide-rev-1.pdf
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-23-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 88aa6576e4ab40b538f543852128cb17fce37f87)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
include/standard-headers/uefi/uefi.h | 187 +++++++++++++++++++++++++++
|
||||
1 file changed, 187 insertions(+)
|
||||
create mode 100644 include/standard-headers/uefi/uefi.h
|
||||
|
||||
diff --git a/include/standard-headers/uefi/uefi.h b/include/standard-headers/uefi/uefi.h
|
||||
new file mode 100644
|
||||
index 0000000000..5256349ec0
|
||||
--- /dev/null
|
||||
+++ b/include/standard-headers/uefi/uefi.h
|
||||
@@ -0,0 +1,187 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2025 Intel Corporation
|
||||
+ *
|
||||
+ * Author: Isaku Yamahata <isaku.yamahata at gmail.com>
|
||||
+ * <isaku.yamahata at intel.com>
|
||||
+ * Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
+ *
|
||||
+ * SPDX-License-Identifier: GPL-2.0-or-later
|
||||
+ */
|
||||
+
|
||||
+#ifndef HW_I386_UEFI_H
|
||||
+#define HW_I386_UEFI_H
|
||||
+
|
||||
+/***************************************************************************/
|
||||
+/*
|
||||
+ * basic EFI definitions
|
||||
+ * supplemented with UEFI Specification Version 2.8 (Errata A)
|
||||
+ * released February 2020
|
||||
+ */
|
||||
+/* UEFI integer is little endian */
|
||||
+
|
||||
+typedef struct {
|
||||
+ uint32_t Data1;
|
||||
+ uint16_t Data2;
|
||||
+ uint16_t Data3;
|
||||
+ uint8_t Data4[8];
|
||||
+} EFI_GUID;
|
||||
+
|
||||
+typedef enum {
|
||||
+ EfiReservedMemoryType,
|
||||
+ EfiLoaderCode,
|
||||
+ EfiLoaderData,
|
||||
+ EfiBootServicesCode,
|
||||
+ EfiBootServicesData,
|
||||
+ EfiRuntimeServicesCode,
|
||||
+ EfiRuntimeServicesData,
|
||||
+ EfiConventionalMemory,
|
||||
+ EfiUnusableMemory,
|
||||
+ EfiACPIReclaimMemory,
|
||||
+ EfiACPIMemoryNVS,
|
||||
+ EfiMemoryMappedIO,
|
||||
+ EfiMemoryMappedIOPortSpace,
|
||||
+ EfiPalCode,
|
||||
+ EfiPersistentMemory,
|
||||
+ EfiUnacceptedMemoryType,
|
||||
+ EfiMaxMemoryType
|
||||
+} EFI_MEMORY_TYPE;
|
||||
+
|
||||
+#define EFI_HOB_HANDOFF_TABLE_VERSION 0x0009
|
||||
+
|
||||
+#define EFI_HOB_TYPE_HANDOFF 0x0001
|
||||
+#define EFI_HOB_TYPE_MEMORY_ALLOCATION 0x0002
|
||||
+#define EFI_HOB_TYPE_RESOURCE_DESCRIPTOR 0x0003
|
||||
+#define EFI_HOB_TYPE_GUID_EXTENSION 0x0004
|
||||
+#define EFI_HOB_TYPE_FV 0x0005
|
||||
+#define EFI_HOB_TYPE_CPU 0x0006
|
||||
+#define EFI_HOB_TYPE_MEMORY_POOL 0x0007
|
||||
+#define EFI_HOB_TYPE_FV2 0x0009
|
||||
+#define EFI_HOB_TYPE_LOAD_PEIM_UNUSED 0x000A
|
||||
+#define EFI_HOB_TYPE_UEFI_CAPSULE 0x000B
|
||||
+#define EFI_HOB_TYPE_FV3 0x000C
|
||||
+#define EFI_HOB_TYPE_UNUSED 0xFFFE
|
||||
+#define EFI_HOB_TYPE_END_OF_HOB_LIST 0xFFFF
|
||||
+
|
||||
+typedef struct {
|
||||
+ uint16_t HobType;
|
||||
+ uint16_t HobLength;
|
||||
+ uint32_t Reserved;
|
||||
+} EFI_HOB_GENERIC_HEADER;
|
||||
+
|
||||
+typedef uint64_t EFI_PHYSICAL_ADDRESS;
|
||||
+typedef uint32_t EFI_BOOT_MODE;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ uint32_t Version;
|
||||
+ EFI_BOOT_MODE BootMode;
|
||||
+ EFI_PHYSICAL_ADDRESS EfiMemoryTop;
|
||||
+ EFI_PHYSICAL_ADDRESS EfiMemoryBottom;
|
||||
+ EFI_PHYSICAL_ADDRESS EfiFreeMemoryTop;
|
||||
+ EFI_PHYSICAL_ADDRESS EfiFreeMemoryBottom;
|
||||
+ EFI_PHYSICAL_ADDRESS EfiEndOfHobList;
|
||||
+} EFI_HOB_HANDOFF_INFO_TABLE;
|
||||
+
|
||||
+#define EFI_RESOURCE_SYSTEM_MEMORY 0x00000000
|
||||
+#define EFI_RESOURCE_MEMORY_MAPPED_IO 0x00000001
|
||||
+#define EFI_RESOURCE_IO 0x00000002
|
||||
+#define EFI_RESOURCE_FIRMWARE_DEVICE 0x00000003
|
||||
+#define EFI_RESOURCE_MEMORY_MAPPED_IO_PORT 0x00000004
|
||||
+#define EFI_RESOURCE_MEMORY_RESERVED 0x00000005
|
||||
+#define EFI_RESOURCE_IO_RESERVED 0x00000006
|
||||
+#define EFI_RESOURCE_MEMORY_UNACCEPTED 0x00000007
|
||||
+#define EFI_RESOURCE_MAX_MEMORY_TYPE 0x00000008
|
||||
+
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_PRESENT 0x00000001
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_INITIALIZED 0x00000002
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_TESTED 0x00000004
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_SINGLE_BIT_ECC 0x00000008
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_MULTIPLE_BIT_ECC 0x00000010
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_1 0x00000020
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_2 0x00000040
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED 0x00000080
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTED 0x00000100
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED 0x00000200
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE 0x00000400
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE 0x00000800
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE 0x00001000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE 0x00002000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_16_BIT_IO 0x00004000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_32_BIT_IO 0x00008000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_64_BIT_IO 0x00010000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED 0x00020000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTED 0x00040000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE 0x00080000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE 0x00100000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE 0x00200000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE 0x00400000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_PERSISTENT 0x00800000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_PERSISTABLE 0x01000000
|
||||
+#define EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE 0x02000000
|
||||
+
|
||||
+typedef uint32_t EFI_RESOURCE_TYPE;
|
||||
+typedef uint32_t EFI_RESOURCE_ATTRIBUTE_TYPE;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ EFI_GUID Owner;
|
||||
+ EFI_RESOURCE_TYPE ResourceType;
|
||||
+ EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute;
|
||||
+ EFI_PHYSICAL_ADDRESS PhysicalStart;
|
||||
+ uint64_t ResourceLength;
|
||||
+} EFI_HOB_RESOURCE_DESCRIPTOR;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ EFI_GUID Name;
|
||||
+
|
||||
+ /* guid specific data follows */
|
||||
+} EFI_HOB_GUID_TYPE;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ EFI_PHYSICAL_ADDRESS BaseAddress;
|
||||
+ uint64_t Length;
|
||||
+} EFI_HOB_FIRMWARE_VOLUME;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ EFI_PHYSICAL_ADDRESS BaseAddress;
|
||||
+ uint64_t Length;
|
||||
+ EFI_GUID FvName;
|
||||
+ EFI_GUID FileName;
|
||||
+} EFI_HOB_FIRMWARE_VOLUME2;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ EFI_PHYSICAL_ADDRESS BaseAddress;
|
||||
+ uint64_t Length;
|
||||
+ uint32_t AuthenticationStatus;
|
||||
+ bool ExtractedFv;
|
||||
+ EFI_GUID FvName;
|
||||
+ EFI_GUID FileName;
|
||||
+} EFI_HOB_FIRMWARE_VOLUME3;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+ uint8_t SizeOfMemorySpace;
|
||||
+ uint8_t SizeOfIoSpace;
|
||||
+ uint8_t Reserved[6];
|
||||
+} EFI_HOB_CPU;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+} EFI_HOB_MEMORY_POOL;
|
||||
+
|
||||
+typedef struct {
|
||||
+ EFI_HOB_GENERIC_HEADER Header;
|
||||
+
|
||||
+ EFI_PHYSICAL_ADDRESS BaseAddress;
|
||||
+ uint64_t Length;
|
||||
+} EFI_HOB_UEFI_CAPSULE;
|
||||
+
|
||||
+#define EFI_HOB_OWNER_ZERO \
|
||||
+ ((EFI_GUID){ 0x00000000, 0x0000, 0x0000, \
|
||||
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } })
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
2.50.1
|
||||
|
||||
123
SOURCES/kvm-hw-arm-smmuv3-Move-reset-to-exit-phase.patch
Normal file
123
SOURCES/kvm-hw-arm-smmuv3-Move-reset-to-exit-phase.patch
Normal file
@ -0,0 +1,123 @@
|
||||
From a3dfbe30e930c8d794057e45fffd91a9b0e6afd0 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Tue, 18 Feb 2025 19:25:33 +0100
|
||||
Subject: [PATCH 3/9] hw/arm/smmuv3: Move reset to exit phase
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 341: Fix vIOMMU reset order
|
||||
RH-Jira: RHEL-7188
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Commit: [3/5] e291cb45c32e0fab49b200c275553bbe76b97264 (eauger1/centos-qemu-kvm)
|
||||
|
||||
Currently the iommu may be reset before the devices
|
||||
it protects. For example this happens with virtio-scsi-pci.
|
||||
when system_reset is issued from qmp monitor: spurious
|
||||
"virtio: zero sized buffers are not allowed" warnings can
|
||||
be observed. This happens because outstanding DMA requests
|
||||
are still happening while the SMMU gets reset.
|
||||
|
||||
This can also happen with VFIO devices. In that case
|
||||
spurious DMA translation faults can be observed on host.
|
||||
|
||||
Make sure the SMMU is reset in the 'exit' phase after
|
||||
all DMA capable devices have been reset during the 'enter'
|
||||
or 'hold' phase.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||||
|
||||
Message-Id: <20250218182737.76722-4-eric.auger@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit e39e3f8b8dea856f141e9945167d2b18021ef445)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/smmu-common.c | 9 +++++++--
|
||||
hw/arm/smmuv3.c | 14 ++++++++++----
|
||||
hw/arm/trace-events | 1 +
|
||||
3 files changed, 18 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
|
||||
index 3f82728758..f4210fcbc1 100644
|
||||
--- a/hw/arm/smmu-common.c
|
||||
+++ b/hw/arm/smmu-common.c
|
||||
@@ -924,7 +924,12 @@ static void smmu_base_realize(DeviceState *dev, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
-static void smmu_base_reset_hold(Object *obj, ResetType type)
|
||||
+/*
|
||||
+ * Make sure the IOMMU is reset in 'exit' phase after
|
||||
+ * all outstanding DMA requests have been quiesced during
|
||||
+ * the 'enter' or 'hold' reset phases
|
||||
+ */
|
||||
+static void smmu_base_reset_exit(Object *obj, ResetType type)
|
||||
{
|
||||
SMMUState *s = ARM_SMMU(obj);
|
||||
|
||||
@@ -950,7 +955,7 @@ static void smmu_base_class_init(ObjectClass *klass, void *data)
|
||||
device_class_set_props(dc, smmu_dev_properties);
|
||||
device_class_set_parent_realize(dc, smmu_base_realize,
|
||||
&sbc->parent_realize);
|
||||
- rc->phases.hold = smmu_base_reset_hold;
|
||||
+ rc->phases.exit = smmu_base_reset_exit;
|
||||
}
|
||||
|
||||
static const TypeInfo smmu_base_info = {
|
||||
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
|
||||
index 3971976389..2e90570915 100644
|
||||
--- a/hw/arm/smmuv3.c
|
||||
+++ b/hw/arm/smmuv3.c
|
||||
@@ -1870,13 +1870,19 @@ static void smmu_init_irq(SMMUv3State *s, SysBusDevice *dev)
|
||||
}
|
||||
}
|
||||
|
||||
-static void smmu_reset_hold(Object *obj, ResetType type)
|
||||
+/*
|
||||
+ * Make sure the IOMMU is reset in 'exit' phase after
|
||||
+ * all outstanding DMA requests have been quiesced during
|
||||
+ * the 'enter' or 'hold' reset phases
|
||||
+ */
|
||||
+static void smmu_reset_exit(Object *obj, ResetType type)
|
||||
{
|
||||
SMMUv3State *s = ARM_SMMUV3(obj);
|
||||
SMMUv3Class *c = ARM_SMMUV3_GET_CLASS(s);
|
||||
|
||||
- if (c->parent_phases.hold) {
|
||||
- c->parent_phases.hold(obj, type);
|
||||
+ trace_smmu_reset_exit();
|
||||
+ if (c->parent_phases.exit) {
|
||||
+ c->parent_phases.exit(obj, type);
|
||||
}
|
||||
|
||||
smmuv3_init_regs(s);
|
||||
@@ -1999,7 +2005,7 @@ static void smmuv3_class_init(ObjectClass *klass, void *data)
|
||||
SMMUv3Class *c = ARM_SMMUV3_CLASS(klass);
|
||||
|
||||
dc->vmsd = &vmstate_smmuv3;
|
||||
- resettable_class_set_parent_phases(rc, NULL, smmu_reset_hold, NULL,
|
||||
+ resettable_class_set_parent_phases(rc, NULL, NULL, smmu_reset_exit,
|
||||
&c->parent_phases);
|
||||
device_class_set_parent_realize(dc, smmu_realize,
|
||||
&c->parent_realize);
|
||||
diff --git a/hw/arm/trace-events b/hw/arm/trace-events
|
||||
index be6c8f720b..79ef347e3e 100644
|
||||
--- a/hw/arm/trace-events
|
||||
+++ b/hw/arm/trace-events
|
||||
@@ -56,6 +56,7 @@ smmuv3_config_cache_inv(uint32_t sid) "Config cache INV for sid=0x%x"
|
||||
smmuv3_notify_flag_add(const char *iommu) "ADD SMMUNotifier node for iommu mr=%s"
|
||||
smmuv3_notify_flag_del(const char *iommu) "DEL SMMUNotifier node for iommu mr=%s"
|
||||
smmuv3_inv_notifiers_iova(const char *name, int asid, int vmid, uint64_t iova, uint8_t tg, uint64_t num_pages, int stage) "iommu mr=%s asid=%d vmid=%d iova=0x%"PRIx64" tg=%d num_pages=0x%"PRIx64" stage=%d"
|
||||
+smmu_reset_exit(void) ""
|
||||
|
||||
# strongarm.c
|
||||
strongarm_uart_update_parameters(const char *label, int speed, char parity, int data_bits, int stop_bits) "%s speed=%d parity=%c data=%d stop=%d"
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
From d589e33ff7dea4aeb69fe205bea02fb6bd7da618 Mon Sep 17 00:00:00 2001
|
||||
From 2018f62f2242d8d4a970d83ebef9b3c2bccf6fda Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:45 +0100
|
||||
Subject: [PATCH 08/31] hw/audio/ac97: skip automatic zero-init of large arrays
|
||||
Subject: [PATCH 33/57] hw/audio/ac97: skip automatic zero-init of large arrays
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [7/30] a2898256b990c1916082a9938740d0fe53da5325
|
||||
RH-Commit: [7/30] 4a6b59a9b9122d9f89e99b3e44df19e6d92ed941 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'read_audio' & 'write_audio' methods have a 4k byte array used
|
||||
for copying data between the audio backend and device. Skip the
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 63094ee4645705be09f68c547e3f1775ca528951 Mon Sep 17 00:00:00 2001
|
||||
From bd32bb22fb324a37b31ed9ac3387524f6f4ea5be Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:46 +0100
|
||||
Subject: [PATCH 09/31] hw/audio/cs4231a: skip automatic zero-init of large
|
||||
Subject: [PATCH 34/57] hw/audio/cs4231a: skip automatic zero-init of large
|
||||
arrays
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [8/30] c6117831ac2ec8e0a700207d5f101eddb67a24a4
|
||||
RH-Commit: [8/30] 6c454bcc2927e49896c62718287fb9e4b37b3bb9 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'cs_write_audio' method has a pair of byte arrays, one 4k in size
|
||||
and one 8k, which are used in converting audio samples. Skip the
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 8b487658db35f371e4a527ed18a2ae63b4048f83 Mon Sep 17 00:00:00 2001
|
||||
From cb12ddc6ed836091aa7724e2f77ab79cd9089cad Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:47 +0100
|
||||
Subject: [PATCH 10/31] hw/audio/es1370: skip automatic zero-init of large
|
||||
Subject: [PATCH 35/57] hw/audio/es1370: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [9/30] d6be11e78b1af782f12d7a25fc6c297370aafd4a
|
||||
RH-Commit: [9/30] b992e4247d8d31dc09f9dc7671e7a532558174ec (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'es1370_transfer_audio' method has a 4k byte array used for
|
||||
copying data between the audio backend and device. Skip the automatic
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
From 6aac6e3888bd249856dc5bc91a40d9b4eb60f732 Mon Sep 17 00:00:00 2001
|
||||
From 9ad7091d82fd0577488f27ab54bb7851fe957020 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:48 +0100
|
||||
Subject: [PATCH 11/31] hw/audio/gus: skip automatic zero-init of large array
|
||||
Subject: [PATCH 36/57] hw/audio/gus: skip automatic zero-init of large array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [10/30] 1af0f37dbbd3f3703988dfd6548e2ba018f05ee7
|
||||
RH-Commit: [10/30] 366953d0417ac31e3060fdc327fe8dade3375bf0 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'GUS_read_DMA' method has a 4k byte array used for copying
|
||||
data between the audio backend and device. Skip the automatic
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From ad0ae4edded2db9e7fea4c82cb22d47798b34528 Mon Sep 17 00:00:00 2001
|
||||
From 5cf61823cbe80b1ace2f5bdb9cc1971956425b98 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:49 +0100
|
||||
Subject: [PATCH 12/31] hw/audio/marvell_88w8618: skip automatic zero-init of
|
||||
Subject: [PATCH 37/57] hw/audio/marvell_88w8618: skip automatic zero-init of
|
||||
large array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [11/30] 22754626ac42807e6306becab38fbaf564a84660
|
||||
RH-Commit: [11/30] e09cdb76430552081168873dadfef1b5c8f74327 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'mv88w8618_audio_callback' method has a 4k byte array used for
|
||||
copying data between the audio backend and device. Skip the automatic
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
From 06915675e69c2ff0d1a686dcea200429f54fee74 Mon Sep 17 00:00:00 2001
|
||||
From 0b4d59d75edd49ef99f0a82fbcbe360c5b48e4f8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:50 +0100
|
||||
Subject: [PATCH 13/31] hw/audio/sb16: skip automatic zero-init of large array
|
||||
Subject: [PATCH 38/57] hw/audio/sb16: skip automatic zero-init of large array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [12/30] 93e9b488f1ec99b425cc149c3aba8f824d000c73
|
||||
RH-Commit: [12/30] 6475d67546bf04745636b317e965bcd89b6fb2d2 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'write_audio' method has a 4k byte array used for copying data
|
||||
between the audio backend and device. Skip the automatic zero-init
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 180cb8f07e5a7a1c4bfe01709b27cbf8d080f1a8 Mon Sep 17 00:00:00 2001
|
||||
From 35332282ef8bd06f59206266006eff222ffe6bec Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:51 +0100
|
||||
Subject: [PATCH 14/31] hw/audio/via-ac97: skip automatic zero-init of large
|
||||
Subject: [PATCH 39/57] hw/audio/via-ac97: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [13/30] d27c1e2fbd89df34bde1248d1b053eca40625838
|
||||
RH-Commit: [13/30] 6391a04b29fcbb8bcdbce2c6b786758fc34f0d71 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'out_cb' method has a 4k byte array used for copying data
|
||||
between the audio backend and device. Skip the automatic zero-init
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 03b3f8f230e30399e952c2c5eafde3efa7c015b3 Mon Sep 17 00:00:00 2001
|
||||
From b0c16a93460c2dfe834a9f439d25dc833dfb7427 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:52 +0100
|
||||
Subject: [PATCH 15/31] hw/char/sclpconsole-lm: skip automatic zero-init of
|
||||
Subject: [PATCH 40/57] hw/char/sclpconsole-lm: skip automatic zero-init of
|
||||
large array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [14/30] fca3dbfc00277d1c35ecdb65a56d26c95c8cb6bb
|
||||
RH-Commit: [14/30] 1491e0147a799ec523fa67fd49649722a07299e7 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'process_mdb' method has a 4k byte array used for copying data
|
||||
between the guest and the chardev backend. Skip the automatic zero-init
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 4c88a2da13473491d30328f24239fe305ff037ef Mon Sep 17 00:00:00 2001
|
||||
From 7b5624efccf55184278c6f4924efc2141df460f0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:54 +0100
|
||||
Subject: [PATCH 17/31] hw/display/vmware_vga: skip automatic zero-init of
|
||||
Subject: [PATCH 42/57] hw/display/vmware_vga: skip automatic zero-init of
|
||||
large struct
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [16/30] 7b1073ec54071782a9ad32e17293b141bee639c4
|
||||
RH-Commit: [16/30] 4aaf459d4356bf28164be742889b9a78d3656703 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'vmsvga_fifo_run' method has a struct which is a little over 20k
|
||||
in size, used for holding image data for cursor changes. Skip the
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 7208c85b822d45410d21ec42acdc872550a57262 Mon Sep 17 00:00:00 2001
|
||||
From cd3500c9e248dbefb36273046e6eee44ee0d5cbe Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:53 +0100
|
||||
Subject: [PATCH 16/31] hw/dma/xlnx_csu_dma: skip automatic zero-init of large
|
||||
Subject: [PATCH 41/57] hw/dma/xlnx_csu_dma: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [15/30] 8ffc738b76ad72de3d0925c5e44408b0f712fcef
|
||||
RH-Commit: [15/30] 063c88269c7d3bf07ae05aaf2d3d154e2016db81 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'xlnx_csu_dma_src_notify' method has a 4k byte array used for
|
||||
copying DMA data. Skip the automatic zero-init of this array to
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From c7b6fe3f924396dd49bdf13485696a536aa34fb0 Mon Sep 17 00:00:00 2001
|
||||
From a4673aab85958c60867b12c65cc3483d734bb6e0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:55 +0100
|
||||
Subject: [PATCH 18/31] hw/hyperv/syndbg: skip automatic zero-init of large
|
||||
Subject: [PATCH 43/57] hw/hyperv/syndbg: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [17/30] 4202f998aff3fd784508ab6e52658cecd197924b
|
||||
RH-Commit: [17/30] 5f71779c431128601baf46115fe65178532a3836 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'handle_recv_msg' method has a 4k byte array used for copying
|
||||
data between the network socket and guest memory. Skip the automatic
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
From 9bd4a89d3e1410b3a5994ab2b33f4332a4246955 Mon Sep 17 00:00:00 2001
|
||||
From 2bb5dff02fb393530a12f4f00219cd2f90cd442a Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Ott <sebott@redhat.com>
|
||||
Date: Thu, 15 May 2025 18:45:51 +0200
|
||||
Subject: [PATCH] hw/i386: Fix machine type compatibility
|
||||
Subject: [PATCH 3/5] hw/i386: Fix machine type compatibility
|
||||
|
||||
RH-Author: Sebastian Ott <sebott@redhat.com>
|
||||
RH-MergeRequest: 452: hw/i386: Fix machine type compatibility
|
||||
RH-Jira: RHEL-92077
|
||||
RH-MergeRequest: 364: hw/i386: Fix machine type compatibility
|
||||
RH-Jira: RHEL-91307
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-Commit: [1/1] d594f142e8ce616b6fd1accd6950ab5cebc34984
|
||||
RH-Commit: [1/1] 44ddbcb3af119c65e99018d7ed90887f3948907e (seott1/cos-qemu-kvm)
|
||||
|
||||
Upstream Status: RHEL only
|
||||
|
||||
@ -24,7 +24,7 @@ Signed-off-by: Sebastian Ott <sebott@redhat.com>
|
||||
4 files changed, 15 insertions(+)
|
||||
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index fa0e42d072..d8f1b2d899 100644
|
||||
index fa9f16cbaf..5237538640 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -298,6 +298,14 @@ GlobalProperty pc_rhel_compat[] = {
|
||||
@ -43,7 +43,7 @@ index fa0e42d072..d8f1b2d899 100644
|
||||
/* pc_rhel_9_5_compat from pc_compat_pc_9_0 (backported from 9.1) */
|
||||
{ TYPE_X86_CPU, "guest-phys-bits", "0" },
|
||||
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
|
||||
index 656abb5d39..80d366bf17 100644
|
||||
index 10764bf596..0687317db5 100644
|
||||
--- a/hw/i386/pc_piix.c
|
||||
+++ b/hw/i386/pc_piix.c
|
||||
@@ -885,6 +885,8 @@ static void pc_i440fx_rhel_machine_7_6_0_options(MachineClass *m)
|
||||
@ -56,10 +56,10 @@ index 656abb5d39..80d366bf17 100644
|
||||
pc_rhel_9_5_compat_len);
|
||||
compat_props_add(m->compat_props, hw_compat_rhel_9_5,
|
||||
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
|
||||
index 578f63524f..e3653b44cd 100644
|
||||
index 5bf08be0fb..871c760aea 100644
|
||||
--- a/hw/i386/pc_q35.c
|
||||
+++ b/hw/i386/pc_q35.c
|
||||
@@ -701,6 +701,8 @@ static void pc_q35_rhel_machine_9_4_0_options(MachineClass *m)
|
||||
@@ -704,6 +704,8 @@ static void pc_q35_rhel_machine_9_4_0_options(MachineClass *m)
|
||||
|
||||
compat_props_add(m->compat_props, hw_compat_rhel_9_6,
|
||||
hw_compat_rhel_9_6_len);
|
||||
|
||||
@ -0,0 +1,117 @@
|
||||
From f1ff9d3b379697a2d4627e9529067195841d86a8 Mon Sep 17 00:00:00 2001
|
||||
From: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Sun, 4 May 2025 17:04:05 +0000
|
||||
Subject: [PATCH 25/57] hw/i386/amd_iommu: Allow migration when explicitly
|
||||
create the AMDVI-PCI device
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 380: Add ability to manually specify the AMDVI-PCI device
|
||||
RH-Jira: RHEL-70925
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [2/3] a42b88116e608a79b6fae13ebe3709874f2a853f (johnalle/qemu-kvm-fork)
|
||||
|
||||
Add migration support for AMD IOMMU model by saving necessary AMDVIState
|
||||
parameters for MMIO registers, device table, command buffer, and event
|
||||
buffers.
|
||||
|
||||
Also change devtab_len type from size_t to uint64_t to avoid 32-bit build
|
||||
issue.
|
||||
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Message-Id: <20250504170405.12623-3-suravee.suthikulpanit@amd.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit 28931c2e1591deb4bfaaf744fdc8813e96c230f1)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-70925
|
||||
|
||||
Signed-off-by: John Allen <johnalle@redhat.com>
|
||||
---
|
||||
hw/i386/amd_iommu.c | 48 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
hw/i386/amd_iommu.h | 2 +-
|
||||
2 files changed, 49 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index 6a5e76cfef..a34e0c5f59 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -1611,8 +1611,55 @@ static void amdvi_sysbus_reset(DeviceState *dev)
|
||||
amdvi_init(s);
|
||||
}
|
||||
|
||||
+static const VMStateDescription vmstate_amdvi_sysbus_migratable = {
|
||||
+ .name = "amd-iommu",
|
||||
+ .version_id = 1,
|
||||
+ .minimum_version_id = 1,
|
||||
+ .priority = MIG_PRI_IOMMU,
|
||||
+ .fields = (VMStateField[]) {
|
||||
+ /* Updated in amdvi_handle_control_write() */
|
||||
+ VMSTATE_BOOL(enabled, AMDVIState),
|
||||
+ VMSTATE_BOOL(ga_enabled, AMDVIState),
|
||||
+ VMSTATE_BOOL(ats_enabled, AMDVIState),
|
||||
+ VMSTATE_BOOL(cmdbuf_enabled, AMDVIState),
|
||||
+ VMSTATE_BOOL(completion_wait_intr, AMDVIState),
|
||||
+ VMSTATE_BOOL(evtlog_enabled, AMDVIState),
|
||||
+ VMSTATE_BOOL(evtlog_intr, AMDVIState),
|
||||
+ /* Updated in amdvi_handle_devtab_write() */
|
||||
+ VMSTATE_UINT64(devtab, AMDVIState),
|
||||
+ VMSTATE_UINT64(devtab_len, AMDVIState),
|
||||
+ /* Updated in amdvi_handle_cmdbase_write() */
|
||||
+ VMSTATE_UINT64(cmdbuf, AMDVIState),
|
||||
+ VMSTATE_UINT64(cmdbuf_len, AMDVIState),
|
||||
+ /* Updated in amdvi_handle_cmdhead_write() */
|
||||
+ VMSTATE_UINT32(cmdbuf_head, AMDVIState),
|
||||
+ /* Updated in amdvi_handle_cmdtail_write() */
|
||||
+ VMSTATE_UINT32(cmdbuf_tail, AMDVIState),
|
||||
+ /* Updated in amdvi_handle_evtbase_write() */
|
||||
+ VMSTATE_UINT64(evtlog, AMDVIState),
|
||||
+ VMSTATE_UINT32(evtlog_len, AMDVIState),
|
||||
+ /* Updated in amdvi_handle_evthead_write() */
|
||||
+ VMSTATE_UINT32(evtlog_head, AMDVIState),
|
||||
+ /* Updated in amdvi_handle_evttail_write() */
|
||||
+ VMSTATE_UINT32(evtlog_tail, AMDVIState),
|
||||
+ /* Updated in amdvi_handle_pprbase_write() */
|
||||
+ VMSTATE_UINT64(ppr_log, AMDVIState),
|
||||
+ VMSTATE_UINT32(pprlog_len, AMDVIState),
|
||||
+ /* Updated in amdvi_handle_pprhead_write() */
|
||||
+ VMSTATE_UINT32(pprlog_head, AMDVIState),
|
||||
+ /* Updated in amdvi_handle_tailhead_write() */
|
||||
+ VMSTATE_UINT32(pprlog_tail, AMDVIState),
|
||||
+ /* MMIO registers */
|
||||
+ VMSTATE_UINT8_ARRAY(mmior, AMDVIState, AMDVI_MMIO_SIZE),
|
||||
+ VMSTATE_UINT8_ARRAY(romask, AMDVIState, AMDVI_MMIO_SIZE),
|
||||
+ VMSTATE_UINT8_ARRAY(w1cmask, AMDVIState, AMDVI_MMIO_SIZE),
|
||||
+ VMSTATE_END_OF_LIST()
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
+ DeviceClass *dc = (DeviceClass *) object_get_class(OBJECT(dev));
|
||||
AMDVIState *s = AMD_IOMMU_DEVICE(dev);
|
||||
MachineState *ms = MACHINE(qdev_get_machine());
|
||||
PCMachineState *pcms = PC_MACHINE(ms);
|
||||
@@ -1634,6 +1681,7 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
|
||||
}
|
||||
|
||||
s->pci = AMD_IOMMU_PCI(pdev);
|
||||
+ dc->vmsd = &vmstate_amdvi_sysbus_migratable;
|
||||
} else {
|
||||
s->pci = AMD_IOMMU_PCI(object_new(TYPE_AMD_IOMMU_PCI));
|
||||
/* This device should take care of IOMMU PCI properties */
|
||||
diff --git a/hw/i386/amd_iommu.h b/hw/i386/amd_iommu.h
|
||||
index ece71ff0b6..741dd9a910 100644
|
||||
--- a/hw/i386/amd_iommu.h
|
||||
+++ b/hw/i386/amd_iommu.h
|
||||
@@ -329,7 +329,7 @@ struct AMDVIState {
|
||||
bool excl_enabled;
|
||||
|
||||
hwaddr devtab; /* base address device table */
|
||||
- size_t devtab_len; /* device table length */
|
||||
+ uint64_t devtab_len; /* device table length */
|
||||
|
||||
hwaddr cmdbuf; /* command buffer base address */
|
||||
uint64_t cmdbuf_len; /* command buffer length */
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -0,0 +1,57 @@
|
||||
From e611119b8b4e0712ab103628051d69ea84538719 Mon Sep 17 00:00:00 2001
|
||||
From: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Tue, 25 Mar 2025 02:11:40 +0000
|
||||
Subject: [PATCH 23/57] hw/i386/amd_iommu: Assign pci-id 0x1419 for the AMD
|
||||
IOMMU device
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 379: hw/i386/amd_iommu: Assign pci-id 0x1419 for the AMD IOMMU device
|
||||
RH-Jira: RHEL-70926
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [1/1] 69d847f64543caf328da3e7663e7d2ebe53cd448 (johnalle/qemu-kvm-fork)
|
||||
|
||||
Currently, the QEMU-emulated AMD IOMMU device use PCI vendor id 0x1022
|
||||
(AMD) with device id zero (undefined). Eventhough this does not cause any
|
||||
functional issue for AMD IOMMU driver since it normally uses information
|
||||
in the ACPI IVRS table to probe and initialize the device per
|
||||
recommendation in the AMD IOMMU specification, the device id zero causes
|
||||
the Windows Device Manager utility to show the device as an unknown device.
|
||||
|
||||
Since Windows only recognizes AMD IOMMU device with device id 0x1419 as
|
||||
listed in the machine.inf file, modify the QEMU AMD IOMMU model to use
|
||||
the id 0x1419 to avoid the issue. This advertise the IOMMU as the AMD
|
||||
IOMMU device for Family 15h (Models 10h-1fh).
|
||||
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Message-Id: <20250325021140.5676-1-suravee.suthikulpanit@amd.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Yan Vugenfirer <yvugenfi@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit 719255486df2fcbe1b8599786b37f4bb80272f1a)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-70926
|
||||
|
||||
Signed-off-by: John Allen <johnalle@redhat.com>
|
||||
---
|
||||
hw/i386/amd_iommu.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index d804656ea8..59e1a01b7c 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -1714,6 +1714,7 @@ static void amdvi_pci_class_init(ObjectClass *klass, void *data)
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
k->vendor_id = PCI_VENDOR_ID_AMD;
|
||||
+ k->device_id = 0x1419;
|
||||
k->class_id = 0x0806;
|
||||
k->realize = amdvi_pci_realize;
|
||||
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -0,0 +1,267 @@
|
||||
From 5a697d0f66360acca8216f49c06dc9702231d470 Mon Sep 17 00:00:00 2001
|
||||
From: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Date: Sun, 4 May 2025 17:04:04 +0000
|
||||
Subject: [PATCH 24/57] hw/i386/amd_iommu: Isolate AMDVI-PCI from amd-iommu
|
||||
device to allow full control over the PCI device creation
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: John Allen <None>
|
||||
RH-MergeRequest: 380: Add ability to manually specify the AMDVI-PCI device
|
||||
RH-Jira: RHEL-70925
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [1/3] 58254a72ba2d810b57c610462494f76691126521 (johnalle/qemu-kvm-fork)
|
||||
|
||||
Current amd-iommu model internally creates an AMDVI-PCI device. Here is
|
||||
a snippet from info qtree:
|
||||
|
||||
bus: main-system-bus
|
||||
type System
|
||||
dev: amd-iommu, id ""
|
||||
xtsup = false
|
||||
pci-id = ""
|
||||
intremap = "on"
|
||||
device-iotlb = false
|
||||
pt = true
|
||||
...
|
||||
dev: q35-pcihost, id ""
|
||||
MCFG = -1 (0xffffffffffffffff)
|
||||
pci-hole64-size = 34359738368 (32 GiB)
|
||||
below-4g-mem-size = 134217728 (128 MiB)
|
||||
above-4g-mem-size = 0 (0 B)
|
||||
smm-ranges = true
|
||||
x-pci-hole64-fix = true
|
||||
x-config-reg-migration-enabled = true
|
||||
bypass-iommu = false
|
||||
bus: pcie.0
|
||||
type PCIE
|
||||
dev: AMDVI-PCI, id ""
|
||||
addr = 01.0
|
||||
romfile = ""
|
||||
romsize = 4294967295 (0xffffffff)
|
||||
rombar = -1 (0xffffffffffffffff)
|
||||
multifunction = false
|
||||
x-pcie-lnksta-dllla = true
|
||||
x-pcie-extcap-init = true
|
||||
failover_pair_id = ""
|
||||
acpi-index = 0 (0x0)
|
||||
x-pcie-err-unc-mask = true
|
||||
x-pcie-ari-nextfn-1 = false
|
||||
x-max-bounce-buffer-size = 4096 (4 KiB)
|
||||
x-pcie-ext-tag = true
|
||||
busnr = 0 (0x0)
|
||||
class Class 0806, addr 00:01.0, pci id 1022:0000 (sub 1af4:1100)
|
||||
...
|
||||
|
||||
This prohibits users from specifying the PCI topology for the amd-iommu device,
|
||||
which becomes a problem when trying to support VM migration since it does not
|
||||
guarantee the same enumeration of AMD IOMMU device.
|
||||
|
||||
Therefore, allow the 'AMDVI-PCI' device to optionally be pre-created and
|
||||
associated with a 'amd-iommu' device via a new 'pci-id' parameter on the
|
||||
latter.
|
||||
|
||||
For example:
|
||||
-device AMDVI-PCI,id=iommupci0,bus=pcie.0,addr=0x05 \
|
||||
-device amd-iommu,intremap=on,pt=on,xtsup=on,pci-id=iommupci0 \
|
||||
|
||||
For backward-compatibility, internally create the AMDVI-PCI device if not
|
||||
specified on the CLI.
|
||||
|
||||
Co-developed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
Message-Id: <20250504170405.12623-2-suravee.suthikulpanit@amd.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit f864a3235ea1d1d714b3cde2d9a810ea6344a7b5)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-70925
|
||||
|
||||
Signed-off-by: John Allen <johnalle@redhat.com>
|
||||
---
|
||||
hw/i386/acpi-build.c | 8 +++----
|
||||
hw/i386/amd_iommu.c | 53 ++++++++++++++++++++++++++------------------
|
||||
hw/i386/amd_iommu.h | 3 ++-
|
||||
3 files changed, 38 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
|
||||
index 032fb1f904..236261f8aa 100644
|
||||
--- a/hw/i386/acpi-build.c
|
||||
+++ b/hw/i386/acpi-build.c
|
||||
@@ -2392,10 +2392,10 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id,
|
||||
build_append_int_noprefix(table_data, ivhd_blob->len + 24, 2);
|
||||
/* DeviceID */
|
||||
build_append_int_noprefix(table_data,
|
||||
- object_property_get_int(OBJECT(&s->pci), "addr",
|
||||
+ object_property_get_int(OBJECT(s->pci), "addr",
|
||||
&error_abort), 2);
|
||||
/* Capability offset */
|
||||
- build_append_int_noprefix(table_data, s->pci.capab_offset, 2);
|
||||
+ build_append_int_noprefix(table_data, s->pci->capab_offset, 2);
|
||||
/* IOMMU base address */
|
||||
build_append_int_noprefix(table_data, s->mr_mmio.addr, 8);
|
||||
/* PCI Segment Group */
|
||||
@@ -2427,10 +2427,10 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id,
|
||||
build_append_int_noprefix(table_data, ivhd_blob->len + 40, 2);
|
||||
/* DeviceID */
|
||||
build_append_int_noprefix(table_data,
|
||||
- object_property_get_int(OBJECT(&s->pci), "addr",
|
||||
+ object_property_get_int(OBJECT(s->pci), "addr",
|
||||
&error_abort), 2);
|
||||
/* Capability offset */
|
||||
- build_append_int_noprefix(table_data, s->pci.capab_offset, 2);
|
||||
+ build_append_int_noprefix(table_data, s->pci->capab_offset, 2);
|
||||
/* IOMMU base address */
|
||||
build_append_int_noprefix(table_data, s->mr_mmio.addr, 8);
|
||||
/* PCI Segment Group */
|
||||
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
||||
index 59e1a01b7c..6a5e76cfef 100644
|
||||
--- a/hw/i386/amd_iommu.c
|
||||
+++ b/hw/i386/amd_iommu.c
|
||||
@@ -167,11 +167,11 @@ static void amdvi_generate_msi_interrupt(AMDVIState *s)
|
||||
{
|
||||
MSIMessage msg = {};
|
||||
MemTxAttrs attrs = {
|
||||
- .requester_id = pci_requester_id(&s->pci.dev)
|
||||
+ .requester_id = pci_requester_id(&s->pci->dev)
|
||||
};
|
||||
|
||||
- if (msi_enabled(&s->pci.dev)) {
|
||||
- msg = msi_get_message(&s->pci.dev, 0);
|
||||
+ if (msi_enabled(&s->pci->dev)) {
|
||||
+ msg = msi_get_message(&s->pci->dev, 0);
|
||||
address_space_stl_le(&address_space_memory, msg.address, msg.data,
|
||||
attrs, NULL);
|
||||
}
|
||||
@@ -239,7 +239,7 @@ static void amdvi_page_fault(AMDVIState *s, uint16_t devid,
|
||||
info |= AMDVI_EVENT_IOPF_I | AMDVI_EVENT_IOPF;
|
||||
amdvi_encode_event(evt, devid, addr, info);
|
||||
amdvi_log_event(s, evt);
|
||||
- pci_word_test_and_set_mask(s->pci.dev.config + PCI_STATUS,
|
||||
+ pci_word_test_and_set_mask(s->pci->dev.config + PCI_STATUS,
|
||||
PCI_STATUS_SIG_TARGET_ABORT);
|
||||
}
|
||||
/*
|
||||
@@ -256,7 +256,7 @@ static void amdvi_log_devtab_error(AMDVIState *s, uint16_t devid,
|
||||
|
||||
amdvi_encode_event(evt, devid, devtab, info);
|
||||
amdvi_log_event(s, evt);
|
||||
- pci_word_test_and_set_mask(s->pci.dev.config + PCI_STATUS,
|
||||
+ pci_word_test_and_set_mask(s->pci->dev.config + PCI_STATUS,
|
||||
PCI_STATUS_SIG_TARGET_ABORT);
|
||||
}
|
||||
/* log an event trying to access command buffer
|
||||
@@ -269,7 +269,7 @@ static void amdvi_log_command_error(AMDVIState *s, hwaddr addr)
|
||||
|
||||
amdvi_encode_event(evt, 0, addr, info);
|
||||
amdvi_log_event(s, evt);
|
||||
- pci_word_test_and_set_mask(s->pci.dev.config + PCI_STATUS,
|
||||
+ pci_word_test_and_set_mask(s->pci->dev.config + PCI_STATUS,
|
||||
PCI_STATUS_SIG_TARGET_ABORT);
|
||||
}
|
||||
/* log an illegal command event
|
||||
@@ -310,7 +310,7 @@ static void amdvi_log_pagetab_error(AMDVIState *s, uint16_t devid,
|
||||
info |= AMDVI_EVENT_PAGE_TAB_HW_ERROR;
|
||||
amdvi_encode_event(evt, devid, addr, info);
|
||||
amdvi_log_event(s, evt);
|
||||
- pci_word_test_and_set_mask(s->pci.dev.config + PCI_STATUS,
|
||||
+ pci_word_test_and_set_mask(s->pci->dev.config + PCI_STATUS,
|
||||
PCI_STATUS_SIG_TARGET_ABORT);
|
||||
}
|
||||
|
||||
@@ -1607,7 +1607,7 @@ static void amdvi_sysbus_reset(DeviceState *dev)
|
||||
{
|
||||
AMDVIState *s = AMD_IOMMU_DEVICE(dev);
|
||||
|
||||
- msi_reset(&s->pci.dev);
|
||||
+ msi_reset(&s->pci->dev);
|
||||
amdvi_init(s);
|
||||
}
|
||||
|
||||
@@ -1619,14 +1619,32 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
|
||||
X86MachineState *x86ms = X86_MACHINE(ms);
|
||||
PCIBus *bus = pcms->pcibus;
|
||||
|
||||
- s->iotlb = g_hash_table_new_full(amdvi_uint64_hash,
|
||||
- amdvi_uint64_equal, g_free, g_free);
|
||||
+ if (s->pci_id) {
|
||||
+ PCIDevice *pdev = NULL;
|
||||
+ int ret = pci_qdev_find_device(s->pci_id, &pdev);
|
||||
|
||||
- /* This device should take care of IOMMU PCI properties */
|
||||
- if (!qdev_realize(DEVICE(&s->pci), &bus->qbus, errp)) {
|
||||
- return;
|
||||
+ if (ret) {
|
||||
+ error_report("Cannot find PCI device '%s'", s->pci_id);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (!object_dynamic_cast(OBJECT(pdev), TYPE_AMD_IOMMU_PCI)) {
|
||||
+ error_report("Device '%s' must be an AMDVI-PCI device type", s->pci_id);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ s->pci = AMD_IOMMU_PCI(pdev);
|
||||
+ } else {
|
||||
+ s->pci = AMD_IOMMU_PCI(object_new(TYPE_AMD_IOMMU_PCI));
|
||||
+ /* This device should take care of IOMMU PCI properties */
|
||||
+ if (!qdev_realize(DEVICE(s->pci), &bus->qbus, errp)) {
|
||||
+ return;
|
||||
+ }
|
||||
}
|
||||
|
||||
+ s->iotlb = g_hash_table_new_full(amdvi_uint64_hash,
|
||||
+ amdvi_uint64_equal, g_free, g_free);
|
||||
+
|
||||
/* Pseudo address space under root PCI bus. */
|
||||
x86ms->ioapic_as = amdvi_host_dma_iommu(bus, s, AMDVI_IOAPIC_SB_DEVID);
|
||||
|
||||
@@ -1668,6 +1686,7 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
|
||||
|
||||
static Property amdvi_properties[] = {
|
||||
DEFINE_PROP_BOOL("xtsup", AMDVIState, xtsup, false),
|
||||
+ DEFINE_PROP_STRING("pci-id", AMDVIState, pci_id),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
@@ -1676,13 +1695,6 @@ static const VMStateDescription vmstate_amdvi_sysbus = {
|
||||
.unmigratable = 1
|
||||
};
|
||||
|
||||
-static void amdvi_sysbus_instance_init(Object *klass)
|
||||
-{
|
||||
- AMDVIState *s = AMD_IOMMU_DEVICE(klass);
|
||||
-
|
||||
- object_initialize(&s->pci, sizeof(s->pci), TYPE_AMD_IOMMU_PCI);
|
||||
-}
|
||||
-
|
||||
static void amdvi_sysbus_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
@@ -1704,7 +1716,6 @@ static const TypeInfo amdvi_sysbus = {
|
||||
.name = TYPE_AMD_IOMMU_DEVICE,
|
||||
.parent = TYPE_X86_IOMMU_DEVICE,
|
||||
.instance_size = sizeof(AMDVIState),
|
||||
- .instance_init = amdvi_sysbus_instance_init,
|
||||
.class_init = amdvi_sysbus_class_init
|
||||
};
|
||||
|
||||
diff --git a/hw/i386/amd_iommu.h b/hw/i386/amd_iommu.h
|
||||
index e0dac4d9a9..ece71ff0b6 100644
|
||||
--- a/hw/i386/amd_iommu.h
|
||||
+++ b/hw/i386/amd_iommu.h
|
||||
@@ -315,7 +315,8 @@ struct AMDVIPCIState {
|
||||
|
||||
struct AMDVIState {
|
||||
X86IOMMUState iommu; /* IOMMU bus device */
|
||||
- AMDVIPCIState pci; /* IOMMU PCI device */
|
||||
+ AMDVIPCIState *pci; /* IOMMU PCI device */
|
||||
+ char *pci_id; /* ID of AMDVI-PCI device, if user created */
|
||||
|
||||
uint32_t version;
|
||||
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -0,0 +1,96 @@
|
||||
From 67b281dc1ccdae05da6c6052c264ecd94723c0b2 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Tue, 18 Feb 2025 19:25:32 +0100
|
||||
Subject: [PATCH 2/9] hw/i386/intel-iommu: Migrate to 3-phase reset
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 341: Fix vIOMMU reset order
|
||||
RH-Jira: RHEL-7188
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Commit: [2/5] 5b9b60b2b796529db10b846881e82e7df4626ec1 (eauger1/centos-qemu-kvm)
|
||||
|
||||
Currently the IOMMU may be reset before the devices
|
||||
it protects. For example this happens with virtio devices
|
||||
but also with VFIO devices. In this latter case this
|
||||
produces spurious translation faults on host.
|
||||
|
||||
Let's use 3-phase reset mechanism and reset the IOMMU on
|
||||
exit phase after all DMA capable devices have been reset
|
||||
on 'enter' or 'hold' phase.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
Acked-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Acked-by: Jason Wang <jasowang@redhat.com>
|
||||
Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||||
|
||||
Message-Id: <20250218182737.76722-3-eric.auger@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit 2aaf48bcf27d8b3da5b30af6c1ced464d3df30f7)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
|
||||
Conflicts: Code change
|
||||
hw/i386/intel_iommu.c
|
||||
We miss e3d0814368d0 ("hw: Use device_class_set_legacy_reset() instead
|
||||
of opencoding") meaning that instead of removing
|
||||
device_class_set_legacy_reset(dc, vtd_reset) we remove
|
||||
dc->reset = vtd_reset;
|
||||
---
|
||||
hw/i386/intel_iommu.c | 12 +++++++++---
|
||||
hw/i386/trace-events | 1 +
|
||||
2 files changed, 10 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
|
||||
index 16d2885fcc..4acefcf5c8 100644
|
||||
--- a/hw/i386/intel_iommu.c
|
||||
+++ b/hw/i386/intel_iommu.c
|
||||
@@ -4212,10 +4212,11 @@ static void vtd_init(IntelIOMMUState *s)
|
||||
/* Should not reset address_spaces when reset because devices will still use
|
||||
* the address space they got at first (won't ask the bus again).
|
||||
*/
|
||||
-static void vtd_reset(DeviceState *dev)
|
||||
+static void vtd_reset_exit(Object *obj, ResetType type)
|
||||
{
|
||||
- IntelIOMMUState *s = INTEL_IOMMU_DEVICE(dev);
|
||||
+ IntelIOMMUState *s = INTEL_IOMMU_DEVICE(obj);
|
||||
|
||||
+ trace_vtd_reset_exit();
|
||||
vtd_init(s);
|
||||
vtd_address_space_refresh_all(s);
|
||||
}
|
||||
@@ -4367,8 +4368,13 @@ static void vtd_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
X86IOMMUClass *x86_class = X86_IOMMU_DEVICE_CLASS(klass);
|
||||
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
- dc->reset = vtd_reset;
|
||||
+ /*
|
||||
+ * Use 'exit' reset phase to make sure all DMA requests
|
||||
+ * have been quiesced during 'enter' or 'hold' phase
|
||||
+ */
|
||||
+ rc->phases.exit = vtd_reset_exit;
|
||||
dc->vmsd = &vtd_vmstate;
|
||||
device_class_set_props(dc, vtd_properties);
|
||||
dc->hotpluggable = false;
|
||||
diff --git a/hw/i386/trace-events b/hw/i386/trace-events
|
||||
index 53c02d7ac8..ac9e1a10aa 100644
|
||||
--- a/hw/i386/trace-events
|
||||
+++ b/hw/i386/trace-events
|
||||
@@ -68,6 +68,7 @@ vtd_frr_new(int index, uint64_t hi, uint64_t lo) "index %d high 0x%"PRIx64" low
|
||||
vtd_warn_invalid_qi_tail(uint16_t tail) "tail 0x%"PRIx16
|
||||
vtd_warn_ir_vector(uint16_t sid, int index, int vec, int target) "sid 0x%"PRIx16" index %d vec %d (should be: %d)"
|
||||
vtd_warn_ir_trigger(uint16_t sid, int index, int trig, int target) "sid 0x%"PRIx16" index %d trigger %d (should be: %d)"
|
||||
+vtd_reset_exit(void) ""
|
||||
|
||||
# amd_iommu.c
|
||||
amdvi_evntlog_fail(uint64_t addr, uint32_t head) "error: fail to write at addr 0x%"PRIx64" + offset 0x%"PRIx32
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From ee75cefe77904ffc659bdb2df32feef7e01a914e Mon Sep 17 00:00:00 2001
|
||||
From 0bfbd2c49c01ee77d3b5a21bf9fe675916cbf0ed Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:56 +0100
|
||||
Subject: [PATCH 19/31] hw/misc/aspeed_hace: skip automatic zero-init of large
|
||||
Subject: [PATCH 44/57] hw/misc/aspeed_hace: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [18/30] fb1e9ede27fca69cf9074c2590c221dce3633a68
|
||||
RH-Commit: [18/30] ec8510be6b23b26b3eecd6767e1deb0c0c50dd58 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'do_hash_operation' method has a 256 element iovec array used for
|
||||
holding pointers to data that is to be hashed. Skip the automatic
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
From 09fe29d40b3d1e30e0e921e186a797c4da5ac583 Mon Sep 17 00:00:00 2001
|
||||
From cc173deaaa4d9dc6ad9188e0b03f46b7e64f26b2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:57 +0100
|
||||
Subject: [PATCH 20/31] hw/net/rtl8139: skip automatic zero-init of large array
|
||||
Subject: [PATCH 45/57] hw/net/rtl8139: skip automatic zero-init of large array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [19/30] 3c072f59b9a283b40327117585d9f01d32ecc081
|
||||
RH-Commit: [19/30] 344c720aef2feb35f84fd4b21f2b1b31e5572286 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'rtl8139_transmit_one' method has a 8k byte array used for
|
||||
copying data between guest and host. Skip the automatic zero-init
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
From f9a1a355dbd2d59bbd80d33e713579d93fe3932f Mon Sep 17 00:00:00 2001
|
||||
From 400b5c8ae7f06a450ef91230343d7ce489142a38 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:58 +0100
|
||||
Subject: [PATCH 21/31] hw/net/tulip: skip automatic zero-init of large array
|
||||
Subject: [PATCH 46/57] hw/net/tulip: skip automatic zero-init of large array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [20/30] ff60b673f4e06a25fd5efbc51f5536da5d9c99f5
|
||||
RH-Commit: [20/30] b3d29de8495c0ff40c26974673adefe4eb27a417 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'tulip_setup_frame' method has a 4k byte array used for copynig
|
||||
DMA data from the device. Skip the automatic zero-init of this array
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 9ecc539204dd6ab7a1124089f9e557248e321282 Mon Sep 17 00:00:00 2001
|
||||
From 0925796a4537e20e033a675ebc8899e4580235f3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:59 +0100
|
||||
Subject: [PATCH 22/31] hw/net/virtio-net: skip automatic zero-init of large
|
||||
Subject: [PATCH 47/57] hw/net/virtio-net: skip automatic zero-init of large
|
||||
arrays
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [21/30] f093a50cc162bd376fd74ea47c6274d7e718ba69
|
||||
RH-Commit: [21/30] 0450189a4c4c779b5a1850e9ea8278a5129c5f7f (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'virtio_net_receive_rcu' method has three arrays with
|
||||
VIRTQUEUE_MAX_SIZE elements, which are apprixmately 32k in
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
From 3b39fa3e031d5b8a89c05302f3d73e7d4748bf58 Mon Sep 17 00:00:00 2001
|
||||
From 34116b3a243f005938a30e9b38c6f47a62752c3e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:37:00 +0100
|
||||
Subject: [PATCH 23/31] hw/net/xgamc: skip automatic zero-init of large array
|
||||
Subject: [PATCH 48/57] hw/net/xgamc: skip automatic zero-init of large array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [22/30] d83a91284970ced6f60964ded15d04405845e8bb
|
||||
RH-Commit: [22/30] 63536d627705775c4bf72a511de3d68ec30ac7de (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'xgmac_enet_send' method has a 8k byte array used for copying
|
||||
data between guest and host. Skip the automatic zero-init of this
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
From 794d838efddc7e96f6e40c1c4bb2b1baf3c95cfb Mon Sep 17 00:00:00 2001
|
||||
From 3e0134b45828bf9a623a26ac41d5fbb3a8d2917b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:37:01 +0100
|
||||
Subject: [PATCH 24/31] hw/nvme/ctrl: skip automatic zero-init of large arrays
|
||||
Subject: [PATCH 49/57] hw/nvme/ctrl: skip automatic zero-init of large arrays
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [23/30] 97877d2e280daf654f5893461c0bc9e6f6caa77d
|
||||
RH-Commit: [23/30] 57ce4361ffb307be4ea4d3edf9e0dac269d16908 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'nvme_map_sgl' method has a 256 element array used for copying
|
||||
data from the device. Skip the automatic zero-init of this array
|
||||
@ -37,7 +37,7 @@ Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
|
||||
index 9f277b81d8..f000e2246f 100644
|
||||
index d451ee0d00..75d7f20801 100644
|
||||
--- a/hw/nvme/ctrl.c
|
||||
+++ b/hw/nvme/ctrl.c
|
||||
@@ -1047,7 +1047,8 @@ static uint16_t nvme_map_sgl(NvmeCtrl *n, NvmeSg *sg, NvmeSglDescriptor sgl,
|
||||
|
||||
242
SOURCES/kvm-hw-pci-Basic-support-for-PCI-power-management.patch
Normal file
242
SOURCES/kvm-hw-pci-Basic-support-for-PCI-power-management.patch
Normal file
@ -0,0 +1,242 @@
|
||||
From 98b0cd83c09d35a3da0ae142c09038174355e87e Mon Sep 17 00:00:00 2001
|
||||
From: Alex Williamson <alex.williamson@redhat.com>
|
||||
Date: Tue, 25 Feb 2025 14:52:25 -0700
|
||||
Subject: [PATCH 2/7] hw/pci: Basic support for PCI power management
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 348: PCI: Implement basic PCI PM capability backing
|
||||
RH-Jira: RHEL-7301
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Acked-by: Alex Williamson <None>
|
||||
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-Commit: [2/6] 5faff6382c124711887704fff4f857e8f85e7be5 (eauger1/centos-qemu-kvm)
|
||||
|
||||
Conflicts: contextual conflict in include/hw/pci/pci.h
|
||||
we don't have 449dca6ac93a ("pcie: enable Extended tag field support")
|
||||
downstream so we don't have x-pcie-ext-tag definition.
|
||||
|
||||
The memory and IO BARs for devices are only accessible in the D0 power
|
||||
state. In other power states the PCI spec defines that the device
|
||||
responds to TLPs and messages with an Unsupported Request response.
|
||||
|
||||
To approximate this behavior, consider the BARs as unmapped when the
|
||||
device is not in the D0 power state. This makes the BARs inaccessible
|
||||
and has the additional bonus for vfio-pci that we don't attempt to DMA
|
||||
map BARs for devices in a non-D0 power state.
|
||||
|
||||
To support this, an interface is added for devices to register the PM
|
||||
capability, which allows central tracking to enforce valid transitions
|
||||
and unmap BARs in non-D0 states.
|
||||
|
||||
NB. We currently have device models (eepro100 and pcie_pci_bridge)
|
||||
that register a PM capability but do not set wmask to enable writes to
|
||||
the power state field. In order to maintain migration compatibility,
|
||||
this new helper does not manage the wmask to enable guest writes to
|
||||
initiate a power state change. The contents and write access of the
|
||||
PM capability are still managed by the caller.
|
||||
|
||||
Cc: Michael S. Tsirkin <mst@redhat.com>
|
||||
Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
|
||||
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Link: https://lore.kernel.org/qemu-devel/20250225215237.3314011-2-alex.williamson@redhat.com
|
||||
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||
(cherry picked from commit 9461afd2008b0820fc45a6a7bc675df1b6791e4f)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/pci/pci.c | 93 ++++++++++++++++++++++++++++++++++++-
|
||||
hw/pci/trace-events | 2 +
|
||||
include/hw/pci/pci.h | 3 ++
|
||||
include/hw/pci/pci_device.h | 3 ++
|
||||
4 files changed, 99 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
|
||||
index 83c9d5b9ea..d774ae47d2 100644
|
||||
--- a/hw/pci/pci.c
|
||||
+++ b/hw/pci/pci.c
|
||||
@@ -365,6 +365,84 @@ static void pci_msi_trigger(PCIDevice *dev, MSIMessage msg)
|
||||
attrs, NULL);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Register and track a PM capability. If wmask is also enabled for the power
|
||||
+ * state field of the pmcsr register, guest writes may change the device PM
|
||||
+ * state. BAR access is only enabled while the device is in the D0 state.
|
||||
+ * Return the capability offset or negative error code.
|
||||
+ */
|
||||
+int pci_pm_init(PCIDevice *d, uint8_t offset, Error **errp)
|
||||
+{
|
||||
+ int cap = pci_add_capability(d, PCI_CAP_ID_PM, offset, PCI_PM_SIZEOF, errp);
|
||||
+
|
||||
+ if (cap < 0) {
|
||||
+ return cap;
|
||||
+ }
|
||||
+
|
||||
+ d->pm_cap = cap;
|
||||
+ d->cap_present |= QEMU_PCI_CAP_PM;
|
||||
+
|
||||
+ return cap;
|
||||
+}
|
||||
+
|
||||
+static uint8_t pci_pm_state(PCIDevice *d)
|
||||
+{
|
||||
+ uint16_t pmcsr;
|
||||
+
|
||||
+ if (!(d->cap_present & QEMU_PCI_CAP_PM)) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ pmcsr = pci_get_word(d->config + d->pm_cap + PCI_PM_CTRL);
|
||||
+
|
||||
+ return pmcsr & PCI_PM_CTRL_STATE_MASK;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Update the PM capability state based on the new value stored in config
|
||||
+ * space respective to the old, pre-write state provided. If the new value
|
||||
+ * is rejected (unsupported or invalid transition) restore the old value.
|
||||
+ * Return the resulting PM state.
|
||||
+ */
|
||||
+static uint8_t pci_pm_update(PCIDevice *d, uint32_t addr, int l, uint8_t old)
|
||||
+{
|
||||
+ uint16_t pmc;
|
||||
+ uint8_t new;
|
||||
+
|
||||
+ if (!(d->cap_present & QEMU_PCI_CAP_PM) ||
|
||||
+ !range_covers_byte(addr, l, d->pm_cap + PCI_PM_CTRL)) {
|
||||
+ return old;
|
||||
+ }
|
||||
+
|
||||
+ new = pci_pm_state(d);
|
||||
+ if (new == old) {
|
||||
+ return old;
|
||||
+ }
|
||||
+
|
||||
+ pmc = pci_get_word(d->config + d->pm_cap + PCI_PM_PMC);
|
||||
+
|
||||
+ /*
|
||||
+ * Transitions to D1 & D2 are only allowed if supported. Devices may
|
||||
+ * only transition to higher D-states or to D0.
|
||||
+ */
|
||||
+ if ((!(pmc & PCI_PM_CAP_D1) && new == 1) ||
|
||||
+ (!(pmc & PCI_PM_CAP_D2) && new == 2) ||
|
||||
+ (old && new && new < old)) {
|
||||
+ pci_word_test_and_clear_mask(d->config + d->pm_cap + PCI_PM_CTRL,
|
||||
+ PCI_PM_CTRL_STATE_MASK);
|
||||
+ pci_word_test_and_set_mask(d->config + d->pm_cap + PCI_PM_CTRL,
|
||||
+ old);
|
||||
+ trace_pci_pm_bad_transition(d->name, pci_dev_bus_num(d),
|
||||
+ PCI_SLOT(d->devfn), PCI_FUNC(d->devfn),
|
||||
+ old, new);
|
||||
+ return old;
|
||||
+ }
|
||||
+
|
||||
+ trace_pci_pm_transition(d->name, pci_dev_bus_num(d), PCI_SLOT(d->devfn),
|
||||
+ PCI_FUNC(d->devfn), old, new);
|
||||
+ return new;
|
||||
+}
|
||||
+
|
||||
static void pci_reset_regions(PCIDevice *dev)
|
||||
{
|
||||
int r;
|
||||
@@ -404,6 +482,11 @@ static void pci_do_device_reset(PCIDevice *dev)
|
||||
pci_get_word(dev->wmask + PCI_INTERRUPT_LINE) |
|
||||
pci_get_word(dev->w1cmask + PCI_INTERRUPT_LINE));
|
||||
dev->config[PCI_CACHE_LINE_SIZE] = 0x0;
|
||||
+ /* Default PM state is D0 */
|
||||
+ if (dev->cap_present & QEMU_PCI_CAP_PM) {
|
||||
+ pci_word_test_and_clear_mask(dev->config + dev->pm_cap + PCI_PM_CTRL,
|
||||
+ PCI_PM_CTRL_STATE_MASK);
|
||||
+ }
|
||||
pci_reset_regions(dev);
|
||||
pci_update_mappings(dev);
|
||||
|
||||
@@ -1525,7 +1608,7 @@ static void pci_update_mappings(PCIDevice *d)
|
||||
continue;
|
||||
|
||||
new_addr = pci_bar_address(d, i, r->type, r->size);
|
||||
- if (!d->enabled) {
|
||||
+ if (!d->enabled || pci_pm_state(d)) {
|
||||
new_addr = PCI_BAR_UNMAPPED;
|
||||
}
|
||||
|
||||
@@ -1591,6 +1674,7 @@ uint32_t pci_default_read_config(PCIDevice *d,
|
||||
|
||||
void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val_in, int l)
|
||||
{
|
||||
+ uint8_t new_pm_state, old_pm_state = pci_pm_state(d);
|
||||
int i, was_irq_disabled = pci_irq_disabled(d);
|
||||
uint32_t val = val_in;
|
||||
|
||||
@@ -1603,11 +1687,16 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val_in, int
|
||||
d->config[addr + i] = (d->config[addr + i] & ~wmask) | (val & wmask);
|
||||
d->config[addr + i] &= ~(val & w1cmask); /* W1C: Write 1 to Clear */
|
||||
}
|
||||
+
|
||||
+ new_pm_state = pci_pm_update(d, addr, l, old_pm_state);
|
||||
+
|
||||
if (ranges_overlap(addr, l, PCI_BASE_ADDRESS_0, 24) ||
|
||||
ranges_overlap(addr, l, PCI_ROM_ADDRESS, 4) ||
|
||||
ranges_overlap(addr, l, PCI_ROM_ADDRESS1, 4) ||
|
||||
- range_covers_byte(addr, l, PCI_COMMAND))
|
||||
+ range_covers_byte(addr, l, PCI_COMMAND) ||
|
||||
+ !!new_pm_state != !!old_pm_state) {
|
||||
pci_update_mappings(d);
|
||||
+ }
|
||||
|
||||
if (ranges_overlap(addr, l, PCI_COMMAND, 2)) {
|
||||
pci_update_irq_disabled(d, was_irq_disabled);
|
||||
diff --git a/hw/pci/trace-events b/hw/pci/trace-events
|
||||
index 19643aa8c6..c82a87ffdd 100644
|
||||
--- a/hw/pci/trace-events
|
||||
+++ b/hw/pci/trace-events
|
||||
@@ -1,6 +1,8 @@
|
||||
# See docs/devel/tracing.rst for syntax documentation.
|
||||
|
||||
# pci.c
|
||||
+pci_pm_bad_transition(const char *dev, uint32_t bus, uint32_t slot, uint32_t func, uint8_t old, uint8_t new) "%s %02x:%02x.%x REJECTED PM transition D%d->D%d"
|
||||
+pci_pm_transition(const char *dev, uint32_t bus, uint32_t slot, uint32_t func, uint8_t old, uint8_t new) "%s %02x:%02x.%x PM transition D%d->D%d"
|
||||
pci_update_mappings_del(const char *dev, uint32_t bus, uint32_t slot, uint32_t func, int bar, uint64_t addr, uint64_t size) "%s %02x:%02x.%x %d,0x%"PRIx64"+0x%"PRIx64
|
||||
pci_update_mappings_add(const char *dev, uint32_t bus, uint32_t slot, uint32_t func, int bar, uint64_t addr, uint64_t size) "%s %02x:%02x.%x %d,0x%"PRIx64"+0x%"PRIx64
|
||||
pci_route_irq(int dev_irq, const char *dev_path, int parent_irq, const char *parent_path) "IRQ %d @%s -> IRQ %d @%s"
|
||||
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
|
||||
index 45365ae085..afeb5a2263 100644
|
||||
--- a/include/hw/pci/pci.h
|
||||
+++ b/include/hw/pci/pci.h
|
||||
@@ -213,6 +213,8 @@ enum {
|
||||
QEMU_PCIE_ERR_UNC_MASK = (1 << QEMU_PCIE_ERR_UNC_MASK_BITNR),
|
||||
#define QEMU_PCIE_ARI_NEXTFN_1_BITNR 12
|
||||
QEMU_PCIE_ARI_NEXTFN_1 = (1 << QEMU_PCIE_ARI_NEXTFN_1_BITNR),
|
||||
+#define QEMU_PCI_CAP_PM_BITNR 14
|
||||
+ QEMU_PCI_CAP_PM = (1 << QEMU_PCI_CAP_PM_BITNR),
|
||||
};
|
||||
|
||||
typedef struct PCIINTxRoute {
|
||||
@@ -680,5 +682,6 @@ static inline void pci_irq_pulse(PCIDevice *pci_dev)
|
||||
MSIMessage pci_get_msi_message(PCIDevice *dev, int vector);
|
||||
void pci_set_enabled(PCIDevice *pci_dev, bool state);
|
||||
void pci_set_power(PCIDevice *pci_dev, bool state);
|
||||
+int pci_pm_init(PCIDevice *pci_dev, uint8_t offset, Error **errp);
|
||||
|
||||
#endif
|
||||
diff --git a/include/hw/pci/pci_device.h b/include/hw/pci/pci_device.h
|
||||
index f38fb31119..325d7bcaf7 100644
|
||||
--- a/include/hw/pci/pci_device.h
|
||||
+++ b/include/hw/pci/pci_device.h
|
||||
@@ -105,6 +105,9 @@ struct PCIDevice {
|
||||
/* Capability bits */
|
||||
uint32_t cap_present;
|
||||
|
||||
+ /* Offset of PM capability in config space */
|
||||
+ uint8_t pm_cap;
|
||||
+
|
||||
/* Offset of MSI-X capability in config space */
|
||||
uint8_t msix_cap;
|
||||
|
||||
--
|
||||
2.48.1
|
||||
|
||||
130
SOURCES/kvm-hw-pci-Rename-has_power-to-enabled.patch
Normal file
130
SOURCES/kvm-hw-pci-Rename-has_power-to-enabled.patch
Normal file
@ -0,0 +1,130 @@
|
||||
From 8711bb1a54d4f5734d44545cd8e7262bc358f51d Mon Sep 17 00:00:00 2001
|
||||
From: Akihiko Odaki <akihiko.odaki@daynix.com>
|
||||
Date: Thu, 9 Jan 2025 15:29:46 +0900
|
||||
Subject: [PATCH 1/7] hw/pci: Rename has_power to enabled
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 348: PCI: Implement basic PCI PM capability backing
|
||||
RH-Jira: RHEL-7301
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Acked-by: Alex Williamson <None>
|
||||
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-Commit: [1/6] ac8a7427a1203e33aa323933818a7114c0eb4520 (eauger1/centos-qemu-kvm)
|
||||
|
||||
The renamed state will not only represent powering state of PFs, but
|
||||
also represent SR-IOV VF enablement in the future.
|
||||
|
||||
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Message-ID: <20250109-reuse-v19-1-f541e82ca5f7@daynix.com>
|
||||
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
(cherry picked from commit c407eef162f765dd83d45e048585731be41a66fc)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/pci/pci.c | 17 +++++++++++------
|
||||
hw/pci/pci_host.c | 4 ++--
|
||||
include/hw/pci/pci.h | 1 +
|
||||
include/hw/pci/pci_device.h | 2 +-
|
||||
4 files changed, 15 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
|
||||
index fab86d0567..83c9d5b9ea 100644
|
||||
--- a/hw/pci/pci.c
|
||||
+++ b/hw/pci/pci.c
|
||||
@@ -1525,7 +1525,7 @@ static void pci_update_mappings(PCIDevice *d)
|
||||
continue;
|
||||
|
||||
new_addr = pci_bar_address(d, i, r->type, r->size);
|
||||
- if (!d->has_power) {
|
||||
+ if (!d->enabled) {
|
||||
new_addr = PCI_BAR_UNMAPPED;
|
||||
}
|
||||
|
||||
@@ -1613,7 +1613,7 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val_in, int
|
||||
pci_update_irq_disabled(d, was_irq_disabled);
|
||||
memory_region_set_enabled(&d->bus_master_enable_region,
|
||||
(pci_get_word(d->config + PCI_COMMAND)
|
||||
- & PCI_COMMAND_MASTER) && d->has_power);
|
||||
+ & PCI_COMMAND_MASTER) && d->enabled);
|
||||
}
|
||||
|
||||
msi_write_config(d, addr, val_in, l);
|
||||
@@ -2886,16 +2886,21 @@ MSIMessage pci_get_msi_message(PCIDevice *dev, int vector)
|
||||
|
||||
void pci_set_power(PCIDevice *d, bool state)
|
||||
{
|
||||
- if (d->has_power == state) {
|
||||
+ pci_set_enabled(d, state);
|
||||
+}
|
||||
+
|
||||
+void pci_set_enabled(PCIDevice *d, bool state)
|
||||
+{
|
||||
+ if (d->enabled == state) {
|
||||
return;
|
||||
}
|
||||
|
||||
- d->has_power = state;
|
||||
+ d->enabled = state;
|
||||
pci_update_mappings(d);
|
||||
memory_region_set_enabled(&d->bus_master_enable_region,
|
||||
(pci_get_word(d->config + PCI_COMMAND)
|
||||
- & PCI_COMMAND_MASTER) && d->has_power);
|
||||
- if (!d->has_power) {
|
||||
+ & PCI_COMMAND_MASTER) && d->enabled);
|
||||
+ if (!d->enabled) {
|
||||
pci_device_reset(d);
|
||||
}
|
||||
}
|
||||
diff --git a/hw/pci/pci_host.c b/hw/pci/pci_host.c
|
||||
index dfe6fe6184..0d82727cc9 100644
|
||||
--- a/hw/pci/pci_host.c
|
||||
+++ b/hw/pci/pci_host.c
|
||||
@@ -86,7 +86,7 @@ void pci_host_config_write_common(PCIDevice *pci_dev, uint32_t addr,
|
||||
* allowing direct removal of unexposed functions.
|
||||
*/
|
||||
if ((pci_dev->qdev.hotplugged && !pci_get_function_0(pci_dev)) ||
|
||||
- !pci_dev->has_power || is_pci_dev_ejected(pci_dev)) {
|
||||
+ !pci_dev->enabled || is_pci_dev_ejected(pci_dev)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ uint32_t pci_host_config_read_common(PCIDevice *pci_dev, uint32_t addr,
|
||||
* allowing direct removal of unexposed functions.
|
||||
*/
|
||||
if ((pci_dev->qdev.hotplugged && !pci_get_function_0(pci_dev)) ||
|
||||
- !pci_dev->has_power || is_pci_dev_ejected(pci_dev)) {
|
||||
+ !pci_dev->enabled || is_pci_dev_ejected(pci_dev)) {
|
||||
return ~0x0;
|
||||
}
|
||||
|
||||
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
|
||||
index eb26cac810..45365ae085 100644
|
||||
--- a/include/hw/pci/pci.h
|
||||
+++ b/include/hw/pci/pci.h
|
||||
@@ -678,6 +678,7 @@ static inline void pci_irq_pulse(PCIDevice *pci_dev)
|
||||
}
|
||||
|
||||
MSIMessage pci_get_msi_message(PCIDevice *dev, int vector);
|
||||
+void pci_set_enabled(PCIDevice *pci_dev, bool state);
|
||||
void pci_set_power(PCIDevice *pci_dev, bool state);
|
||||
|
||||
#endif
|
||||
diff --git a/include/hw/pci/pci_device.h b/include/hw/pci/pci_device.h
|
||||
index 15694f2489..f38fb31119 100644
|
||||
--- a/include/hw/pci/pci_device.h
|
||||
+++ b/include/hw/pci/pci_device.h
|
||||
@@ -57,7 +57,7 @@ typedef struct PCIReqIDCache PCIReqIDCache;
|
||||
struct PCIDevice {
|
||||
DeviceState qdev;
|
||||
bool partially_hotplugged;
|
||||
- bool has_power;
|
||||
+ bool enabled;
|
||||
|
||||
/* PCI config space */
|
||||
uint8_t *config;
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 087151816f810052c013d496e32be1011e5c01ef Mon Sep 17 00:00:00 2001
|
||||
From 4c3fe6e7b88c58713c0c499d4bf0658a055ee52e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:37:03 +0100
|
||||
Subject: [PATCH 25/31] hw/ppc/spapr_tpm_proxy: skip automatic zero-init of
|
||||
Subject: [PATCH 50/57] hw/ppc/spapr_tpm_proxy: skip automatic zero-init of
|
||||
large arrays
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [24/30] a2360ae956c03481af7aceb34d26c7d8ba33a1d7
|
||||
RH-Commit: [24/30] 8d963380c64a33a27adc99738b42b52864229111 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'tpm_execute' method has a pair of 4k arrays used for copying
|
||||
data between guest and host. Skip the automatic zero-init of these
|
||||
|
||||
@ -0,0 +1,63 @@
|
||||
From 5126609c0714c66a0ec41328017e7e8388c78bf4 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Maydell <peter.maydell@linaro.org>
|
||||
Date: Fri, 13 Sep 2024 15:31:43 +0100
|
||||
Subject: [PATCH 02/26] hw/s390/ccw-device: Convert to three-phase reset
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
RH-MergeRequest: 351: Enable virtio-mem support on s390x
|
||||
RH-Jira: RHEL-72977
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Acked-by: Juraj Marcin <None>
|
||||
RH-Commit: [2/26] 58f6fc2e65a101e069feac399859464d31e43045 (thuth/qemu-kvm-cs)
|
||||
|
||||
Convert the TYPE_CCW_DEVICE to three-phase reset. This is a
|
||||
device class which is subclassed, so it needs to be three-phase
|
||||
before we can convert the subclass.
|
||||
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Reviewed-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
Message-id: 20240830145812.1967042-2-peter.maydell@linaro.org
|
||||
(cherry picked from commit 6a0e10b76b68e2f412746a1d5ed7d6efee804864)
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/s390x/ccw-device.c | 7 ++++---
|
||||
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hw/s390x/ccw-device.c b/hw/s390x/ccw-device.c
|
||||
index d7bb364579..30f2fb486f 100644
|
||||
--- a/hw/s390x/ccw-device.c
|
||||
+++ b/hw/s390x/ccw-device.c
|
||||
@@ -88,9 +88,9 @@ static Property ccw_device_properties[] = {
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
-static void ccw_device_reset(DeviceState *d)
|
||||
+static void ccw_device_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
- CcwDevice *ccw_dev = CCW_DEVICE(d);
|
||||
+ CcwDevice *ccw_dev = CCW_DEVICE(obj);
|
||||
|
||||
css_reset_sch(ccw_dev->sch);
|
||||
}
|
||||
@@ -99,11 +99,12 @@ static void ccw_device_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
CCWDeviceClass *k = CCW_DEVICE_CLASS(klass);
|
||||
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
k->realize = ccw_device_realize;
|
||||
k->refill_ids = ccw_device_refill_ids;
|
||||
device_class_set_props(dc, ccw_device_properties);
|
||||
- dc->reset = ccw_device_reset;
|
||||
+ rc->phases.hold = ccw_device_reset_hold;
|
||||
dc->bus_type = TYPE_VIRTUAL_CSS_BUS;
|
||||
}
|
||||
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -0,0 +1,92 @@
|
||||
From 7cbf9be09907407a64d739a2d0862af2ad08eaf5 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Maydell <peter.maydell@linaro.org>
|
||||
Date: Fri, 13 Sep 2024 15:31:43 +0100
|
||||
Subject: [PATCH 03/26] hw/s390/virtio-ccw: Convert to three-phase reset
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
RH-MergeRequest: 351: Enable virtio-mem support on s390x
|
||||
RH-Jira: RHEL-72977
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Acked-by: Juraj Marcin <None>
|
||||
RH-Commit: [3/26] e06ee194fa289a387433b905eb0999a048681a92 (thuth/qemu-kvm-cs)
|
||||
|
||||
Convert the virtio-ccw code to three-phase reset. This allows us to
|
||||
remove a call to device_class_set_parent_reset(), replacing it with
|
||||
the three-phase equivalent resettable_class_set_parent_phases().
|
||||
Removing all the device_class_set_parent_reset() uses will allow us
|
||||
to remove some of the glue code that interworks between three-phase
|
||||
and legacy reset.
|
||||
|
||||
This is a simple conversion, with no behavioural changes.
|
||||
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Reviewed-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
|
||||
Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||
Message-id: 20240830145812.1967042-3-peter.maydell@linaro.org
|
||||
(cherry picked from commit 6affa00d6ebebf24485667fe146470b0d6feb90d)
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/s390x/virtio-ccw.c | 13 ++++++++-----
|
||||
hw/s390x/virtio-ccw.h | 2 +-
|
||||
2 files changed, 9 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
|
||||
index b4676909dd..96747318d2 100644
|
||||
--- a/hw/s390x/virtio-ccw.c
|
||||
+++ b/hw/s390x/virtio-ccw.c
|
||||
@@ -913,14 +913,15 @@ static void virtio_ccw_notify(DeviceState *d, uint16_t vector)
|
||||
}
|
||||
}
|
||||
|
||||
-static void virtio_ccw_reset(DeviceState *d)
|
||||
+static void virtio_ccw_reset_hold(Object *obj, ResetType type)
|
||||
{
|
||||
- VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
|
||||
+ VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(obj);
|
||||
VirtIOCCWDeviceClass *vdc = VIRTIO_CCW_DEVICE_GET_CLASS(dev);
|
||||
|
||||
virtio_ccw_reset_virtio(dev);
|
||||
- if (vdc->parent_reset) {
|
||||
- vdc->parent_reset(d);
|
||||
+
|
||||
+ if (vdc->parent_phases.hold) {
|
||||
+ vdc->parent_phases.hold(obj, type);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1233,11 +1234,13 @@ static void virtio_ccw_device_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
CCWDeviceClass *k = CCW_DEVICE_CLASS(dc);
|
||||
VirtIOCCWDeviceClass *vdc = VIRTIO_CCW_DEVICE_CLASS(klass);
|
||||
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
k->unplug = virtio_ccw_busdev_unplug;
|
||||
dc->realize = virtio_ccw_busdev_realize;
|
||||
dc->unrealize = virtio_ccw_busdev_unrealize;
|
||||
- device_class_set_parent_reset(dc, virtio_ccw_reset, &vdc->parent_reset);
|
||||
+ resettable_class_set_parent_phases(rc, NULL, virtio_ccw_reset_hold, NULL,
|
||||
+ &vdc->parent_phases);
|
||||
}
|
||||
|
||||
static const TypeInfo virtio_ccw_device_info = {
|
||||
diff --git a/hw/s390x/virtio-ccw.h b/hw/s390x/virtio-ccw.h
|
||||
index fac186c8f6..c7a830a194 100644
|
||||
--- a/hw/s390x/virtio-ccw.h
|
||||
+++ b/hw/s390x/virtio-ccw.h
|
||||
@@ -57,7 +57,7 @@ struct VirtIOCCWDeviceClass {
|
||||
CCWDeviceClass parent_class;
|
||||
void (*realize)(VirtioCcwDevice *dev, Error **errp);
|
||||
void (*unrealize)(VirtioCcwDevice *dev);
|
||||
- void (*parent_reset)(DeviceState *dev);
|
||||
+ ResettablePhases parent_phases;
|
||||
};
|
||||
|
||||
/* Performance improves when virtqueue kick processing is decoupled from the
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -0,0 +1,47 @@
|
||||
From b25bbfcad4a3df94555f6b5f238910314a5d17ea Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Wed, 25 Jun 2025 10:27:51 +0200
|
||||
Subject: [PATCH 02/57] hw/s390x/ccw-device: Fix memory leak in loadparm setter
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
RH-MergeRequest: 387: s390x: Fix memory leaks related to loadparm [rhel-9]
|
||||
RH-Jira: RHEL-98554
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Commit: [2/2] d85cf8b3c93ede47b51c4aa1336dc54f58b8cc3f (thuth/qemu-kvm-cs)
|
||||
|
||||
Commit bdf12f2a fixed the setter for the "loadparm" machine property,
|
||||
which gets a string from a visitor, passes it to s390_ipl_fmt_loadparm()
|
||||
and then forgot to free it. It left another instance of the same problem
|
||||
unfixed in the "loadparm" device property. Fix it.
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-ID: <20250625082751.24896-1-kwolf@redhat.com>
|
||||
Reviewed-by: Eric Farman <farman@linux.ibm.com>
|
||||
Reviewed-by: Halil Pasic <pasic@linux.ibm.com>
|
||||
Tested-by: Thomas Huth <thuth@redhat.com>
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
(cherry picked from commit 78e3781541209b3dcd6f4bb66adf3a3e504b88a4)
|
||||
---
|
||||
hw/s390x/ccw-device.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/s390x/ccw-device.c b/hw/s390x/ccw-device.c
|
||||
index 30f2fb486f..63e937401e 100644
|
||||
--- a/hw/s390x/ccw-device.c
|
||||
+++ b/hw/s390x/ccw-device.c
|
||||
@@ -57,7 +57,7 @@ static void ccw_device_set_loadparm(Object *obj, Visitor *v,
|
||||
Error **errp)
|
||||
{
|
||||
CcwDevice *dev = CCW_DEVICE(obj);
|
||||
- char *val;
|
||||
+ g_autofree char *val = NULL;
|
||||
int index;
|
||||
|
||||
index = object_property_get_int(obj, "bootindex", NULL);
|
||||
--
|
||||
2.39.3
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 3179e7e183295b91e314c32db8697d8cf0947367 Mon Sep 17 00:00:00 2001
|
||||
From 45884bfad1f14585407a04eff9230a75bc5095fa Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:37:05 +0100
|
||||
Subject: [PATCH 27/31] hw/scsi/lsi53c895a: skip automatic zero-init of large
|
||||
Subject: [PATCH 52/57] hw/scsi/lsi53c895a: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [26/30] 92ec0b18f26956767d2f3d0284d712696d60852e
|
||||
RH-Commit: [26/30] 235884d43fcb3e49b320e36faa631a3656d07de6 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'lsi_memcpy' method has a 4k byte array used for copying data
|
||||
to/from the device. Skip the automatic zero-init of this array to
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 30a938409f664179061b039796354628c714229e Mon Sep 17 00:00:00 2001
|
||||
From 9f76103e90ce8406bc5bbda72a7314b82e56652e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:37:06 +0100
|
||||
Subject: [PATCH 28/31] hw/scsi/megasas: skip automatic zero-init of large
|
||||
Subject: [PATCH 53/57] hw/scsi/megasas: skip automatic zero-init of large
|
||||
arrays
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [27/30] 70c3c002601bc54ff81d000092e7be2bdb1eb82a
|
||||
RH-Commit: [27/30] b3a3f466fd03c64c665c52e26079b03def376f48 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'megasas_dcmd_pd_get_list' and 'megasas_dcmd_get_properties'
|
||||
methods have 4k structs used for copying data from the device.
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
From 36046b3119eb2338c811f43b2956c3aa787a2e3c Mon Sep 17 00:00:00 2001
|
||||
From 3a0ae5a2f873fc7062262efc24a5403233988f5f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:37:07 +0100
|
||||
Subject: [PATCH 29/31] hw/ufs/lu: skip automatic zero-init of large array
|
||||
Subject: [PATCH 54/57] hw/ufs/lu: skip automatic zero-init of large array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [28/30] 4d68ab4596b8fb97106d07e5af11dc3fdcb25e96
|
||||
RH-Commit: [28/30] 62e7c83d15143387f6d6b366c8ec46b312d05577 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'ufs_emulate_scsi_cmd' method has a 4k byte array used for
|
||||
copying data from the device. Skip the automatic zero-init of
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From 31886b02875b9d2d61710c14d6cdc0ab20d6dfc5 Mon Sep 17 00:00:00 2001
|
||||
From 6d4761010ea4dc218a1623513f410fc2d1cfc832 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:37:04 +0100
|
||||
Subject: [PATCH 26/31] hw/usb/hcd-ohci: skip automatic zero-init of large
|
||||
Subject: [PATCH 51/57] hw/usb/hcd-ohci: skip automatic zero-init of large
|
||||
array
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [25/30] a69a9e0467a1b695b7fa07cdf30733b709867bd2
|
||||
RH-Commit: [25/30] 721dd97d384fb755c4a6a00cfc3d867e43f25b0b (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
The 'ohci_service_iso_td' method has a 8k byte array used for copying
|
||||
data between guest and host. Skip the automatic zero-init of this
|
||||
|
||||
@ -0,0 +1,61 @@
|
||||
From 04f11749dd21b4df1ea2818785d650dd6eee2cbe Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Tue, 18 Feb 2025 19:25:34 +0100
|
||||
Subject: [PATCH 4/9] hw/vfio/common: Add a trace point in vfio_reset_handler
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 341: Fix vIOMMU reset order
|
||||
RH-Jira: RHEL-7188
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Commit: [4/5] 46878ffdc96997d1f6d09bde3fce350564e499fd (eauger1/centos-qemu-kvm)
|
||||
|
||||
To ease the debug of reset sequence, let's add a trace point
|
||||
in vfio_reset_handler()
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
Reviewed-by: Cédric Le Goater <clg@redhat.com>
|
||||
Acked-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||||
Message-Id: <20250218182737.76722-5-eric.auger@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit d410e709526d1cd4aa9085c6e254a622594a02a5)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/vfio/common.c | 1 +
|
||||
hw/vfio/trace-events | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
|
||||
index 36d0cf6585..6982f88fc8 100644
|
||||
--- a/hw/vfio/common.c
|
||||
+++ b/hw/vfio/common.c
|
||||
@@ -1395,6 +1395,7 @@ void vfio_reset_handler(void *opaque)
|
||||
{
|
||||
VFIODevice *vbasedev;
|
||||
|
||||
+ trace_vfio_reset_handler();
|
||||
QLIST_FOREACH(vbasedev, &vfio_device_list, global_next) {
|
||||
if (vbasedev->dev->realized) {
|
||||
vbasedev->ops->vfio_compute_needs_reset(vbasedev);
|
||||
diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events
|
||||
index 3756ff660e..9523a9ccb0 100644
|
||||
--- a/hw/vfio/trace-events
|
||||
+++ b/hw/vfio/trace-events
|
||||
@@ -120,6 +120,7 @@ vfio_get_dev_region(const char *name, int index, uint32_t type, uint32_t subtype
|
||||
vfio_legacy_dma_unmap_overflow_workaround(void) ""
|
||||
vfio_get_dirty_bitmap(uint64_t iova, uint64_t size, uint64_t bitmap_size, uint64_t start, uint64_t dirty_pages) "iova=0x%"PRIx64" size= 0x%"PRIx64" bitmap_size=0x%"PRIx64" start=0x%"PRIx64" dirty_pages=%"PRIu64
|
||||
vfio_iommu_map_dirty_notify(uint64_t iova_start, uint64_t iova_end) "iommu dirty @ 0x%"PRIx64" - 0x%"PRIx64
|
||||
+vfio_reset_handler(void) ""
|
||||
|
||||
# platform.c
|
||||
vfio_platform_realize(char *name, char *compat) "vfio device %s, compat = %s"
|
||||
--
|
||||
2.48.1
|
||||
|
||||
74
SOURCES/kvm-hw-vfio-pci-Re-order-pre-reset.patch
Normal file
74
SOURCES/kvm-hw-vfio-pci-Re-order-pre-reset.patch
Normal file
@ -0,0 +1,74 @@
|
||||
From d6a961077e753b9ad5a670a1529634fe20322ce2 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Williamson <alex.williamson@redhat.com>
|
||||
Date: Tue, 25 Feb 2025 14:52:29 -0700
|
||||
Subject: [PATCH 6/7] hw/vfio/pci: Re-order pre-reset
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 348: PCI: Implement basic PCI PM capability backing
|
||||
RH-Jira: RHEL-7301
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Acked-by: Alex Williamson <None>
|
||||
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-Commit: [6/6] c6c386ecbabda93f8a79da926ece95c2195fbc36 (eauger1/centos-qemu-kvm)
|
||||
|
||||
We want the device in the D0 power state going into reset, but the
|
||||
config write can enable the BARs in the address space, which are
|
||||
then removed from the address space once we clear the memory enable
|
||||
bit in the command register. Re-order to clear the command bit
|
||||
first, so the power state change doesn't enable the BARs.
|
||||
|
||||
Cc: Cédric Le Goater <clg@redhat.com>
|
||||
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Link: https://lore.kernel.org/qemu-devel/20250225215237.3314011-6-alex.williamson@redhat.com
|
||||
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||
(cherry picked from commit 518a69a598916749338de3852d41d961d4503115)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/vfio/pci.c | 18 +++++++++---------
|
||||
1 file changed, 9 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
|
||||
index 595b5c9b25..ffe72fd1d0 100644
|
||||
--- a/hw/vfio/pci.c
|
||||
+++ b/hw/vfio/pci.c
|
||||
@@ -2414,6 +2414,15 @@ void vfio_pci_pre_reset(VFIOPCIDevice *vdev)
|
||||
|
||||
vfio_disable_interrupts(vdev);
|
||||
|
||||
+ /*
|
||||
+ * Stop any ongoing DMA by disconnecting I/O, MMIO, and bus master.
|
||||
+ * Also put INTx Disable in known state.
|
||||
+ */
|
||||
+ cmd = vfio_pci_read_config(pdev, PCI_COMMAND, 2);
|
||||
+ cmd &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
|
||||
+ PCI_COMMAND_INTX_DISABLE);
|
||||
+ vfio_pci_write_config(pdev, PCI_COMMAND, cmd, 2);
|
||||
+
|
||||
/* Make sure the device is in D0 */
|
||||
if (pdev->pm_cap) {
|
||||
uint16_t pmcsr;
|
||||
@@ -2433,15 +2442,6 @@ void vfio_pci_pre_reset(VFIOPCIDevice *vdev)
|
||||
}
|
||||
}
|
||||
}
|
||||
-
|
||||
- /*
|
||||
- * Stop any ongoing DMA by disconnecting I/O, MMIO, and bus master.
|
||||
- * Also put INTx Disable in known state.
|
||||
- */
|
||||
- cmd = vfio_pci_read_config(pdev, PCI_COMMAND, 2);
|
||||
- cmd &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
|
||||
- PCI_COMMAND_INTX_DISABLE);
|
||||
- vfio_pci_write_config(pdev, PCI_COMMAND, cmd, 2);
|
||||
}
|
||||
|
||||
void vfio_pci_post_reset(VFIOPCIDevice *vdev)
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -0,0 +1,59 @@
|
||||
From afa3a488f3ca52a5455987e4cd643882c4b15d8a Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Thu, 13 Mar 2025 07:35:22 +0100
|
||||
Subject: [PATCH 24/26] hw/virtio: Also include md stubs in case
|
||||
CONFIG_VIRTIO_PCI is not set
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
RH-MergeRequest: 351: Enable virtio-mem support on s390x
|
||||
RH-Jira: RHEL-72977
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Acked-by: Juraj Marcin <None>
|
||||
RH-Commit: [24/26] ae6307b26d01d2a317f7e5d1d3b3a16b6d5f56de (thuth/qemu-kvm-cs)
|
||||
|
||||
For the s390x target, it's possible to build the QEMU binary without
|
||||
CONFIG_VIRTIO_PCI and only have the virtio-mem device via the ccw
|
||||
transport. In that case, QEMU currently fails to link correctly:
|
||||
|
||||
/usr/bin/ld: libqemu-s390x-softmmu.a.p/hw_s390x_s390-virtio-ccw.c.o: in function `s390_machine_device_pre_plug':
|
||||
../hw/s390x/s390-virtio-ccw.c:579:(.text+0x1e96): undefined reference to `virtio_md_pci_pre_plug'
|
||||
/usr/bin/ld: libqemu-s390x-softmmu.a.p/hw_s390x_s390-virtio-ccw.c.o: in function `s390_machine_device_plug':
|
||||
../hw/s390x/s390-virtio-ccw.c:608:(.text+0x21a4): undefined reference to `virtio_md_pci_plug'
|
||||
/usr/bin/ld: libqemu-s390x-softmmu.a.p/hw_s390x_s390-virtio-ccw.c.o: in function `s390_machine_device_unplug_request':
|
||||
../hw/s390x/s390-virtio-ccw.c:622:(.text+0x2334): undefined reference to `virtio_md_pci_unplug_request'
|
||||
/usr/bin/ld: libqemu-s390x-softmmu.a.p/hw_s390x_s390-virtio-ccw.c.o: in function `s390_machine_device_unplug':
|
||||
../hw/s390x/s390-virtio-ccw.c:633:(.text+0x2436): undefined reference to `virtio_md_pci_unplug'
|
||||
clang: error: linker command failed with exit code 1 (use -v to see invocation)
|
||||
|
||||
We also need to include the stubs when CONFIG_VIRTIO_PCI is missing.
|
||||
|
||||
Fixes: aa910c20ec5 ("s390x: virtio-mem support")
|
||||
Message-ID: <20250313063522.1348288-1-thuth@redhat.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
(cherry picked from commit c1a6bff276ca52ffde472532d92bb5bb122dab3f)
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
---
|
||||
hw/virtio/meson.build | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/virtio/meson.build b/hw/virtio/meson.build
|
||||
index c38bdd6fa4..e2f9c75625 100644
|
||||
--- a/hw/virtio/meson.build
|
||||
+++ b/hw/virtio/meson.build
|
||||
@@ -89,7 +89,8 @@ specific_virtio_ss.add_all(when: 'CONFIG_VIRTIO_PCI', if_true: virtio_pci_ss)
|
||||
system_ss.add_all(when: 'CONFIG_VIRTIO', if_true: system_virtio_ss)
|
||||
system_ss.add(when: 'CONFIG_VIRTIO', if_false: files('vhost-stub.c'))
|
||||
system_ss.add(when: 'CONFIG_VIRTIO', if_false: files('virtio-stub.c'))
|
||||
-system_ss.add(when: 'CONFIG_VIRTIO_MD', if_false: files('virtio-md-stubs.c'))
|
||||
+system_ss.add(when: ['CONFIG_VIRTIO_MD', 'CONFIG_VIRTIO_PCI'],
|
||||
+ if_false: files('virtio-md-stubs.c'))
|
||||
|
||||
system_ss.add(files('virtio-hmp-cmds.c'))
|
||||
|
||||
--
|
||||
2.48.1
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
From ea242d728ed1716602b4cdd01d3fabb5ab260781 Mon Sep 17 00:00:00 2001
|
||||
From 4727c044a09fb8c4fb6d667f26eb55bb6de7554d Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Tue, 10 Jun 2025 13:36:40 +0100
|
||||
Subject: [PATCH 03/31] hw/virtio/virtio: avoid cost of -ftrivial-auto-var-init
|
||||
Subject: [PATCH 28/57] hw/virtio/virtio: avoid cost of -ftrivial-auto-var-init
|
||||
in hot path
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-MergeRequest: 461: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99887
|
||||
RH-MergeRequest: 382: Solve -ftrivial-auto-var-init performance regression with QEMU_UNINITIALIZED
|
||||
RH-Jira: RHEL-99888
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [2/30] a90fb4e14c182ace7a28c8335858895b4257f37b
|
||||
RH-Commit: [2/30] 1c2cc6292deaaac068f4514439703c22c9ccb300 (stefanha/centos-stream-qemu-kvm)
|
||||
|
||||
Since commit 7ff9ff039380 ("meson: mitigate against use of uninitialize
|
||||
stack for exploits") the -ftrivial-auto-var-init=zero compiler option is
|
||||
|
||||
@ -0,0 +1,96 @@
|
||||
From 9ca5d7ac4f0ff5f10bf424df8104fe5abe01e431 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Tue, 18 Feb 2025 19:25:31 +0100
|
||||
Subject: [PATCH 1/9] hw/virtio/virtio-iommu: Migrate to 3-phase reset
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 341: Fix vIOMMU reset order
|
||||
RH-Jira: RHEL-7188
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||||
RH-Commit: [1/5] 32bf47497d5d4817a448d07ffa7a844aee82ae3c (eauger1/centos-qemu-kvm)
|
||||
|
||||
Currently the iommu may be reset before the devices
|
||||
it protects. For example this happens with virtio-net.
|
||||
|
||||
Let's use 3-phase reset mechanism and reset the IOMMU on
|
||||
exit phase after all DMA capable devices have been
|
||||
reset during the 'enter' or 'hold' phase.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
Acked-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||||
Acked-by: Jason Wang <jasowang@redhat.com>
|
||||
|
||||
Message-Id: <20250218182737.76722-2-eric.auger@redhat.com>
|
||||
Reviewed-by: Peter Xu <peterx@redhat.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
(cherry picked from commit d261b84d354a41a38336af813f92f636d3fb3f78)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/virtio/trace-events | 2 +-
|
||||
hw/virtio/virtio-iommu.c | 14 ++++++++++----
|
||||
2 files changed, 11 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events
|
||||
index 04e36ae047..76f0d458b2 100644
|
||||
--- a/hw/virtio/trace-events
|
||||
+++ b/hw/virtio/trace-events
|
||||
@@ -108,7 +108,7 @@ virtio_pci_notify_write(uint64_t addr, uint64_t val, unsigned int size) "0x%" PR
|
||||
virtio_pci_notify_write_pio(uint64_t addr, uint64_t val, unsigned int size) "0x%" PRIx64" = 0x%" PRIx64 " (%d)"
|
||||
|
||||
# hw/virtio/virtio-iommu.c
|
||||
-virtio_iommu_device_reset(void) "reset!"
|
||||
+virtio_iommu_device_reset_exit(void) "reset!"
|
||||
virtio_iommu_system_reset(void) "system reset!"
|
||||
virtio_iommu_get_features(uint64_t features) "device supports features=0x%"PRIx64
|
||||
virtio_iommu_device_status(uint8_t status) "driver status = %d"
|
||||
diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
|
||||
index 59ef4fb217..496200ebc5 100644
|
||||
--- a/hw/virtio/virtio-iommu.c
|
||||
+++ b/hw/virtio/virtio-iommu.c
|
||||
@@ -1504,11 +1504,11 @@ static void virtio_iommu_device_unrealize(DeviceState *dev)
|
||||
virtio_cleanup(vdev);
|
||||
}
|
||||
|
||||
-static void virtio_iommu_device_reset(VirtIODevice *vdev)
|
||||
+static void virtio_iommu_device_reset_exit(Object *obj, ResetType type)
|
||||
{
|
||||
- VirtIOIOMMU *s = VIRTIO_IOMMU(vdev);
|
||||
+ VirtIOIOMMU *s = VIRTIO_IOMMU(obj);
|
||||
|
||||
- trace_virtio_iommu_device_reset();
|
||||
+ trace_virtio_iommu_device_reset_exit();
|
||||
|
||||
if (s->domains) {
|
||||
g_tree_destroy(s->domains);
|
||||
@@ -1669,6 +1669,7 @@ static void virtio_iommu_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
|
||||
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
device_class_set_props(dc, virtio_iommu_properties);
|
||||
dc->vmsd = &vmstate_virtio_iommu;
|
||||
@@ -1676,7 +1677,12 @@ static void virtio_iommu_class_init(ObjectClass *klass, void *data)
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
vdc->realize = virtio_iommu_device_realize;
|
||||
vdc->unrealize = virtio_iommu_device_unrealize;
|
||||
- vdc->reset = virtio_iommu_device_reset;
|
||||
+
|
||||
+ /*
|
||||
+ * Use 'exit' reset phase to make sure all DMA requests
|
||||
+ * have been quiesced during 'enter' or 'hold' phase
|
||||
+ */
|
||||
+ rc->phases.exit = virtio_iommu_device_reset_exit;
|
||||
vdc->get_config = virtio_iommu_get_config;
|
||||
vdc->set_config = virtio_iommu_set_config;
|
||||
vdc->get_features = virtio_iommu_get_features;
|
||||
--
|
||||
2.48.1
|
||||
|
||||
214
SOURCES/kvm-i386-Introduce-tdx-guest-object.patch
Normal file
214
SOURCES/kvm-i386-Introduce-tdx-guest-object.patch
Normal file
@ -0,0 +1,214 @@
|
||||
From dc14d1444d4ad525663848160cd7687ef291c85e Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:45 +0200
|
||||
Subject: [PATCH 031/115] i386: Introduce tdx-guest object
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [31/115] f279a3b477fbbe84bb5d6c3a8eb588916b41128e (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Introduce tdx-guest object which inherits X86_CONFIDENTIAL_GUEST,
|
||||
and will be used to create TDX VMs (TDs) by
|
||||
|
||||
qemu -machine ...,confidential-guest-support=tdx0 \
|
||||
-object tdx-guest,id=tdx0
|
||||
|
||||
It has one QAPI member 'attributes' defined, which allows user to set
|
||||
TD's attributes directly.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Acked-by: Markus Armbruster <armbru@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-3-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 756e12e791771034ac105a5d2c9887bbbb6b7c73)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
Conflict: class_init's second argument is not const
|
||||
---
|
||||
configs/devices/i386-softmmu/default.mak | 1 +
|
||||
hw/i386/Kconfig | 5 +++
|
||||
qapi/qom.json | 15 +++++++++
|
||||
target/i386/kvm/meson.build | 2 ++
|
||||
target/i386/kvm/tdx.c | 43 ++++++++++++++++++++++++
|
||||
target/i386/kvm/tdx.h | 21 ++++++++++++
|
||||
6 files changed, 87 insertions(+)
|
||||
create mode 100644 target/i386/kvm/tdx.c
|
||||
create mode 100644 target/i386/kvm/tdx.h
|
||||
|
||||
diff --git a/configs/devices/i386-softmmu/default.mak b/configs/devices/i386-softmmu/default.mak
|
||||
index 448e3e3b1b..34c21224eb 100644
|
||||
--- a/configs/devices/i386-softmmu/default.mak
|
||||
+++ b/configs/devices/i386-softmmu/default.mak
|
||||
@@ -18,6 +18,7 @@
|
||||
#CONFIG_QXL=n
|
||||
#CONFIG_SEV=n
|
||||
#CONFIG_SGA=n
|
||||
+#CONFIG_TDX=n
|
||||
#CONFIG_TEST_DEVICES=n
|
||||
#CONFIG_TPM_CRB=n
|
||||
#CONFIG_TPM_TIS_ISA=n
|
||||
diff --git a/hw/i386/Kconfig b/hw/i386/Kconfig
|
||||
index f4a33b6c08..edd61cd2aa 100644
|
||||
--- a/hw/i386/Kconfig
|
||||
+++ b/hw/i386/Kconfig
|
||||
@@ -10,6 +10,10 @@ config SGX
|
||||
bool
|
||||
depends on KVM
|
||||
|
||||
+config TDX
|
||||
+ bool
|
||||
+ depends on KVM
|
||||
+
|
||||
config PC
|
||||
bool
|
||||
imply APPLESMC
|
||||
@@ -26,6 +30,7 @@ config PC
|
||||
imply QXL
|
||||
imply SEV
|
||||
imply SGX
|
||||
+ imply TDX
|
||||
imply TEST_DEVICES
|
||||
imply TPM_CRB
|
||||
imply TPM_TIS_ISA
|
||||
diff --git a/qapi/qom.json b/qapi/qom.json
|
||||
index 321ccd708a..530efeb7c5 100644
|
||||
--- a/qapi/qom.json
|
||||
+++ b/qapi/qom.json
|
||||
@@ -1008,6 +1008,19 @@
|
||||
'*host-data': 'str',
|
||||
'*vcek-disabled': 'bool' } }
|
||||
|
||||
+##
|
||||
+# @TdxGuestProperties:
|
||||
+#
|
||||
+# Properties for tdx-guest objects.
|
||||
+#
|
||||
+# @attributes: The 'attributes' of a TD guest that is passed to
|
||||
+# KVM_TDX_INIT_VM
|
||||
+#
|
||||
+# Since: 10.1
|
||||
+##
|
||||
+{ 'struct': 'TdxGuestProperties',
|
||||
+ 'data': { '*attributes': 'uint64' } }
|
||||
+
|
||||
##
|
||||
# @ThreadContextProperties:
|
||||
#
|
||||
@@ -1092,6 +1105,7 @@
|
||||
'sev-snp-guest',
|
||||
'thread-context',
|
||||
's390-pv-guest',
|
||||
+ 'tdx-guest',
|
||||
'throttle-group',
|
||||
'tls-creds-anon',
|
||||
'tls-creds-psk',
|
||||
@@ -1163,6 +1177,7 @@
|
||||
'if': 'CONFIG_SECRET_KEYRING' },
|
||||
'sev-guest': 'SevGuestProperties',
|
||||
'sev-snp-guest': 'SevSnpGuestProperties',
|
||||
+ 'tdx-guest': 'TdxGuestProperties',
|
||||
'thread-context': 'ThreadContextProperties',
|
||||
'throttle-group': 'ThrottleGroupProperties',
|
||||
'tls-creds-anon': 'TlsCredsAnonProperties',
|
||||
diff --git a/target/i386/kvm/meson.build b/target/i386/kvm/meson.build
|
||||
index 3996cafaf2..466bccb9cb 100644
|
||||
--- a/target/i386/kvm/meson.build
|
||||
+++ b/target/i386/kvm/meson.build
|
||||
@@ -8,6 +8,8 @@ i386_kvm_ss.add(files(
|
||||
|
||||
i386_kvm_ss.add(when: 'CONFIG_XEN_EMU', if_true: files('xen-emu.c'))
|
||||
|
||||
+i386_kvm_ss.add(when: 'CONFIG_TDX', if_true: files('tdx.c'))
|
||||
+
|
||||
i386_system_ss.add(when: 'CONFIG_HYPERV', if_true: files('hyperv.c'), if_false: files('hyperv-stub.c'))
|
||||
|
||||
i386_system_ss.add_all(when: 'CONFIG_KVM', if_true: i386_kvm_ss)
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
new file mode 100644
|
||||
index 0000000000..ec84ae2947
|
||||
--- /dev/null
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -0,0 +1,43 @@
|
||||
+/*
|
||||
+ * QEMU TDX support
|
||||
+ *
|
||||
+ * Copyright (c) 2025 Intel Corporation
|
||||
+ *
|
||||
+ * Author:
|
||||
+ * Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
+ *
|
||||
+ * SPDX-License-Identifier: GPL-2.0-or-later
|
||||
+ */
|
||||
+
|
||||
+#include "qemu/osdep.h"
|
||||
+#include "qom/object_interfaces.h"
|
||||
+
|
||||
+#include "tdx.h"
|
||||
+
|
||||
+/* tdx guest */
|
||||
+OBJECT_DEFINE_TYPE_WITH_INTERFACES(TdxGuest,
|
||||
+ tdx_guest,
|
||||
+ TDX_GUEST,
|
||||
+ X86_CONFIDENTIAL_GUEST,
|
||||
+ { TYPE_USER_CREATABLE },
|
||||
+ { NULL })
|
||||
+
|
||||
+static void tdx_guest_init(Object *obj)
|
||||
+{
|
||||
+ ConfidentialGuestSupport *cgs = CONFIDENTIAL_GUEST_SUPPORT(obj);
|
||||
+ TdxGuest *tdx = TDX_GUEST(obj);
|
||||
+
|
||||
+ cgs->require_guest_memfd = true;
|
||||
+ tdx->attributes = 0;
|
||||
+
|
||||
+ object_property_add_uint64_ptr(obj, "attributes", &tdx->attributes,
|
||||
+ OBJ_PROP_FLAG_READWRITE);
|
||||
+}
|
||||
+
|
||||
+static void tdx_guest_finalize(Object *obj)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static void tdx_guest_class_init(ObjectClass *oc, void *data)
|
||||
+{
|
||||
+}
|
||||
diff --git a/target/i386/kvm/tdx.h b/target/i386/kvm/tdx.h
|
||||
new file mode 100644
|
||||
index 0000000000..f3b7253361
|
||||
--- /dev/null
|
||||
+++ b/target/i386/kvm/tdx.h
|
||||
@@ -0,0 +1,21 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
+
|
||||
+#ifndef QEMU_I386_TDX_H
|
||||
+#define QEMU_I386_TDX_H
|
||||
+
|
||||
+#include "confidential-guest.h"
|
||||
+
|
||||
+#define TYPE_TDX_GUEST "tdx-guest"
|
||||
+#define TDX_GUEST(obj) OBJECT_CHECK(TdxGuest, (obj), TYPE_TDX_GUEST)
|
||||
+
|
||||
+typedef struct TdxGuestClass {
|
||||
+ X86ConfidentialGuestClass parent_class;
|
||||
+} TdxGuestClass;
|
||||
+
|
||||
+typedef struct TdxGuest {
|
||||
+ X86ConfidentialGuest parent_obj;
|
||||
+
|
||||
+ uint64_t attributes; /* TD attributes */
|
||||
+} TdxGuest;
|
||||
+
|
||||
+#endif /* QEMU_I386_TDX_H */
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,62 @@
|
||||
From 9d654537f0f667a36eb45d80fda283b31ace3d39 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:44 +0200
|
||||
Subject: [PATCH 017/115] i386: Remove unused parameter "uint32_t bit" in
|
||||
feature_word_description()
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [17/115] 37ee215225ee0757e51718df4548d4a43fe09e99 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Parameter "uint32_t bit" is not used in function feature_word_description(),
|
||||
so remove it.
|
||||
|
||||
Signed-off-by: Lei Wang <lei4.wang@intel.com>
|
||||
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Message-ID: <20241217123932.948789-2-xiaoyao.li@intel.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit bab32b8b4bf9da5d13386c8faa5a9389e63244b7)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index a97d042a2e..32e89f1a5c 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -5897,7 +5897,7 @@ static const TypeInfo max_x86_cpu_type_info = {
|
||||
.class_init = max_x86_cpu_class_init,
|
||||
};
|
||||
|
||||
-static char *feature_word_description(FeatureWordInfo *f, uint32_t bit)
|
||||
+static char *feature_word_description(FeatureWordInfo *f)
|
||||
{
|
||||
assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD);
|
||||
|
||||
@@ -5936,6 +5936,7 @@ static void mark_unavailable_features(X86CPU *cpu, FeatureWord w, uint64_t mask,
|
||||
CPUX86State *env = &cpu->env;
|
||||
FeatureWordInfo *f = &feature_word_info[w];
|
||||
int i;
|
||||
+ g_autofree char *feat_word_str = feature_word_description(f);
|
||||
|
||||
if (!cpu->force_features) {
|
||||
env->features[w] &= ~mask;
|
||||
@@ -5948,7 +5949,6 @@ static void mark_unavailable_features(X86CPU *cpu, FeatureWord w, uint64_t mask,
|
||||
|
||||
for (i = 0; i < 64; ++i) {
|
||||
if ((1ULL << i) & mask) {
|
||||
- g_autofree char *feat_word_str = feature_word_description(f, i);
|
||||
warn_report("%s: %s%s%s [bit %d]",
|
||||
verbose_prefix,
|
||||
feat_word_str,
|
||||
--
|
||||
2.50.1
|
||||
|
||||
63
SOURCES/kvm-i386-apic-Skip-kvm_apic_put-for-TDX.patch
Normal file
63
SOURCES/kvm-i386-apic-Skip-kvm_apic_put-for-TDX.patch
Normal file
@ -0,0 +1,63 @@
|
||||
From f5b6984efa1bf825410011b957b4f46fcfe963db Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
||||
Subject: [PATCH 070/115] i386/apic: Skip kvm_apic_put() for TDX
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [70/115] d4e1631ebceb6441a608ff92c1964b64cf116094 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
KVM neithers allow writing to MSR_IA32_APICBASE for TDs, nor allow for
|
||||
KVM_SET_LAPIC[*].
|
||||
|
||||
Note, KVM_GET_LAPIC is also disallowed for TDX. It is called in the path
|
||||
|
||||
do_kvm_cpu_synchronize_state()
|
||||
-> kvm_arch_get_registers()
|
||||
-> kvm_get_apic()
|
||||
|
||||
and it's already disllowed for confidential guest through
|
||||
guest_state_protected.
|
||||
|
||||
[*] https://lore.kernel.org/all/Z3w4Ku4Jq0CrtXne@google.com/
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-42-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 62a1a8b89d90cd3fbee0e6d38e6a4c0d833e978a)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
hw/i386/kvm/apic.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/hw/i386/kvm/apic.c b/hw/i386/kvm/apic.c
|
||||
index a72c28e8a7..9c12a9c856 100644
|
||||
--- a/hw/i386/kvm/apic.c
|
||||
+++ b/hw/i386/kvm/apic.c
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "sysemu/hw_accel.h"
|
||||
#include "sysemu/kvm.h"
|
||||
#include "kvm/kvm_i386.h"
|
||||
+#include "kvm/tdx.h"
|
||||
|
||||
static inline void kvm_apic_set_reg(struct kvm_lapic_state *kapic,
|
||||
int reg_id, uint32_t val)
|
||||
@@ -141,6 +142,10 @@ static void kvm_apic_put(CPUState *cs, run_on_cpu_data data)
|
||||
struct kvm_lapic_state kapic;
|
||||
int ret;
|
||||
|
||||
+ if (is_tdx_vm()) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
kvm_put_apicbase(s->cpu, s->apicbase);
|
||||
kvm_put_apic_state(s, &kapic);
|
||||
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,80 @@
|
||||
From 0d8993cabc26807ef973630f38ec2b09557497fe Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
||||
Subject: [PATCH 079/115] i386/cgs: Introduce
|
||||
x86_confidential_guest_check_features()
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [79/115] 1fce5742b7746e6ba589c486fb1a6aec8ab8391a (bonzini/rhel-qemu-kvm)
|
||||
|
||||
To do cgs specific feature checking. Note the feature checking in
|
||||
x86_cpu_filter_features() is valid for non-cgs VMs. For cgs VMs like
|
||||
TDX, what features can be supported has more restrictions.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-51-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit dc0b08b303ad34983b43936a4c978672e0f9a9d8)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/confidential-guest.h | 13 +++++++++++++
|
||||
target/i386/kvm/kvm.c | 8 ++++++++
|
||||
2 files changed, 21 insertions(+)
|
||||
|
||||
diff --git a/target/i386/confidential-guest.h b/target/i386/confidential-guest.h
|
||||
index 8a5cc7ecff..4e7eb43416 100644
|
||||
--- a/target/i386/confidential-guest.h
|
||||
+++ b/target/i386/confidential-guest.h
|
||||
@@ -42,6 +42,7 @@ struct X86ConfidentialGuestClass {
|
||||
void (*cpu_instance_init)(X86ConfidentialGuest *cg, CPUState *cpu);
|
||||
uint32_t (*adjust_cpuid_features)(X86ConfidentialGuest *cg, uint32_t feature,
|
||||
uint32_t index, int reg, uint32_t value);
|
||||
+ int (*check_features)(X86ConfidentialGuest *cg, CPUState *cs);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -91,4 +92,16 @@ static inline int x86_confidential_guest_adjust_cpuid_features(X86ConfidentialGu
|
||||
}
|
||||
}
|
||||
|
||||
+static inline int x86_confidential_guest_check_features(X86ConfidentialGuest *cg,
|
||||
+ CPUState *cs)
|
||||
+{
|
||||
+ X86ConfidentialGuestClass *klass = X86_CONFIDENTIAL_GUEST_GET_CLASS(cg);
|
||||
+
|
||||
+ if (klass->check_features) {
|
||||
+ return klass->check_features(cg, cs);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
#endif
|
||||
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
||||
index 76352323e4..b6fddcd543 100644
|
||||
--- a/target/i386/kvm/kvm.c
|
||||
+++ b/target/i386/kvm/kvm.c
|
||||
@@ -2081,6 +2081,14 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||||
int r;
|
||||
Error *local_err = NULL;
|
||||
|
||||
+ if (current_machine->cgs) {
|
||||
+ r = x86_confidential_guest_check_features(
|
||||
+ X86_CONFIDENTIAL_GUEST(current_machine->cgs), cs);
|
||||
+ if (r < 0) {
|
||||
+ return r;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
memset(&cpuid_data, 0, sizeof(cpuid_data));
|
||||
|
||||
cpuid_i = 0;
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,116 @@
|
||||
From fa35367ae78505390b5915c9bf96542ffed1787d Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
||||
Subject: [PATCH 072/115] i386/cgs: Rename *mask_cpuid_features() to
|
||||
*adjust_cpuid_features()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [72/115] 0633336351c17f73620bc7d13cee5ba53b100e13 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Because for TDX case, there are also fixed-1 bits that enforced by TDX
|
||||
module.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-44-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 695bfaee7153153708228946aa26c6d879599c04)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/confidential-guest.h | 20 ++++++++++----------
|
||||
target/i386/kvm/kvm.c | 2 +-
|
||||
target/i386/sev.c | 4 ++--
|
||||
3 files changed, 13 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/target/i386/confidential-guest.h b/target/i386/confidential-guest.h
|
||||
index 38169ed68e..8a5cc7ecff 100644
|
||||
--- a/target/i386/confidential-guest.h
|
||||
+++ b/target/i386/confidential-guest.h
|
||||
@@ -40,8 +40,8 @@ struct X86ConfidentialGuestClass {
|
||||
/* <public> */
|
||||
int (*kvm_type)(X86ConfidentialGuest *cg);
|
||||
void (*cpu_instance_init)(X86ConfidentialGuest *cg, CPUState *cpu);
|
||||
- uint32_t (*mask_cpuid_features)(X86ConfidentialGuest *cg, uint32_t feature, uint32_t index,
|
||||
- int reg, uint32_t value);
|
||||
+ uint32_t (*adjust_cpuid_features)(X86ConfidentialGuest *cg, uint32_t feature,
|
||||
+ uint32_t index, int reg, uint32_t value);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -71,21 +71,21 @@ static inline void x86_confidential_guest_cpu_instance_init(X86ConfidentialGuest
|
||||
}
|
||||
|
||||
/**
|
||||
- * x86_confidential_guest_mask_cpuid_features:
|
||||
+ * x86_confidential_guest_adjust_cpuid_features:
|
||||
*
|
||||
- * Removes unsupported features from a confidential guest's CPUID values, returns
|
||||
- * the value with the bits removed. The bits removed should be those that KVM
|
||||
- * provides independent of host-supported CPUID features, but are not supported by
|
||||
- * the confidential computing firmware.
|
||||
+ * Adjust the supported features from a confidential guest's CPUID values,
|
||||
+ * returns the adjusted value. There are bits being removed that are not
|
||||
+ * supported by the confidential computing firmware or bits being added that
|
||||
+ * are forcibly exposed to guest by the confidential computing firmware.
|
||||
*/
|
||||
-static inline int x86_confidential_guest_mask_cpuid_features(X86ConfidentialGuest *cg,
|
||||
+static inline int x86_confidential_guest_adjust_cpuid_features(X86ConfidentialGuest *cg,
|
||||
uint32_t feature, uint32_t index,
|
||||
int reg, uint32_t value)
|
||||
{
|
||||
X86ConfidentialGuestClass *klass = X86_CONFIDENTIAL_GUEST_GET_CLASS(cg);
|
||||
|
||||
- if (klass->mask_cpuid_features) {
|
||||
- return klass->mask_cpuid_features(cg, feature, index, reg, value);
|
||||
+ if (klass->adjust_cpuid_features) {
|
||||
+ return klass->adjust_cpuid_features(cg, feature, index, reg, value);
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
||||
index f3fe553151..5349ff4db7 100644
|
||||
--- a/target/i386/kvm/kvm.c
|
||||
+++ b/target/i386/kvm/kvm.c
|
||||
@@ -565,7 +565,7 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
|
||||
}
|
||||
|
||||
if (current_machine->cgs) {
|
||||
- ret = x86_confidential_guest_mask_cpuid_features(
|
||||
+ ret = x86_confidential_guest_adjust_cpuid_features(
|
||||
X86_CONFIDENTIAL_GUEST(current_machine->cgs),
|
||||
function, index, reg, ret);
|
||||
}
|
||||
diff --git a/target/i386/sev.c b/target/i386/sev.c
|
||||
index a0d271f898..24fcd078fc 100644
|
||||
--- a/target/i386/sev.c
|
||||
+++ b/target/i386/sev.c
|
||||
@@ -946,7 +946,7 @@ out:
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
-sev_snp_mask_cpuid_features(X86ConfidentialGuest *cg, uint32_t feature, uint32_t index,
|
||||
+sev_snp_adjust_cpuid_features(X86ConfidentialGuest *cg, uint32_t feature, uint32_t index,
|
||||
int reg, uint32_t value)
|
||||
{
|
||||
switch (feature) {
|
||||
@@ -2404,7 +2404,7 @@ sev_snp_guest_class_init(ObjectClass *oc, void *data)
|
||||
klass->launch_finish = sev_snp_launch_finish;
|
||||
klass->launch_update_data = sev_snp_launch_update_data;
|
||||
klass->kvm_init = sev_snp_kvm_init;
|
||||
- x86_klass->mask_cpuid_features = sev_snp_mask_cpuid_features;
|
||||
+ x86_klass->adjust_cpuid_features = sev_snp_adjust_cpuid_features;
|
||||
x86_klass->kvm_type = sev_snp_kvm_type;
|
||||
|
||||
object_class_property_add(oc, "policy", "uint64",
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,49 @@
|
||||
From 70ffde0038f36b6720b73136a4368b26f2bf6181 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:50 +0200
|
||||
Subject: [PATCH 107/115] i386/cpu: Cleanup host_cpu_max_instance_init()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [107/115] 140ba66d2ff544b6ae498798e1f6ad3ade1791bc (bonzini/rhel-qemu-kvm)
|
||||
|
||||
The implementation of host_cpu_max_instance_init() was merged into
|
||||
host_cpu_instance_init() by commit 29f1ba338baf ("target/i386: merge
|
||||
host_cpu_instance_init() and host_cpu_max_instance_init()"), while the
|
||||
declaration of it remains in host-cpu.h.
|
||||
|
||||
Clean it up.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250716063117.602050-1-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 5fe6b9a854a91df86fdb794cbeb67d0656756137)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/host-cpu.h | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/target/i386/host-cpu.h b/target/i386/host-cpu.h
|
||||
index b97ec01c9b..5b2ad491a8 100644
|
||||
--- a/target/i386/host-cpu.h
|
||||
+++ b/target/i386/host-cpu.h
|
||||
@@ -12,7 +12,6 @@
|
||||
|
||||
uint32_t host_cpu_phys_bits(void);
|
||||
void host_cpu_instance_init(X86CPU *cpu);
|
||||
-void host_cpu_max_instance_init(X86CPU *cpu);
|
||||
bool host_cpu_realizefn(CPUState *cs, Error **errp);
|
||||
|
||||
void host_cpu_vendor_fms(char *vendor, int *family, int *model, int *stepping);
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,78 @@
|
||||
From 0a568fbac880efdda740808e6fbbd8be09cfb46a Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:45 +0200
|
||||
Subject: [PATCH 024/115] i386/cpu: Consolidate the helper to get Host's vendor
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [24/115] cd823d475dc0a0ec4135f0c9d5546db996579d30 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Extend host_cpu_vendor_fms() to help more cases to get Host's vendor
|
||||
information.
|
||||
|
||||
Cc: Dongli Zhang <dongli.zhang@oracle.com>
|
||||
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250410075619.145792-1-zhao1.liu@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit ae39acef49e29169f90cd3a799d6cd0b50bc65d2)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/host-cpu.c | 10 ++++++----
|
||||
target/i386/kvm/vmsr_energy.c | 3 +--
|
||||
2 files changed, 7 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/target/i386/host-cpu.c b/target/i386/host-cpu.c
|
||||
index 03b9d1b169..4a77ecc1fc 100644
|
||||
--- a/target/i386/host-cpu.c
|
||||
+++ b/target/i386/host-cpu.c
|
||||
@@ -109,9 +109,13 @@ void host_cpu_vendor_fms(char *vendor, int *family, int *model, int *stepping)
|
||||
{
|
||||
uint32_t eax, ebx, ecx, edx;
|
||||
|
||||
- host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
|
||||
+ host_cpuid(0x0, 0, NULL, &ebx, &ecx, &edx);
|
||||
x86_cpu_vendor_words2str(vendor, ebx, edx, ecx);
|
||||
|
||||
+ if (!family && !model && !stepping) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
host_cpuid(0x1, 0, &eax, &ebx, &ecx, &edx);
|
||||
if (family) {
|
||||
*family = ((eax >> 8) & 0x0F) + ((eax >> 20) & 0xFF);
|
||||
@@ -129,11 +133,9 @@ void host_cpu_instance_init(X86CPU *cpu)
|
||||
X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
|
||||
|
||||
if (xcc->model) {
|
||||
- uint32_t ebx = 0, ecx = 0, edx = 0;
|
||||
char vendor[CPUID_VENDOR_SZ + 1];
|
||||
|
||||
- host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
|
||||
- x86_cpu_vendor_words2str(vendor, ebx, edx, ecx);
|
||||
+ host_cpu_vendor_fms(vendor, NULL, NULL, NULL);
|
||||
object_property_set_str(OBJECT(cpu), "vendor", vendor, &error_abort);
|
||||
}
|
||||
}
|
||||
diff --git a/target/i386/kvm/vmsr_energy.c b/target/i386/kvm/vmsr_energy.c
|
||||
index 7e064c5aef..615f23b6cf 100644
|
||||
--- a/target/i386/kvm/vmsr_energy.c
|
||||
+++ b/target/i386/kvm/vmsr_energy.c
|
||||
@@ -29,10 +29,9 @@ char *vmsr_compute_default_paths(void)
|
||||
|
||||
bool is_host_cpu_intel(void)
|
||||
{
|
||||
- int family, model, stepping;
|
||||
char vendor[CPUID_VENDOR_SZ + 1];
|
||||
|
||||
- host_cpu_vendor_fms(vendor, &family, &model, &stepping);
|
||||
+ host_cpu_vendor_fms(vendor, NULL, NULL, NULL);
|
||||
|
||||
return strcmp(vendor, CPUID_VENDOR_INTEL);
|
||||
}
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,55 @@
|
||||
From da6c7cae87a945451617014a97c83b0e38879786 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:44 +0200
|
||||
Subject: [PATCH 009/115] i386/cpu: Drop cores_per_pkg in cpu_x86_cpuid()
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [9/115] 1e8cca4b6784adde542654cd45b4f921fbc91fcd (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Local variable cores_per_pkg is only used to calculate threads_per_pkg.
|
||||
No need for it. Drop it and open-code it instead.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20241219110125.1266461-4-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 00ec7be67c3981b486293aa8e0aef9534f229c5e)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 589e1863d4e871e09af4ff176df97c23e2a33b8b)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.c | 6 ++----
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 1fe492f33d..b639769ef3 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -6950,7 +6950,6 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
uint32_t limit;
|
||||
uint32_t signature[3];
|
||||
X86CPUTopoInfo topo_info;
|
||||
- uint32_t cores_per_pkg;
|
||||
uint32_t threads_per_pkg;
|
||||
|
||||
topo_info.dies_per_pkg = env->nr_dies;
|
||||
@@ -6958,9 +6957,8 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
topo_info.cores_per_module = cs->nr_cores / env->nr_dies / env->nr_modules;
|
||||
topo_info.threads_per_core = cs->nr_threads;
|
||||
|
||||
- cores_per_pkg = topo_info.cores_per_module * topo_info.modules_per_die *
|
||||
- topo_info.dies_per_pkg;
|
||||
- threads_per_pkg = cores_per_pkg * topo_info.threads_per_core;
|
||||
+ threads_per_pkg = topo_info.threads_per_core * topo_info.cores_per_module *
|
||||
+ topo_info.modules_per_die * topo_info.dies_per_pkg;
|
||||
|
||||
/* Calculate & apply limits for different index ranges */
|
||||
if (index >= 0xC0000000) {
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,79 @@
|
||||
From 8e732c71def28ac963a8f8d530c7dc063abc6d97 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:44 +0200
|
||||
Subject: [PATCH 006/115] i386/cpu: Drop the check of phys_bits in
|
||||
host_cpu_realizefn()
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [6/115] a53971f358752d7c850baee4f8f3c7912854f160 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
The check of cpu->phys_bits to be in range between
|
||||
[32, TARGET_PHYS_ADDR_SPACE_BITS] in host_cpu_realizefn()
|
||||
is duplicated with check in x86_cpu_realizefn().
|
||||
|
||||
Since the ckeck in x86_cpu_realizefn() is called later and can cover all
|
||||
the x86 cases. Remove the one in host_cpu_realizefn().
|
||||
|
||||
Opportunistically adjust cpu->phys_bits directly in
|
||||
host_cpu_adjust_phys_bits(), which matches more with the function name.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20240929085747.2023198-1-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 855bdb6c8a60ae20043531dc965fcb1ed171d7d9)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/host-cpu.c | 16 +++-------------
|
||||
1 file changed, 3 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/target/i386/host-cpu.c b/target/i386/host-cpu.c
|
||||
index 8b8bf5afec..03b9d1b169 100644
|
||||
--- a/target/i386/host-cpu.c
|
||||
+++ b/target/i386/host-cpu.c
|
||||
@@ -42,7 +42,7 @@ static uint32_t host_cpu_phys_bits(void)
|
||||
return host_phys_bits;
|
||||
}
|
||||
|
||||
-static uint32_t host_cpu_adjust_phys_bits(X86CPU *cpu)
|
||||
+static void host_cpu_adjust_phys_bits(X86CPU *cpu)
|
||||
{
|
||||
uint32_t host_phys_bits = host_cpu_phys_bits();
|
||||
uint32_t phys_bits = cpu->phys_bits;
|
||||
@@ -66,7 +66,7 @@ static uint32_t host_cpu_adjust_phys_bits(X86CPU *cpu)
|
||||
}
|
||||
}
|
||||
|
||||
- return phys_bits;
|
||||
+ cpu->phys_bits = phys_bits;
|
||||
}
|
||||
|
||||
bool host_cpu_realizefn(CPUState *cs, Error **errp)
|
||||
@@ -75,17 +75,7 @@ bool host_cpu_realizefn(CPUState *cs, Error **errp)
|
||||
CPUX86State *env = &cpu->env;
|
||||
|
||||
if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
|
||||
- uint32_t phys_bits = host_cpu_adjust_phys_bits(cpu);
|
||||
-
|
||||
- if (phys_bits &&
|
||||
- (phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
|
||||
- phys_bits < 32)) {
|
||||
- error_setg(errp, "phys-bits should be between 32 and %u "
|
||||
- " (but is %u)",
|
||||
- TARGET_PHYS_ADDR_SPACE_BITS, phys_bits);
|
||||
- return false;
|
||||
- }
|
||||
- cpu->phys_bits = phys_bits;
|
||||
+ host_cpu_adjust_phys_bits(cpu);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,68 @@
|
||||
From 368e0e988c60d0391c1e47db7e3f1aff7742f697 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:44 +0200
|
||||
Subject: [PATCH 008/115] i386/cpu: Drop the variable smp_cores and smp_threads
|
||||
in x86_cpu_pre_plug()
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [8/115] bc67c58c23402a05899559f8ecfa61218aa3ef2a (bonzini/rhel-qemu-kvm)
|
||||
|
||||
No need to define smp_cores and smp_threads, just using ms->smp.cores
|
||||
and ms->smp.threads is straightforward. It's also consistent with other
|
||||
checks of socket/die/module.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20241219110125.1266461-3-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 81bd60625fc23cb8d4d0e682dcc4223d5e1ead84)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit c263000e490ddb361e0ef8a45342dea034036682)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
hw/i386/x86-common.c | 10 ++++------
|
||||
1 file changed, 4 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/x86-common.c b/hw/i386/x86-common.c
|
||||
index 992ea1f25e..2806be98f3 100644
|
||||
--- a/hw/i386/x86-common.c
|
||||
+++ b/hw/i386/x86-common.c
|
||||
@@ -248,8 +248,6 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||
CPUX86State *env = &cpu->env;
|
||||
MachineState *ms = MACHINE(hotplug_dev);
|
||||
X86MachineState *x86ms = X86_MACHINE(hotplug_dev);
|
||||
- unsigned int smp_cores = ms->smp.cores;
|
||||
- unsigned int smp_threads = ms->smp.threads;
|
||||
X86CPUTopoInfo topo_info;
|
||||
|
||||
if (!object_dynamic_cast(OBJECT(cpu), ms->cpu_type)) {
|
||||
@@ -329,17 +327,17 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||
if (cpu->core_id < 0) {
|
||||
error_setg(errp, "CPU core-id is not set");
|
||||
return;
|
||||
- } else if (cpu->core_id > (smp_cores - 1)) {
|
||||
+ } else if (cpu->core_id > (ms->smp.cores - 1)) {
|
||||
error_setg(errp, "Invalid CPU core-id: %u must be in range 0:%u",
|
||||
- cpu->core_id, smp_cores - 1);
|
||||
+ cpu->core_id, ms->smp.cores - 1);
|
||||
return;
|
||||
}
|
||||
if (cpu->thread_id < 0) {
|
||||
error_setg(errp, "CPU thread-id is not set");
|
||||
return;
|
||||
- } else if (cpu->thread_id > (smp_threads - 1)) {
|
||||
+ } else if (cpu->thread_id > (ms->smp.threads - 1)) {
|
||||
error_setg(errp, "Invalid CPU thread-id: %u must be in range 0:%u",
|
||||
- cpu->thread_id, smp_threads - 1);
|
||||
+ cpu->thread_id, ms->smp.threads - 1);
|
||||
return;
|
||||
}
|
||||
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,112 @@
|
||||
From 54403f52f9be5f4d05f1cc866b397820340099ab Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:44 +0200
|
||||
Subject: [PATCH 007/115] i386/cpu: Extract a common fucntion to setup value of
|
||||
MSR_CORE_THREAD_COUNT
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [7/115] d61186d383365a629a8d74a5618b4df6b2723a88 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
There are duplicated code to setup the value of MSR_CORE_THREAD_COUNT.
|
||||
Extract a common function for it.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20241219110125.1266461-2-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit d3bb5d0d4f5d4ad7dc6c02ea5fea51ca2f946593)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 66f4008d32a6cddd1ada5906487ecc9fb0b62fed)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu-sysemu.c | 11 +++++++++++
|
||||
target/i386/cpu.h | 2 ++
|
||||
target/i386/hvf/x86_emu.c | 3 +--
|
||||
target/i386/kvm/kvm.c | 5 +----
|
||||
target/i386/tcg/sysemu/misc_helper.c | 3 +--
|
||||
5 files changed, 16 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu-sysemu.c b/target/i386/cpu-sysemu.c
|
||||
index 227ac021f6..4e9df0bc01 100644
|
||||
--- a/target/i386/cpu-sysemu.c
|
||||
+++ b/target/i386/cpu-sysemu.c
|
||||
@@ -309,3 +309,14 @@ void x86_cpu_get_crash_info_qom(Object *obj, Visitor *v,
|
||||
errp);
|
||||
qapi_free_GuestPanicInformation(panic_info);
|
||||
}
|
||||
+
|
||||
+uint64_t cpu_x86_get_msr_core_thread_count(X86CPU *cpu)
|
||||
+{
|
||||
+ CPUState *cs = CPU(cpu);
|
||||
+ uint64_t val;
|
||||
+
|
||||
+ val = cs->nr_threads * cs->nr_cores; /* thread count, bits 15..0 */
|
||||
+ val |= ((uint32_t)cs->nr_cores << 16); /* core count, bits 31..16 */
|
||||
+
|
||||
+ return val;
|
||||
+}
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index 5924761551..8c9216d9d0 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -2368,6 +2368,8 @@ static inline void cpu_x86_load_seg_cache_sipi(X86CPU *cpu,
|
||||
cs->halted = 0;
|
||||
}
|
||||
|
||||
+uint64_t cpu_x86_get_msr_core_thread_count(X86CPU *cpu);
|
||||
+
|
||||
int cpu_x86_get_descr_debug(CPUX86State *env, unsigned int selector,
|
||||
target_ulong *base, unsigned int *limit,
|
||||
unsigned int *flags);
|
||||
diff --git a/target/i386/hvf/x86_emu.c b/target/i386/hvf/x86_emu.c
|
||||
index 38c782b8e3..425f1afda8 100644
|
||||
--- a/target/i386/hvf/x86_emu.c
|
||||
+++ b/target/i386/hvf/x86_emu.c
|
||||
@@ -745,8 +745,7 @@ void simulate_rdmsr(CPUX86State *env)
|
||||
val = env->mtrr_deftype;
|
||||
break;
|
||||
case MSR_CORE_THREAD_COUNT:
|
||||
- val = cs->nr_threads * cs->nr_cores; /* thread count, bits 15..0 */
|
||||
- val |= ((uint32_t)cs->nr_cores << 16); /* core count, bits 31..16 */
|
||||
+ val = cpu_x86_get_msr_core_thread_count(cpu);
|
||||
break;
|
||||
default:
|
||||
/* fprintf(stderr, "%s: unknown msr 0x%x\n", __func__, msr); */
|
||||
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
||||
index b02aec915c..fe6b34bb10 100644
|
||||
--- a/target/i386/kvm/kvm.c
|
||||
+++ b/target/i386/kvm/kvm.c
|
||||
@@ -2586,10 +2586,7 @@ static bool kvm_rdmsr_core_thread_count(X86CPU *cpu,
|
||||
uint32_t msr,
|
||||
uint64_t *val)
|
||||
{
|
||||
- CPUState *cs = CPU(cpu);
|
||||
-
|
||||
- *val = cs->nr_threads * cs->nr_cores; /* thread count, bits 15..0 */
|
||||
- *val |= ((uint32_t)cs->nr_cores << 16); /* core count, bits 31..16 */
|
||||
+ *val = cpu_x86_get_msr_core_thread_count(cpu);
|
||||
|
||||
return true;
|
||||
}
|
||||
diff --git a/target/i386/tcg/sysemu/misc_helper.c b/target/i386/tcg/sysemu/misc_helper.c
|
||||
index 094aa56a20..ff7b201b44 100644
|
||||
--- a/target/i386/tcg/sysemu/misc_helper.c
|
||||
+++ b/target/i386/tcg/sysemu/misc_helper.c
|
||||
@@ -468,8 +468,7 @@ void helper_rdmsr(CPUX86State *env)
|
||||
val = x86_cpu->ucode_rev;
|
||||
break;
|
||||
case MSR_CORE_THREAD_COUNT: {
|
||||
- CPUState *cs = CPU(x86_cpu);
|
||||
- val = (cs->nr_threads * cs->nr_cores) | (cs->nr_cores << 16);
|
||||
+ val = cpu_x86_get_msr_core_thread_count(x86_cpu);
|
||||
break;
|
||||
}
|
||||
case MSR_APIC_START ... MSR_APIC_END: {
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,80 @@
|
||||
From 97edfb8e45b34e3909f387162785f0aa8979aba6 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:44 +0200
|
||||
Subject: [PATCH 013/115] i386/cpu: Hoist check of CPUID_EXT3_TOPOEXT against
|
||||
threads_per_core
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [13/115] e8e81cac13bb9363c167e92a8478efb97ceab79a (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Now it changes to use env->topo_info.threads_per_core and doesn't depend
|
||||
on qemu_init_vcpu() anymore. Put it together with other feature checks
|
||||
before qemu_init_vcpu()
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Link: https://lore.kernel.org/r/20241219110125.1266461-8-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 473d79b56a1645be90b890f9623b27acd0afba49)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 8098c705a5d8f82d2a772194ebdbef87784b0461)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.c | 30 +++++++++++++++---------------
|
||||
1 file changed, 15 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 554455169a..2295149bfa 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -8327,6 +8327,21 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
|
||||
*/
|
||||
cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
|
||||
|
||||
+ /*
|
||||
+ * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
|
||||
+ * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
|
||||
+ * based on inputs (sockets,cores,threads), it is still better to give
|
||||
+ * users a warning.
|
||||
+ */
|
||||
+ if (IS_AMD_CPU(env) &&
|
||||
+ !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
|
||||
+ env->topo_info.threads_per_core > 1) {
|
||||
+ warn_report_once("This family of AMD CPU doesn't support "
|
||||
+ "hyperthreading(%d). Please configure -smp "
|
||||
+ "options properly or try enabling topoext "
|
||||
+ "feature.", env->topo_info.threads_per_core);
|
||||
+ }
|
||||
+
|
||||
/* For 64bit systems think about the number of physical bits to present.
|
||||
* ideally this should be the same as the host; anything other than matching
|
||||
* the host can cause incorrect guest behaviour.
|
||||
@@ -8430,21 +8445,6 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
|
||||
|
||||
qemu_init_vcpu(cs);
|
||||
|
||||
- /*
|
||||
- * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
|
||||
- * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
|
||||
- * based on inputs (sockets,cores,threads), it is still better to give
|
||||
- * users a warning.
|
||||
- */
|
||||
- if (IS_AMD_CPU(env) &&
|
||||
- !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
|
||||
- env->topo_info.threads_per_core > 1) {
|
||||
- warn_report_once("This family of AMD CPU doesn't support "
|
||||
- "hyperthreading(%d). Please configure -smp "
|
||||
- "options properly or try enabling topoext "
|
||||
- "feature.", env->topo_info.threads_per_core);
|
||||
- }
|
||||
-
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
x86_cpu_apic_realize(cpu, &local_err);
|
||||
if (local_err != NULL) {
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,105 @@
|
||||
From c45bc21b4c191ceb2523bfeac4ff2eb042469d89 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:47 +0200
|
||||
Subject: [PATCH 062/115] i386/cpu: Introduce enable_cpuid_0x1f to force
|
||||
exposing CPUID 0x1f
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [62/115] 046ef898225f70d84fbcf20266aff8478c6fb428 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Currently, QEMU exposes CPUID 0x1f to guest only when necessary, i.e.,
|
||||
when topology level that cannot be enumerated by leaf 0xB, e.g., die or
|
||||
module level, are configured for the guest, e.g., -smp xx,dies=2.
|
||||
|
||||
However, TDX architecture forces to require CPUID 0x1f to configure CPU
|
||||
topology.
|
||||
|
||||
Introduce a bool flag, enable_cpuid_0x1f, in CPU for the case that
|
||||
requires CPUID leaf 0x1f to be exposed to guest.
|
||||
|
||||
Introduce a new function x86_has_cpuid_0x1f(), which is the wrapper of
|
||||
cpu->enable_cpuid_0x1f and x86_has_extended_topo() to check if it needs
|
||||
to enable cpuid leaf 0x1f for the guest.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-34-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit ab8bd85adf75900edc2764d0ebe8b53867cc54aa)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.c | 4 ++--
|
||||
target/i386/cpu.h | 9 +++++++++
|
||||
target/i386/kvm/kvm.c | 2 +-
|
||||
3 files changed, 12 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index ee6f1c0627..ab34626b19 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -7177,7 +7177,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
break;
|
||||
case 0x1F:
|
||||
/* V2 Extended Topology Enumeration Leaf */
|
||||
- if (!x86_has_extended_topo(env->avail_cpu_topo)) {
|
||||
+ if (!x86_has_cpuid_0x1f(cpu)) {
|
||||
*eax = *ebx = *ecx = *edx = 0;
|
||||
break;
|
||||
}
|
||||
@@ -8035,7 +8035,7 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
|
||||
* cpu->vendor_cpuid_only has been unset for compatibility with older
|
||||
* machine types.
|
||||
*/
|
||||
- if (x86_has_extended_topo(env->avail_cpu_topo) &&
|
||||
+ if (x86_has_cpuid_0x1f(cpu) &&
|
||||
(IS_INTEL_CPU(env) || !cpu->vendor_cpuid_only)) {
|
||||
x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x1F);
|
||||
}
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index ee1a1b6622..83fa89bf0a 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -2168,6 +2168,9 @@ struct ArchCPU {
|
||||
/* Compatibility bits for old machine types: */
|
||||
bool enable_cpuid_0xb;
|
||||
|
||||
+ /* Force to enable cpuid 0x1f */
|
||||
+ bool enable_cpuid_0x1f;
|
||||
+
|
||||
/* Enable auto level-increase for all CPUID leaves */
|
||||
bool full_cpuid_auto_level;
|
||||
|
||||
@@ -2429,6 +2432,12 @@ void host_cpuid(uint32_t function, uint32_t count,
|
||||
uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx);
|
||||
bool cpu_has_x2apic_feature(CPUX86State *env);
|
||||
|
||||
+static inline bool x86_has_cpuid_0x1f(X86CPU *cpu)
|
||||
+{
|
||||
+ return cpu->enable_cpuid_0x1f ||
|
||||
+ x86_has_extended_topo(cpu->env.avail_cpu_topo);
|
||||
+}
|
||||
+
|
||||
/* helper.c */
|
||||
void x86_cpu_set_a20(X86CPU *cpu, int a20_state);
|
||||
void cpu_sync_avx_hflag(CPUX86State *env);
|
||||
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
||||
index 4bda4f5525..f4809ee004 100644
|
||||
--- a/target/i386/kvm/kvm.c
|
||||
+++ b/target/i386/kvm/kvm.c
|
||||
@@ -1861,7 +1861,7 @@ uint32_t kvm_x86_build_cpuid(CPUX86State *env, struct kvm_cpuid_entry2 *entries,
|
||||
break;
|
||||
}
|
||||
case 0x1f:
|
||||
- if (!x86_has_extended_topo(env->avail_cpu_topo)) {
|
||||
+ if (!x86_has_cpuid_0x1f(env_archcpu(env))) {
|
||||
cpuid_i--;
|
||||
break;
|
||||
}
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,59 @@
|
||||
From faffdc7fae7e90e9b4bdbb36ab2e753ebbf26732 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:49 +0200
|
||||
Subject: [PATCH 087/115] i386/cpu: Move adjustment of CPUID_EXT_PDCM before
|
||||
feature_dependencies[] check
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [87/115] 8e3628cfafdd307c5a38cbd2ec52ce3f679c1796 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
There is one entry relates to CPUID_EXT_PDCM in feature_dependencies[].
|
||||
So it needs to get correct value of CPUID_EXT_PDCM before using
|
||||
feature_dependencies[] to apply dependencies.
|
||||
|
||||
Besides, it also ensures CPUID_EXT_PDCM value is tracked in
|
||||
env->features[FEAT_1_ECX].
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250304052450.465445-2-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit e68ec2980901c8e7f948f3305770962806c53f0b)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.c | 7 ++++---
|
||||
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 433d0a0418..a9d6811032 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -7026,9 +7026,6 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
if (threads_per_pkg > 1) {
|
||||
*ebx |= threads_per_pkg << 16;
|
||||
}
|
||||
- if (!cpu->enable_pmu) {
|
||||
- *ecx &= ~CPUID_EXT_PDCM;
|
||||
- }
|
||||
break;
|
||||
case 2:
|
||||
/* cache info: needed for Pentium Pro compatibility */
|
||||
@@ -8012,6 +8009,10 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
+ if (!cpu->enable_pmu) {
|
||||
+ env->features[FEAT_1_ECX] &= ~CPUID_EXT_PDCM;
|
||||
+ }
|
||||
+
|
||||
for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
|
||||
FeatureDep *d = &feature_dependencies[i];
|
||||
if (!(env->features[d->from.index] & d->from.mask)) {
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,91 @@
|
||||
From eb67f5f683c98892292aa40695d7ec59a17c122f Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:50 +0200
|
||||
Subject: [PATCH 105/115] i386/cpu: Move x86_ext_save_areas[] initialization to
|
||||
.instance_init
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [105/115] 289d5143a71cd0dc24c6d8e32d510657d5c77091 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
In x86_cpu_post_initfn(), the initialization of x86_ext_save_areas[]
|
||||
marks the unsupported xsave areas based on Host support.
|
||||
|
||||
This step must be done before accel_cpu_instance_init(), otherwise,
|
||||
KVM's assertion on host xsave support would fail:
|
||||
|
||||
qemu-system-x86_64: ../target/i386/kvm/kvm-cpu.c:149:
|
||||
kvm_cpu_xsave_init: Assertion `esa->size == eax' failed.
|
||||
|
||||
(on AMD EPYC 7302 16-Core Processor)
|
||||
|
||||
Move x86_ext_save_areas[] initialization to .instance_init and place it
|
||||
before accel_cpu_instance_init().
|
||||
|
||||
Fixes: commit 5f158abef44c ("target/i386: move accel_cpu_instance_init to .instance_init")
|
||||
Reported-by: Paolo Abeni <pabeni@redhat.com>
|
||||
Tested-by: Paolo Abeni <pabeni@redhat.com>
|
||||
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250717023933.2502109-1-zhao1.liu@intel.com
|
||||
Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit e52af92e9e6f8fc00f2ae6b63214b3d6213b3cec)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.c | 22 +++++++++++++++-------
|
||||
1 file changed, 15 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index d0161f922c..ee753351fc 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -8617,6 +8617,16 @@ static void x86_cpu_register_feature_bit_props(X86CPUClass *xcc,
|
||||
}
|
||||
|
||||
static void x86_cpu_post_initfn(Object *obj)
|
||||
+{
|
||||
+#ifndef CONFIG_USER_ONLY
|
||||
+ if (current_machine && current_machine->cgs) {
|
||||
+ x86_confidential_guest_cpu_instance_init(
|
||||
+ X86_CONFIDENTIAL_GUEST(current_machine->cgs), (CPU(obj)));
|
||||
+ }
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static void x86_cpu_init_xsave(void)
|
||||
{
|
||||
static bool first = true;
|
||||
uint64_t supported_xcr0;
|
||||
@@ -8637,13 +8647,6 @@ static void x86_cpu_post_initfn(Object *obj)
|
||||
}
|
||||
}
|
||||
}
|
||||
-
|
||||
-#ifndef CONFIG_USER_ONLY
|
||||
- if (current_machine && current_machine->cgs) {
|
||||
- x86_confidential_guest_cpu_instance_init(
|
||||
- X86_CONFIDENTIAL_GUEST(current_machine->cgs), (CPU(obj)));
|
||||
- }
|
||||
-#endif
|
||||
}
|
||||
|
||||
static void x86_cpu_init_default_topo(X86CPU *cpu)
|
||||
@@ -8713,6 +8716,11 @@ static void x86_cpu_initfn(Object *obj)
|
||||
x86_cpu_load_model(cpu, xcc->model);
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * accel's cpu_instance_init may have the xsave check,
|
||||
+ * so x86_ext_save_areas[] must be initialized before this.
|
||||
+ */
|
||||
+ x86_cpu_init_xsave();
|
||||
accel_cpu_instance_init(CPU(obj));
|
||||
}
|
||||
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,73 @@
|
||||
From 07bba3fcfd6b8eb6e833e7d675be3ccc667423de Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:49 +0200
|
||||
Subject: [PATCH 089/115] i386/cpu: Rename enable_cpuid_0x1f to
|
||||
force_cpuid_0x1f
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [89/115] d1152aea8e699b1563750d286b41a47d9036429e (bonzini/rhel-qemu-kvm)
|
||||
|
||||
The name of "enable_cpuid_0x1f" isn't right to its behavior because the
|
||||
leaf 0x1f can be enabled even when "enable_cpuid_0x1f" is false.
|
||||
|
||||
Rename it to "force_cpuid_0x1f" to better reflect its behavior.
|
||||
|
||||
Suggested-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Link: https://lore.kernel.org/r/20250603050305.1704586-2-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 90d2bbd1f6edfa22a056070ee62ded55099cd56d)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.h | 4 ++--
|
||||
target/i386/kvm/tdx.c | 2 +-
|
||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index 2e73945b28..a08931f969 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -2195,7 +2195,7 @@ struct ArchCPU {
|
||||
bool enable_cpuid_0xb;
|
||||
|
||||
/* Force to enable cpuid 0x1f */
|
||||
- bool enable_cpuid_0x1f;
|
||||
+ bool force_cpuid_0x1f;
|
||||
|
||||
/* Enable auto level-increase for all CPUID leaves */
|
||||
bool full_cpuid_auto_level;
|
||||
@@ -2465,7 +2465,7 @@ void mark_forced_on_features(X86CPU *cpu, FeatureWord w, uint64_t mask,
|
||||
|
||||
static inline bool x86_has_cpuid_0x1f(X86CPU *cpu)
|
||||
{
|
||||
- return cpu->enable_cpuid_0x1f ||
|
||||
+ return cpu->force_cpuid_0x1f ||
|
||||
x86_has_extended_topo(cpu->env.avail_cpu_topo);
|
||||
}
|
||||
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index 3099e40baa..ca3641441c 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -752,7 +752,7 @@ static void tdx_cpu_instance_init(X86ConfidentialGuest *cg, CPUState *cpu)
|
||||
/* invtsc is fixed1 for TD guest */
|
||||
object_property_set_bool(OBJECT(cpu), "invtsc", true, &error_abort);
|
||||
|
||||
- x86cpu->enable_cpuid_0x1f = true;
|
||||
+ x86cpu->force_cpuid_0x1f = true;
|
||||
}
|
||||
|
||||
static uint32_t tdx_adjust_cpuid_features(X86ConfidentialGuest *cg,
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,69 @@
|
||||
From 90ccca2272ea05adc4ecedbbac70692f72831533 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:44 +0200
|
||||
Subject: [PATCH 016/115] i386/cpu: Set and track CPUID_EXT3_CMP_LEG in
|
||||
env->features[FEAT_8000_0001_ECX]
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [16/115] 8d6efb657ea34f7adccb5f8648cf0d10ba126299 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
The correct usage is tracking and maintaining features in env->features[]
|
||||
instead of manually set it in cpu_x86_cpuid().
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Link: https://lore.kernel.org/r/20241219110125.1266461-11-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 99a637a86f55c8486b06c698656befdf012eec4d)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit eb7304fc81c136a475a951720b76afa1f128ae95)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.c | 20 +++++++++-----------
|
||||
1 file changed, 9 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index e20977411d..a97d042a2e 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -7404,17 +7404,6 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
*ecx = env->features[FEAT_8000_0001_ECX];
|
||||
*edx = env->features[FEAT_8000_0001_EDX];
|
||||
|
||||
- /* The Linux kernel checks for the CMPLegacy bit and
|
||||
- * discards multiple thread information if it is set.
|
||||
- * So don't set it here for Intel to make Linux guests happy.
|
||||
- */
|
||||
- if (threads_per_pkg > 1) {
|
||||
- if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 ||
|
||||
- env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 ||
|
||||
- env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) {
|
||||
- *ecx |= 1 << 1; /* CmpLegacy bit */
|
||||
- }
|
||||
- }
|
||||
if (tcg_enabled() && env->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 &&
|
||||
!(env->hflags & HF_LMA_MASK)) {
|
||||
*edx &= ~CPUID_EXT2_SYSCALL;
|
||||
@@ -7976,6 +7965,15 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
|
||||
|
||||
if (x86_threads_per_pkg(&env->topo_info) > 1) {
|
||||
env->features[FEAT_1_EDX] |= CPUID_HT;
|
||||
+
|
||||
+ /*
|
||||
+ * The Linux kernel checks for the CMPLegacy bit and
|
||||
+ * discards multiple thread information if it is set.
|
||||
+ * So don't set it here for Intel to make Linux guests happy.
|
||||
+ */
|
||||
+ if (!IS_INTEL_CPU(env)) {
|
||||
+ env->features[FEAT_8000_0001_ECX] |= CPUID_EXT3_CMP_LEG;
|
||||
+ }
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,59 @@
|
||||
From 673bbd9c79946356d2863f0944a576d100750c64 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:44 +0200
|
||||
Subject: [PATCH 015/115] i386/cpu: Set up CPUID_HT in
|
||||
x86_cpu_expand_features() instead of cpu_x86_cpuid()
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [15/115] c763ec424a0cc64f46fd27aa2f03fd1b2933c23b (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Currently CPUID_HT is evaluated in cpu_x86_cpuid() each time. It's not a
|
||||
correct usage of how feature bit is maintained and evaluated. The
|
||||
expected practice is that features are tracked in env->features[] and
|
||||
cpu_x86_cpuid() should be the consumer of env->features[].
|
||||
|
||||
Track CPUID_HT in env->features[FEAT_1_EDX] instead and evaluate it in
|
||||
cpu's realizefn().
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Link: https://lore.kernel.org/r/20241219110125.1266461-10-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit c6bd2dd634208ca717b6dc010064fe34d1359080)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 4e3da2efde9f16460e90246bec15b29739930bb1)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 2295149bfa..e20977411d 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -6989,7 +6989,6 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
*edx = env->features[FEAT_1_EDX];
|
||||
if (threads_per_pkg > 1) {
|
||||
*ebx |= threads_per_pkg << 16;
|
||||
- *edx |= CPUID_HT;
|
||||
}
|
||||
if (!cpu->enable_pmu) {
|
||||
*ecx &= ~CPUID_EXT_PDCM;
|
||||
@@ -7975,6 +7974,10 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
+ if (x86_threads_per_pkg(&env->topo_info) > 1) {
|
||||
+ env->features[FEAT_1_EDX] |= CPUID_HT;
|
||||
+ }
|
||||
+
|
||||
for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
|
||||
FeatureDep *d = &feature_dependencies[i];
|
||||
if (!(env->features[d->from.index] & d->from.mask)) {
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,301 @@
|
||||
From 03d6e64ed980335602368d3b470e33cb21af307d Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:44 +0200
|
||||
Subject: [PATCH 012/115] i386/cpu: Track a X86CPUTopoInfo directly in
|
||||
CPUX86State
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [12/115] 4d23b4e386ec4179739869c1ace2bb2b9f728bde (bonzini/rhel-qemu-kvm)
|
||||
|
||||
The name of nr_modules/nr_dies are ambiguous and they mislead people.
|
||||
|
||||
The purpose of them is to record and form the topology information. So
|
||||
just maintain a X86CPUTopoInfo member in CPUX86State instead. Then
|
||||
nr_modules and nr_dies can be dropped.
|
||||
|
||||
As the benefit, x86 can switch to use information in
|
||||
CPUX86State::topo_info and get rid of the nr_cores and nr_threads in
|
||||
CPUState. This helps remove the dependency on qemu_init_vcpu(), so that
|
||||
x86 can get and use topology info earlier in x86_cpu_realizefn(); drop
|
||||
the comment that highlighted the depedency.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Link: https://lore.kernel.org/r/20241219110125.1266461-7-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 84b71a131c1bc84c36fafb63271080ecf9f2ff7a)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit f598befcd2cddbf01f7606102400cec4acd35d48)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
hw/i386/x86-common.c | 12 ++++------
|
||||
target/i386/cpu-sysemu.c | 6 ++---
|
||||
target/i386/cpu.c | 51 +++++++++++++++++-----------------------
|
||||
target/i386/cpu.h | 6 +----
|
||||
4 files changed, 30 insertions(+), 45 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/x86-common.c b/hw/i386/x86-common.c
|
||||
index 2806be98f3..562215990d 100644
|
||||
--- a/hw/i386/x86-common.c
|
||||
+++ b/hw/i386/x86-common.c
|
||||
@@ -248,7 +248,7 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||
CPUX86State *env = &cpu->env;
|
||||
MachineState *ms = MACHINE(hotplug_dev);
|
||||
X86MachineState *x86ms = X86_MACHINE(hotplug_dev);
|
||||
- X86CPUTopoInfo topo_info;
|
||||
+ X86CPUTopoInfo *topo_info = &env->topo_info;
|
||||
|
||||
if (!object_dynamic_cast(OBJECT(cpu), ms->cpu_type)) {
|
||||
error_setg(errp, "Invalid CPU type, expected cpu type: '%s'",
|
||||
@@ -267,15 +267,13 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||
}
|
||||
}
|
||||
|
||||
- init_topo_info(&topo_info, x86ms);
|
||||
+ init_topo_info(topo_info, x86ms);
|
||||
|
||||
if (ms->smp.modules > 1) {
|
||||
- env->nr_modules = ms->smp.modules;
|
||||
set_bit(CPU_TOPO_LEVEL_MODULE, env->avail_cpu_topo);
|
||||
}
|
||||
|
||||
if (ms->smp.dies > 1) {
|
||||
- env->nr_dies = ms->smp.dies;
|
||||
set_bit(CPU_TOPO_LEVEL_DIE, env->avail_cpu_topo);
|
||||
}
|
||||
|
||||
@@ -346,12 +344,12 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||
topo_ids.module_id = cpu->module_id;
|
||||
topo_ids.core_id = cpu->core_id;
|
||||
topo_ids.smt_id = cpu->thread_id;
|
||||
- cpu->apic_id = x86_apicid_from_topo_ids(&topo_info, &topo_ids);
|
||||
+ cpu->apic_id = x86_apicid_from_topo_ids(topo_info, &topo_ids);
|
||||
}
|
||||
|
||||
cpu_slot = x86_find_cpu_slot(MACHINE(x86ms), cpu->apic_id, &idx);
|
||||
if (!cpu_slot) {
|
||||
- x86_topo_ids_from_apicid(cpu->apic_id, &topo_info, &topo_ids);
|
||||
+ x86_topo_ids_from_apicid(cpu->apic_id, topo_info, &topo_ids);
|
||||
|
||||
error_setg(errp,
|
||||
"Invalid CPU [socket: %u, die: %u, module: %u, core: %u, thread: %u]"
|
||||
@@ -374,7 +372,7 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||
/* TODO: move socket_id/core_id/thread_id checks into x86_cpu_realizefn()
|
||||
* once -smp refactoring is complete and there will be CPU private
|
||||
* CPUState::nr_cores and CPUState::nr_threads fields instead of globals */
|
||||
- x86_topo_ids_from_apicid(cpu->apic_id, &topo_info, &topo_ids);
|
||||
+ x86_topo_ids_from_apicid(cpu->apic_id, topo_info, &topo_ids);
|
||||
if (cpu->socket_id != -1 && cpu->socket_id != topo_ids.pkg_id) {
|
||||
error_setg(errp, "property socket-id: %u doesn't match set apic-id:"
|
||||
" 0x%x (socket-id: %u)", cpu->socket_id, cpu->apic_id,
|
||||
diff --git a/target/i386/cpu-sysemu.c b/target/i386/cpu-sysemu.c
|
||||
index 4e9df0bc01..31b37c6325 100644
|
||||
--- a/target/i386/cpu-sysemu.c
|
||||
+++ b/target/i386/cpu-sysemu.c
|
||||
@@ -312,11 +312,11 @@ void x86_cpu_get_crash_info_qom(Object *obj, Visitor *v,
|
||||
|
||||
uint64_t cpu_x86_get_msr_core_thread_count(X86CPU *cpu)
|
||||
{
|
||||
- CPUState *cs = CPU(cpu);
|
||||
+ CPUX86State *env = &cpu->env;
|
||||
uint64_t val;
|
||||
|
||||
- val = cs->nr_threads * cs->nr_cores; /* thread count, bits 15..0 */
|
||||
- val |= ((uint32_t)cs->nr_cores << 16); /* core count, bits 31..16 */
|
||||
+ val = x86_threads_per_pkg(&env->topo_info); /* thread count, bits 15..0 */
|
||||
+ val |= x86_cores_per_pkg(&env->topo_info) << 16; /* core count, bits 31..16 */
|
||||
|
||||
return val;
|
||||
}
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 1c79eb9a06..554455169a 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -6947,15 +6947,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
CPUState *cs = env_cpu(env);
|
||||
uint32_t limit;
|
||||
uint32_t signature[3];
|
||||
- X86CPUTopoInfo topo_info;
|
||||
+ X86CPUTopoInfo *topo_info = &env->topo_info;
|
||||
uint32_t threads_per_pkg;
|
||||
|
||||
- topo_info.dies_per_pkg = env->nr_dies;
|
||||
- topo_info.modules_per_die = env->nr_modules;
|
||||
- topo_info.cores_per_module = cs->nr_cores / env->nr_dies / env->nr_modules;
|
||||
- topo_info.threads_per_core = cs->nr_threads;
|
||||
-
|
||||
- threads_per_pkg = x86_threads_per_pkg(&topo_info);
|
||||
+ threads_per_pkg = x86_threads_per_pkg(topo_info);
|
||||
|
||||
/* Calculate & apply limits for different index ranges */
|
||||
if (index >= 0xC0000000) {
|
||||
@@ -7032,12 +7027,12 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
int host_vcpus_per_cache = 1 + ((*eax & 0x3FFC000) >> 14);
|
||||
|
||||
*eax &= ~0xFC000000;
|
||||
- *eax |= max_core_ids_in_package(&topo_info) << 26;
|
||||
+ *eax |= max_core_ids_in_package(topo_info) << 26;
|
||||
if (host_vcpus_per_cache > threads_per_pkg) {
|
||||
*eax &= ~0x3FFC000;
|
||||
|
||||
/* Share the cache at package level. */
|
||||
- *eax |= max_thread_ids_for_cache(&topo_info,
|
||||
+ *eax |= max_thread_ids_for_cache(topo_info,
|
||||
CPU_TOPO_LEVEL_PACKAGE) << 14;
|
||||
}
|
||||
}
|
||||
@@ -7049,7 +7044,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
switch (count) {
|
||||
case 0: /* L1 dcache info */
|
||||
encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache,
|
||||
- &topo_info,
|
||||
+ topo_info,
|
||||
eax, ebx, ecx, edx);
|
||||
if (!cpu->l1_cache_per_core) {
|
||||
*eax &= ~MAKE_64BIT_MASK(14, 12);
|
||||
@@ -7057,7 +7052,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
break;
|
||||
case 1: /* L1 icache info */
|
||||
encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache,
|
||||
- &topo_info,
|
||||
+ topo_info,
|
||||
eax, ebx, ecx, edx);
|
||||
if (!cpu->l1_cache_per_core) {
|
||||
*eax &= ~MAKE_64BIT_MASK(14, 12);
|
||||
@@ -7065,13 +7060,13 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
break;
|
||||
case 2: /* L2 cache info */
|
||||
encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache,
|
||||
- &topo_info,
|
||||
+ topo_info,
|
||||
eax, ebx, ecx, edx);
|
||||
break;
|
||||
case 3: /* L3 cache info */
|
||||
if (cpu->enable_l3_cache) {
|
||||
encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache,
|
||||
- &topo_info,
|
||||
+ topo_info,
|
||||
eax, ebx, ecx, edx);
|
||||
break;
|
||||
}
|
||||
@@ -7154,12 +7149,12 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
|
||||
switch (count) {
|
||||
case 0:
|
||||
- *eax = apicid_core_offset(&topo_info);
|
||||
- *ebx = topo_info.threads_per_core;
|
||||
+ *eax = apicid_core_offset(topo_info);
|
||||
+ *ebx = topo_info->threads_per_core;
|
||||
*ecx |= CPUID_B_ECX_TOPO_LEVEL_SMT << 8;
|
||||
break;
|
||||
case 1:
|
||||
- *eax = apicid_pkg_offset(&topo_info);
|
||||
+ *eax = apicid_pkg_offset(topo_info);
|
||||
*ebx = threads_per_pkg;
|
||||
*ecx |= CPUID_B_ECX_TOPO_LEVEL_CORE << 8;
|
||||
break;
|
||||
@@ -7185,7 +7180,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
break;
|
||||
}
|
||||
|
||||
- encode_topo_cpuid1f(env, count, &topo_info, eax, ebx, ecx, edx);
|
||||
+ encode_topo_cpuid1f(env, count, topo_info, eax, ebx, ecx, edx);
|
||||
break;
|
||||
case 0xD: {
|
||||
/* Processor Extended State */
|
||||
@@ -7488,7 +7483,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
* thread ID within a package".
|
||||
* Bits 7:0 is "The number of threads in the package is NC+1"
|
||||
*/
|
||||
- *ecx = (apicid_pkg_offset(&topo_info) << 12) |
|
||||
+ *ecx = (apicid_pkg_offset(topo_info) << 12) |
|
||||
(threads_per_pkg - 1);
|
||||
} else {
|
||||
*ecx = 0;
|
||||
@@ -7517,19 +7512,19 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
switch (count) {
|
||||
case 0: /* L1 dcache info */
|
||||
encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache,
|
||||
- &topo_info, eax, ebx, ecx, edx);
|
||||
+ topo_info, eax, ebx, ecx, edx);
|
||||
break;
|
||||
case 1: /* L1 icache info */
|
||||
encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache,
|
||||
- &topo_info, eax, ebx, ecx, edx);
|
||||
+ topo_info, eax, ebx, ecx, edx);
|
||||
break;
|
||||
case 2: /* L2 cache info */
|
||||
encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache,
|
||||
- &topo_info, eax, ebx, ecx, edx);
|
||||
+ topo_info, eax, ebx, ecx, edx);
|
||||
break;
|
||||
case 3: /* L3 cache info */
|
||||
encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache,
|
||||
- &topo_info, eax, ebx, ecx, edx);
|
||||
+ topo_info, eax, ebx, ecx, edx);
|
||||
break;
|
||||
default: /* end of info */
|
||||
*eax = *ebx = *ecx = *edx = 0;
|
||||
@@ -7541,7 +7536,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
break;
|
||||
case 0x8000001E:
|
||||
if (cpu->core_id <= 255) {
|
||||
- encode_topo_cpuid8000001e(cpu, &topo_info, eax, ebx, ecx, edx);
|
||||
+ encode_topo_cpuid8000001e(cpu, topo_info, eax, ebx, ecx, edx);
|
||||
} else {
|
||||
*eax = 0;
|
||||
*ebx = 0;
|
||||
@@ -8440,17 +8435,14 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
|
||||
* fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
|
||||
* based on inputs (sockets,cores,threads), it is still better to give
|
||||
* users a warning.
|
||||
- *
|
||||
- * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
|
||||
- * cs->nr_threads hasn't be populated yet and the checking is incorrect.
|
||||
*/
|
||||
if (IS_AMD_CPU(env) &&
|
||||
!(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
|
||||
- cs->nr_threads > 1) {
|
||||
+ env->topo_info.threads_per_core > 1) {
|
||||
warn_report_once("This family of AMD CPU doesn't support "
|
||||
"hyperthreading(%d). Please configure -smp "
|
||||
"options properly or try enabling topoext "
|
||||
- "feature.", cs->nr_threads);
|
||||
+ "feature.", env->topo_info.threads_per_core);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
@@ -8611,8 +8603,7 @@ static void x86_cpu_init_default_topo(X86CPU *cpu)
|
||||
{
|
||||
CPUX86State *env = &cpu->env;
|
||||
|
||||
- env->nr_modules = 1;
|
||||
- env->nr_dies = 1;
|
||||
+ env->topo_info = (X86CPUTopoInfo) {1, 1, 1, 1};
|
||||
|
||||
/* SMT, core and package levels are set by default. */
|
||||
set_bit(CPU_TOPO_LEVEL_SMT, env->avail_cpu_topo);
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index 8c9216d9d0..cc42a2c520 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -2024,11 +2024,7 @@ typedef struct CPUArchState {
|
||||
|
||||
TPRAccess tpr_access_type;
|
||||
|
||||
- /* Number of dies within this CPU package. */
|
||||
- unsigned nr_dies;
|
||||
-
|
||||
- /* Number of modules within one die. */
|
||||
- unsigned nr_modules;
|
||||
+ X86CPUTopoInfo topo_info;
|
||||
|
||||
/* Bitmap of available CPU topology levels for this CPU. */
|
||||
DECLARE_BITMAP(avail_cpu_topo, CPU_TOPO_LEVEL_MAX);
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,87 @@
|
||||
From 831b04c3f8f66705a01b4fd455dbe53fa3193a4e Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:47 +0200
|
||||
Subject: [PATCH 060/115] i386/cpu: introduce
|
||||
x86_confidential_guest_cpu_instance_init()
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [60/115] be57d5108231bb12dc6c9ffd8c9c639b87b1f15c (bonzini/rhel-qemu-kvm)
|
||||
|
||||
To allow execute confidential guest specific cpu init operations.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-32-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 8583c53e2b619b1b9569d3f2d3f3cb2904a573ad)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
Conflict: include/system/ is still include/sysemu/
|
||||
---
|
||||
target/i386/confidential-guest.h | 11 +++++++++++
|
||||
target/i386/cpu.c | 8 ++++++++
|
||||
2 files changed, 19 insertions(+)
|
||||
|
||||
diff --git a/target/i386/confidential-guest.h b/target/i386/confidential-guest.h
|
||||
index 7342d2843a..38169ed68e 100644
|
||||
--- a/target/i386/confidential-guest.h
|
||||
+++ b/target/i386/confidential-guest.h
|
||||
@@ -39,6 +39,7 @@ struct X86ConfidentialGuestClass {
|
||||
|
||||
/* <public> */
|
||||
int (*kvm_type)(X86ConfidentialGuest *cg);
|
||||
+ void (*cpu_instance_init)(X86ConfidentialGuest *cg, CPUState *cpu);
|
||||
uint32_t (*mask_cpuid_features)(X86ConfidentialGuest *cg, uint32_t feature, uint32_t index,
|
||||
int reg, uint32_t value);
|
||||
};
|
||||
@@ -59,6 +60,16 @@ static inline int x86_confidential_guest_kvm_type(X86ConfidentialGuest *cg)
|
||||
}
|
||||
}
|
||||
|
||||
+static inline void x86_confidential_guest_cpu_instance_init(X86ConfidentialGuest *cg,
|
||||
+ CPUState *cpu)
|
||||
+{
|
||||
+ X86ConfidentialGuestClass *klass = X86_CONFIDENTIAL_GUEST_GET_CLASS(cg);
|
||||
+
|
||||
+ if (klass->cpu_instance_init) {
|
||||
+ klass->cpu_instance_init(cg, cpu);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* x86_confidential_guest_mask_cpuid_features:
|
||||
*
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 4eef3d1dbd..ee6f1c0627 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/i386/topology.h"
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
+#include "confidential-guest.h"
|
||||
#include "sysemu/reset.h"
|
||||
#include "qapi/qapi-commands-machine-target.h"
|
||||
#include "exec/address-spaces.h"
|
||||
@@ -8600,6 +8601,13 @@ static void x86_cpu_post_initfn(Object *obj)
|
||||
}
|
||||
|
||||
accel_cpu_instance_init(CPU(obj));
|
||||
+
|
||||
+#ifndef CONFIG_USER_ONLY
|
||||
+ if (current_machine && current_machine->cgs) {
|
||||
+ x86_confidential_guest_cpu_instance_init(
|
||||
+ X86_CONFIDENTIAL_GUEST(current_machine->cgs), (CPU(obj)));
|
||||
+ }
|
||||
+#endif
|
||||
}
|
||||
|
||||
static void x86_cpu_init_default_topo(X86CPU *cpu)
|
||||
--
|
||||
2.50.1
|
||||
|
||||
55
SOURCES/kvm-i386-tdvf-Fix-build-on-32-bit-host.patch
Normal file
55
SOURCES/kvm-i386-tdvf-Fix-build-on-32-bit-host.patch
Normal file
@ -0,0 +1,55 @@
|
||||
From d77454aef08828ab25881dbd9acb25f3d6f59d10 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:49 +0200
|
||||
Subject: [PATCH 086/115] i386/tdvf: Fix build on 32-bit host
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [86/115] 99b8d992079a248091911010238eb20588acca6a (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Use PRI formats where required.
|
||||
|
||||
Cc: Isaku Yamahata <isaku.yamahata@intel.com>
|
||||
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||
Link: https://lore.kernel.org/r/20250602173101.1052983-3-clg@redhat.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 6f1035fc65406c4e72e1dbd76e64924415edd616)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
hw/i386/tdvf.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/tdvf.c b/hw/i386/tdvf.c
|
||||
index 88453cf3a5..6fcc794880 100644
|
||||
--- a/hw/i386/tdvf.c
|
||||
+++ b/hw/i386/tdvf.c
|
||||
@@ -101,16 +101,16 @@ static int tdvf_parse_and_check_section_entry(const TdvfSectionEntry *src,
|
||||
|
||||
/* sanity check */
|
||||
if (entry->size < entry->data_len) {
|
||||
- error_report("Broken metadata RawDataSize 0x%x MemoryDataSize 0x%lx",
|
||||
+ error_report("Broken metadata RawDataSize 0x%x MemoryDataSize 0x%"PRIx64,
|
||||
entry->data_len, entry->size);
|
||||
return -1;
|
||||
}
|
||||
if (!QEMU_IS_ALIGNED(entry->address, TDVF_ALIGNMENT)) {
|
||||
- error_report("MemoryAddress 0x%lx not page aligned", entry->address);
|
||||
+ error_report("MemoryAddress 0x%"PRIx64" not page aligned", entry->address);
|
||||
return -1;
|
||||
}
|
||||
if (!QEMU_IS_ALIGNED(entry->size, TDVF_ALIGNMENT)) {
|
||||
- error_report("MemoryDataSize 0x%lx not page aligned", entry->size);
|
||||
+ error_report("MemoryDataSize 0x%"PRIx64" not page aligned", entry->size);
|
||||
return -1;
|
||||
}
|
||||
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,315 @@
|
||||
From e31406cad5a27e2a807dfacb92d9d44efd1615fe Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:46 +0200
|
||||
Subject: [PATCH 046/115] i386/tdvf: Introduce function to parse TDVF metadata
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [46/115] 5eed49eea4f80f57a310e69a47ee220bd41f6188 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
TDX VM needs to boot with its specialized firmware, Trusted Domain
|
||||
Virtual Firmware (TDVF). QEMU needs to parse TDVF and map it in TD
|
||||
guest memory prior to running the TDX VM.
|
||||
|
||||
A TDVF Metadata in TDVF image describes the structure of firmware.
|
||||
QEMU refers to it to setup memory for TDVF. Introduce function
|
||||
tdvf_parse_metadata() to parse the metadata from TDVF image and store
|
||||
the info of each TDVF section.
|
||||
|
||||
TDX metadata is located by a TDX metadata offset block, which is a
|
||||
GUID-ed structure. The data portion of the GUID structure contains
|
||||
only an 4-byte field that is the offset of TDX metadata to the end
|
||||
of firmware file.
|
||||
|
||||
Select X86_FW_OVMF when TDX is enable to leverage existing functions
|
||||
to parse and search OVMF's GUID-ed structures.
|
||||
|
||||
Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
|
||||
Co-developed-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-18-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit b65a6011d16c4f7cb2eb227ab1bc735850475288)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
Conflicts: system/ -> sysemu/
|
||||
---
|
||||
hw/i386/Kconfig | 1 +
|
||||
hw/i386/meson.build | 1 +
|
||||
hw/i386/tdvf.c | 188 +++++++++++++++++++++++++++++++++++++++++
|
||||
include/hw/i386/tdvf.h | 38 +++++++++
|
||||
4 files changed, 228 insertions(+)
|
||||
create mode 100644 hw/i386/tdvf.c
|
||||
create mode 100644 include/hw/i386/tdvf.h
|
||||
|
||||
diff --git a/hw/i386/Kconfig b/hw/i386/Kconfig
|
||||
index edd61cd2aa..31e50e2ebf 100644
|
||||
--- a/hw/i386/Kconfig
|
||||
+++ b/hw/i386/Kconfig
|
||||
@@ -12,6 +12,7 @@ config SGX
|
||||
|
||||
config TDX
|
||||
bool
|
||||
+ select X86_FW_OVMF
|
||||
depends on KVM
|
||||
|
||||
config PC
|
||||
diff --git a/hw/i386/meson.build b/hw/i386/meson.build
|
||||
index 03aad10df7..d6d8023664 100644
|
||||
--- a/hw/i386/meson.build
|
||||
+++ b/hw/i386/meson.build
|
||||
@@ -31,6 +31,7 @@ i386_ss.add(when: 'CONFIG_PC', if_true: files(
|
||||
'port92.c'))
|
||||
i386_ss.add(when: 'CONFIG_X86_FW_OVMF', if_true: files('pc_sysfw_ovmf.c'),
|
||||
if_false: files('pc_sysfw_ovmf-stubs.c'))
|
||||
+i386_ss.add(when: 'CONFIG_TDX', if_true: files('tdvf.c'))
|
||||
|
||||
subdir('kvm')
|
||||
subdir('xen')
|
||||
diff --git a/hw/i386/tdvf.c b/hw/i386/tdvf.c
|
||||
new file mode 100644
|
||||
index 0000000000..824a387d42
|
||||
--- /dev/null
|
||||
+++ b/hw/i386/tdvf.c
|
||||
@@ -0,0 +1,188 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2025 Intel Corporation
|
||||
+ * Author: Isaku Yamahata <isaku.yamahata at gmail.com>
|
||||
+ * <isaku.yamahata at intel.com>
|
||||
+ * Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
+ *
|
||||
+ * SPDX-License-Identifier: GPL-2.0-or-later
|
||||
+ */
|
||||
+
|
||||
+#include "qemu/osdep.h"
|
||||
+#include "qemu/error-report.h"
|
||||
+
|
||||
+#include "hw/i386/pc.h"
|
||||
+#include "hw/i386/tdvf.h"
|
||||
+#include "sysemu/kvm.h"
|
||||
+
|
||||
+#define TDX_METADATA_OFFSET_GUID "e47a6535-984a-4798-865e-4685a7bf8ec2"
|
||||
+#define TDX_METADATA_VERSION 1
|
||||
+#define TDVF_SIGNATURE 0x46564454 /* TDVF as little endian */
|
||||
+#define TDVF_ALIGNMENT 4096
|
||||
+
|
||||
+/*
|
||||
+ * the raw structs read from TDVF keeps the name convention in
|
||||
+ * TDVF Design Guide spec.
|
||||
+ */
|
||||
+typedef struct {
|
||||
+ uint32_t DataOffset;
|
||||
+ uint32_t RawDataSize;
|
||||
+ uint64_t MemoryAddress;
|
||||
+ uint64_t MemoryDataSize;
|
||||
+ uint32_t Type;
|
||||
+ uint32_t Attributes;
|
||||
+} TdvfSectionEntry;
|
||||
+
|
||||
+typedef struct {
|
||||
+ uint32_t Signature;
|
||||
+ uint32_t Length;
|
||||
+ uint32_t Version;
|
||||
+ uint32_t NumberOfSectionEntries;
|
||||
+ TdvfSectionEntry SectionEntries[];
|
||||
+} TdvfMetadata;
|
||||
+
|
||||
+struct tdx_metadata_offset {
|
||||
+ uint32_t offset;
|
||||
+};
|
||||
+
|
||||
+static TdvfMetadata *tdvf_get_metadata(void *flash_ptr, int size)
|
||||
+{
|
||||
+ TdvfMetadata *metadata;
|
||||
+ uint32_t offset = 0;
|
||||
+ uint8_t *data;
|
||||
+
|
||||
+ if ((uint32_t) size != size) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ if (pc_system_ovmf_table_find(TDX_METADATA_OFFSET_GUID, &data, NULL)) {
|
||||
+ offset = size - le32_to_cpu(((struct tdx_metadata_offset *)data)->offset);
|
||||
+
|
||||
+ if (offset + sizeof(*metadata) > size) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ } else {
|
||||
+ error_report("Cannot find TDX_METADATA_OFFSET_GUID");
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ metadata = flash_ptr + offset;
|
||||
+
|
||||
+ /* Finally, verify the signature to determine if this is a TDVF image. */
|
||||
+ metadata->Signature = le32_to_cpu(metadata->Signature);
|
||||
+ if (metadata->Signature != TDVF_SIGNATURE) {
|
||||
+ error_report("Invalid TDVF signature in metadata!");
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ /* Sanity check that the TDVF doesn't overlap its own metadata. */
|
||||
+ metadata->Length = le32_to_cpu(metadata->Length);
|
||||
+ if (offset + metadata->Length > size) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ /* Only version 1 is supported/defined. */
|
||||
+ metadata->Version = le32_to_cpu(metadata->Version);
|
||||
+ if (metadata->Version != TDX_METADATA_VERSION) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ return metadata;
|
||||
+}
|
||||
+
|
||||
+static int tdvf_parse_and_check_section_entry(const TdvfSectionEntry *src,
|
||||
+ TdxFirmwareEntry *entry)
|
||||
+{
|
||||
+ entry->data_offset = le32_to_cpu(src->DataOffset);
|
||||
+ entry->data_len = le32_to_cpu(src->RawDataSize);
|
||||
+ entry->address = le64_to_cpu(src->MemoryAddress);
|
||||
+ entry->size = le64_to_cpu(src->MemoryDataSize);
|
||||
+ entry->type = le32_to_cpu(src->Type);
|
||||
+ entry->attributes = le32_to_cpu(src->Attributes);
|
||||
+
|
||||
+ /* sanity check */
|
||||
+ if (entry->size < entry->data_len) {
|
||||
+ error_report("Broken metadata RawDataSize 0x%x MemoryDataSize 0x%lx",
|
||||
+ entry->data_len, entry->size);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ if (!QEMU_IS_ALIGNED(entry->address, TDVF_ALIGNMENT)) {
|
||||
+ error_report("MemoryAddress 0x%lx not page aligned", entry->address);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ if (!QEMU_IS_ALIGNED(entry->size, TDVF_ALIGNMENT)) {
|
||||
+ error_report("MemoryDataSize 0x%lx not page aligned", entry->size);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ switch (entry->type) {
|
||||
+ case TDVF_SECTION_TYPE_BFV:
|
||||
+ case TDVF_SECTION_TYPE_CFV:
|
||||
+ /* The sections that must be copied from firmware image to TD memory */
|
||||
+ if (entry->data_len == 0) {
|
||||
+ error_report("%d section with RawDataSize == 0", entry->type);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ break;
|
||||
+ case TDVF_SECTION_TYPE_TD_HOB:
|
||||
+ case TDVF_SECTION_TYPE_TEMP_MEM:
|
||||
+ /* The sections that no need to be copied from firmware image */
|
||||
+ if (entry->data_len != 0) {
|
||||
+ error_report("%d section with RawDataSize 0x%x != 0",
|
||||
+ entry->type, entry->data_len);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ break;
|
||||
+ default:
|
||||
+ error_report("TDVF contains unsupported section type %d", entry->type);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int tdvf_parse_metadata(TdxFirmware *fw, void *flash_ptr, int size)
|
||||
+{
|
||||
+ g_autofree TdvfSectionEntry *sections = NULL;
|
||||
+ TdvfMetadata *metadata;
|
||||
+ ssize_t entries_size;
|
||||
+ int i;
|
||||
+
|
||||
+ metadata = tdvf_get_metadata(flash_ptr, size);
|
||||
+ if (!metadata) {
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ /* load and parse metadata entries */
|
||||
+ fw->nr_entries = le32_to_cpu(metadata->NumberOfSectionEntries);
|
||||
+ if (fw->nr_entries < 2) {
|
||||
+ error_report("Invalid number of fw entries (%u) in TDVF Metadata",
|
||||
+ fw->nr_entries);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ entries_size = fw->nr_entries * sizeof(TdvfSectionEntry);
|
||||
+ if (metadata->Length != sizeof(*metadata) + entries_size) {
|
||||
+ error_report("TDVF metadata len (0x%x) mismatch, expected (0x%x)",
|
||||
+ metadata->Length,
|
||||
+ (uint32_t)(sizeof(*metadata) + entries_size));
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ fw->entries = g_new(TdxFirmwareEntry, fw->nr_entries);
|
||||
+ sections = g_new(TdvfSectionEntry, fw->nr_entries);
|
||||
+
|
||||
+ memcpy(sections, (void *)metadata + sizeof(*metadata), entries_size);
|
||||
+
|
||||
+ for (i = 0; i < fw->nr_entries; i++) {
|
||||
+ if (tdvf_parse_and_check_section_entry(§ions[i], &fw->entries[i])) {
|
||||
+ goto err;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+err:
|
||||
+ fw->entries = 0;
|
||||
+ g_free(fw->entries);
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
diff --git a/include/hw/i386/tdvf.h b/include/hw/i386/tdvf.h
|
||||
new file mode 100644
|
||||
index 0000000000..7ebcac42a3
|
||||
--- /dev/null
|
||||
+++ b/include/hw/i386/tdvf.h
|
||||
@@ -0,0 +1,38 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2025 Intel Corporation
|
||||
+ * Author: Isaku Yamahata <isaku.yamahata at gmail.com>
|
||||
+ * <isaku.yamahata at intel.com>
|
||||
+ *
|
||||
+ * SPDX-License-Identifier: GPL-2.0-or-later
|
||||
+ */
|
||||
+
|
||||
+#ifndef HW_I386_TDVF_H
|
||||
+#define HW_I386_TDVF_H
|
||||
+
|
||||
+#include "qemu/osdep.h"
|
||||
+
|
||||
+#define TDVF_SECTION_TYPE_BFV 0
|
||||
+#define TDVF_SECTION_TYPE_CFV 1
|
||||
+#define TDVF_SECTION_TYPE_TD_HOB 2
|
||||
+#define TDVF_SECTION_TYPE_TEMP_MEM 3
|
||||
+
|
||||
+#define TDVF_SECTION_ATTRIBUTES_MR_EXTEND (1U << 0)
|
||||
+#define TDVF_SECTION_ATTRIBUTES_PAGE_AUG (1U << 1)
|
||||
+
|
||||
+typedef struct TdxFirmwareEntry {
|
||||
+ uint32_t data_offset;
|
||||
+ uint32_t data_len;
|
||||
+ uint64_t address;
|
||||
+ uint64_t size;
|
||||
+ uint32_t type;
|
||||
+ uint32_t attributes;
|
||||
+} TdxFirmwareEntry;
|
||||
+
|
||||
+typedef struct TdxFirmware {
|
||||
+ uint32_t nr_entries;
|
||||
+ TdxFirmwareEntry *entries;
|
||||
+} TdxFirmware;
|
||||
+
|
||||
+int tdvf_parse_metadata(TdxFirmware *fw, void *flash_ptr, int size);
|
||||
+
|
||||
+#endif /* HW_I386_TDVF_H */
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,106 @@
|
||||
From 62fd2fea6ebca35e3bd12685ce5b10635375968b Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:25:28 +0200
|
||||
Subject: [PATCH 053/115] i386/tdx: Add TDVF memory via KVM_TDX_INIT_MEM_REGION
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [53/115] 44c8cbffafa5b307c5e28c6ad76abb496287cf47 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
TDVF firmware (CODE and VARS) needs to be copied to TD's private
|
||||
memory via KVM_TDX_INIT_MEM_REGION, as well as TD HOB and TEMP memory.
|
||||
|
||||
If the TDVF section has TDVF_SECTION_ATTRIBUTES_MR_EXTEND set in the
|
||||
flag, calling KVM_TDX_EXTEND_MEMORY to extend the measurement.
|
||||
|
||||
After populating the TDVF memory, the original image located in shared
|
||||
ramblock can be discarded.
|
||||
|
||||
Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-25-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit ebc2d2b497c59414ac3c91de32bc546d27940e74)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
Conflicts: system/ -> sysemu/,exec/
|
||||
---
|
||||
target/i386/kvm/tdx.c | 42 ++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 42 insertions(+)
|
||||
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index db5d58b600..8f0826ac11 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "qom/object_interfaces.h"
|
||||
#include "crypto/hash.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
+#include "exec/ramblock.h"
|
||||
|
||||
#include "hw/i386/e820_memory_layout.h"
|
||||
#include "hw/i386/tdvf.h"
|
||||
@@ -262,6 +263,9 @@ static void tdx_finalize_vm(Notifier *notifier, void *unused)
|
||||
{
|
||||
TdxFirmware *tdvf = &tdx_guest->tdvf;
|
||||
TdxFirmwareEntry *entry;
|
||||
+ RAMBlock *ram_block;
|
||||
+ Error *local_err = NULL;
|
||||
+ int r;
|
||||
|
||||
tdx_init_ram_entries();
|
||||
|
||||
@@ -297,6 +301,44 @@ static void tdx_finalize_vm(Notifier *notifier, void *unused)
|
||||
sizeof(TdxRamEntry), &tdx_ram_entry_compare);
|
||||
|
||||
tdvf_hob_create(tdx_guest, tdx_get_hob_entry(tdx_guest));
|
||||
+
|
||||
+ for_each_tdx_fw_entry(tdvf, entry) {
|
||||
+ struct kvm_tdx_init_mem_region region;
|
||||
+ uint32_t flags;
|
||||
+
|
||||
+ region = (struct kvm_tdx_init_mem_region) {
|
||||
+ .source_addr = (uint64_t)entry->mem_ptr,
|
||||
+ .gpa = entry->address,
|
||||
+ .nr_pages = entry->size >> 12,
|
||||
+ };
|
||||
+
|
||||
+ flags = entry->attributes & TDVF_SECTION_ATTRIBUTES_MR_EXTEND ?
|
||||
+ KVM_TDX_MEASURE_MEMORY_REGION : 0;
|
||||
+
|
||||
+ do {
|
||||
+ error_free(local_err);
|
||||
+ local_err = NULL;
|
||||
+ r = tdx_vcpu_ioctl(first_cpu, KVM_TDX_INIT_MEM_REGION, flags,
|
||||
+ ®ion, &local_err);
|
||||
+ } while (r == -EAGAIN || r == -EINTR);
|
||||
+ if (r < 0) {
|
||||
+ error_report_err(local_err);
|
||||
+ exit(1);
|
||||
+ }
|
||||
+
|
||||
+ if (entry->type == TDVF_SECTION_TYPE_TD_HOB ||
|
||||
+ entry->type == TDVF_SECTION_TYPE_TEMP_MEM) {
|
||||
+ qemu_ram_munmap(-1, entry->mem_ptr, entry->size);
|
||||
+ entry->mem_ptr = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * TDVF image has been copied into private region above via
|
||||
+ * KVM_MEMORY_MAPPING. It becomes useless.
|
||||
+ */
|
||||
+ ram_block = tdx_guest->tdvf_mr->ram_block;
|
||||
+ ram_block_discard_range(ram_block, 0, ram_block->max_length);
|
||||
}
|
||||
|
||||
static Notifier tdx_machine_done_notify = {
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,249 @@
|
||||
From 70f7099dfd895a7ffeee3f66e188c1853d3885d6 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
||||
Subject: [PATCH 074/115] i386/tdx: Add TDX fixed1 bits to supported CPUIDs
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [74/115] 81fb39c826363f892e46386883c69c0e862d7850 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
TDX architecture forcibly sets some CPUID bits for TD guest that VMM
|
||||
cannot disable it. They are fixed1 bits.
|
||||
|
||||
Fixed1 bits are not covered by tdx_caps.cpuid (which only contains the
|
||||
directly configurable bits), while fixed1 bits are supported for TD guest
|
||||
obviously.
|
||||
|
||||
Add fixed1 bits to tdx_supported_cpuid. Besides, set all the fixed1
|
||||
bits to the initial set of KVM's support since KVM might not report them
|
||||
as supported.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-46-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 0ba06e46d09b84a2cb97a268da5576aaca3a24ca)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.h | 2 +
|
||||
target/i386/kvm/kvm_i386.h | 7 ++
|
||||
target/i386/kvm/tdx.c | 134 +++++++++++++++++++++++++++++++++++++
|
||||
target/i386/sev.c | 8 ---
|
||||
4 files changed, 143 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index 601e828577..529f24df00 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -924,6 +924,8 @@ uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w);
|
||||
#define CPUID_7_0_EDX_FSRM (1U << 4)
|
||||
/* AVX512 Vector Pair Intersection to a Pair of Mask Registers */
|
||||
#define CPUID_7_0_EDX_AVX512_VP2INTERSECT (1U << 8)
|
||||
+ /* "md_clear" VERW clears CPU buffers */
|
||||
+#define CPUID_7_0_EDX_MD_CLEAR (1U << 10)
|
||||
/* SERIALIZE instruction */
|
||||
#define CPUID_7_0_EDX_SERIALIZE (1U << 14)
|
||||
/* TSX Suspend Load Address Tracking instruction */
|
||||
diff --git a/target/i386/kvm/kvm_i386.h b/target/i386/kvm/kvm_i386.h
|
||||
index 797610496a..f1d55d5b75 100644
|
||||
--- a/target/i386/kvm/kvm_i386.h
|
||||
+++ b/target/i386/kvm/kvm_i386.h
|
||||
@@ -44,6 +44,13 @@ void kvm_request_xsave_components(X86CPU *cpu, uint64_t mask);
|
||||
|
||||
#ifdef CONFIG_KVM
|
||||
|
||||
+#include <linux/kvm.h>
|
||||
+
|
||||
+typedef struct KvmCpuidInfo {
|
||||
+ struct kvm_cpuid2 cpuid;
|
||||
+ struct kvm_cpuid_entry2 entries[KVM_MAX_CPUID_ENTRIES];
|
||||
+} KvmCpuidInfo;
|
||||
+
|
||||
bool kvm_is_vm_type_supported(int type);
|
||||
bool kvm_has_adjust_clock_stable(void);
|
||||
bool kvm_has_exception_payload(void);
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index 4949d01f22..6fa30c3ec4 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -367,6 +367,133 @@ static Notifier tdx_machine_done_notify = {
|
||||
.notify = tdx_finalize_vm,
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * Some CPUID bits change from fixed1 to configurable bits when TDX module
|
||||
+ * supports TDX_FEATURES0.VE_REDUCTION. e.g., MCA/MCE/MTRR/CORE_CAPABILITY.
|
||||
+ *
|
||||
+ * To make QEMU work with all the versions of TDX module, keep the fixed1 bits
|
||||
+ * here if they are ever fixed1 bits in any of the version though not fixed1 in
|
||||
+ * the latest version. Otherwise, with the older version of TDX module, QEMU may
|
||||
+ * treat the fixed1 bit as unsupported.
|
||||
+ *
|
||||
+ * For newer TDX module, it does no harm to keep them in tdx_fixed1_bits even
|
||||
+ * though they changed to configurable bits. Because tdx_fixed1_bits is used to
|
||||
+ * setup the supported bits.
|
||||
+ */
|
||||
+KvmCpuidInfo tdx_fixed1_bits = {
|
||||
+ .cpuid.nent = 8,
|
||||
+ .entries[0] = {
|
||||
+ .function = 0x1,
|
||||
+ .index = 0,
|
||||
+ .ecx = CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_DTES64 |
|
||||
+ CPUID_EXT_DSCPL | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 |
|
||||
+ CPUID_EXT_PDCM | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
|
||||
+ CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
|
||||
+ CPUID_EXT_POPCNT | CPUID_EXT_AES | CPUID_EXT_XSAVE |
|
||||
+ CPUID_EXT_RDRAND | CPUID_EXT_HYPERVISOR,
|
||||
+ .edx = CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
|
||||
+ CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
|
||||
+ CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
|
||||
+ CPUID_PAT | CPUID_CLFLUSH | CPUID_DTS | CPUID_MMX | CPUID_FXSR |
|
||||
+ CPUID_SSE | CPUID_SSE2,
|
||||
+ },
|
||||
+ .entries[1] = {
|
||||
+ .function = 0x6,
|
||||
+ .index = 0,
|
||||
+ .eax = CPUID_6_EAX_ARAT,
|
||||
+ },
|
||||
+ .entries[2] = {
|
||||
+ .function = 0x7,
|
||||
+ .index = 0,
|
||||
+ .flags = KVM_CPUID_FLAG_SIGNIFCANT_INDEX,
|
||||
+ .ebx = CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_FDP_EXCPTN_ONLY |
|
||||
+ CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_INVPCID |
|
||||
+ CPUID_7_0_EBX_ZERO_FCS_FDS | CPUID_7_0_EBX_RDSEED |
|
||||
+ CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
|
||||
+ CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_SHA_NI,
|
||||
+ .ecx = CPUID_7_0_ECX_BUS_LOCK_DETECT | CPUID_7_0_ECX_MOVDIRI |
|
||||
+ CPUID_7_0_ECX_MOVDIR64B,
|
||||
+ .edx = CPUID_7_0_EDX_MD_CLEAR | CPUID_7_0_EDX_SPEC_CTRL |
|
||||
+ CPUID_7_0_EDX_STIBP | CPUID_7_0_EDX_FLUSH_L1D |
|
||||
+ CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_CORE_CAPABILITY |
|
||||
+ CPUID_7_0_EDX_SPEC_CTRL_SSBD,
|
||||
+ },
|
||||
+ .entries[3] = {
|
||||
+ .function = 0x7,
|
||||
+ .index = 2,
|
||||
+ .flags = KVM_CPUID_FLAG_SIGNIFCANT_INDEX,
|
||||
+ .edx = CPUID_7_2_EDX_PSFD | CPUID_7_2_EDX_IPRED_CTRL |
|
||||
+ CPUID_7_2_EDX_RRSBA_CTRL | CPUID_7_2_EDX_BHI_CTRL,
|
||||
+ },
|
||||
+ .entries[4] = {
|
||||
+ .function = 0xD,
|
||||
+ .index = 0,
|
||||
+ .flags = KVM_CPUID_FLAG_SIGNIFCANT_INDEX,
|
||||
+ .eax = XSTATE_FP_MASK | XSTATE_SSE_MASK,
|
||||
+ },
|
||||
+ .entries[5] = {
|
||||
+ .function = 0xD,
|
||||
+ .index = 1,
|
||||
+ .flags = KVM_CPUID_FLAG_SIGNIFCANT_INDEX,
|
||||
+ .eax = CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC|
|
||||
+ CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
|
||||
+ },
|
||||
+ .entries[6] = {
|
||||
+ .function = 0x80000001,
|
||||
+ .index = 0,
|
||||
+ .ecx = CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
|
||||
+ /*
|
||||
+ * Strictly speaking, SYSCALL is not fixed1 bit since it depends on
|
||||
+ * the CPU to be in 64-bit mode. But here fixed1 is used to serve the
|
||||
+ * purpose of supported bits for TDX. In this sense, SYACALL is always
|
||||
+ * supported.
|
||||
+ */
|
||||
+ .edx = CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
|
||||
+ CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
|
||||
+ },
|
||||
+ .entries[7] = {
|
||||
+ .function = 0x80000007,
|
||||
+ .index = 0,
|
||||
+ .edx = CPUID_APM_INVTSC,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct kvm_cpuid_entry2 *find_in_supported_entry(uint32_t function,
|
||||
+ uint32_t index)
|
||||
+{
|
||||
+ struct kvm_cpuid_entry2 *e;
|
||||
+
|
||||
+ e = cpuid_find_entry(tdx_supported_cpuid, function, index);
|
||||
+ if (!e) {
|
||||
+ if (tdx_supported_cpuid->nent >= KVM_MAX_CPUID_ENTRIES) {
|
||||
+ error_report("tdx_supported_cpuid requries more space than %d entries",
|
||||
+ KVM_MAX_CPUID_ENTRIES);
|
||||
+ exit(1);
|
||||
+ }
|
||||
+ e = &tdx_supported_cpuid->entries[tdx_supported_cpuid->nent++];
|
||||
+ e->function = function;
|
||||
+ e->index = index;
|
||||
+ }
|
||||
+
|
||||
+ return e;
|
||||
+}
|
||||
+
|
||||
+static void tdx_add_supported_cpuid_by_fixed1_bits(void)
|
||||
+{
|
||||
+ struct kvm_cpuid_entry2 *e, *e1;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < tdx_fixed1_bits.cpuid.nent; i++) {
|
||||
+ e = &tdx_fixed1_bits.entries[i];
|
||||
+
|
||||
+ e1 = find_in_supported_entry(e->function, e->index);
|
||||
+ e1->eax |= e->eax;
|
||||
+ e1->ebx |= e->ebx;
|
||||
+ e1->ecx |= e->ecx;
|
||||
+ e1->edx |= e->edx;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void tdx_setup_supported_cpuid(void)
|
||||
{
|
||||
if (tdx_supported_cpuid) {
|
||||
@@ -379,6 +506,8 @@ static void tdx_setup_supported_cpuid(void)
|
||||
memcpy(tdx_supported_cpuid->entries, tdx_caps->cpuid.entries,
|
||||
tdx_caps->cpuid.nent * sizeof(struct kvm_cpuid_entry2));
|
||||
tdx_supported_cpuid->nent = tdx_caps->cpuid.nent;
|
||||
+
|
||||
+ tdx_add_supported_cpuid_by_fixed1_bits();
|
||||
}
|
||||
|
||||
static int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
||||
@@ -463,6 +592,11 @@ static uint32_t tdx_adjust_cpuid_features(X86ConfidentialGuest *cg,
|
||||
{
|
||||
struct kvm_cpuid_entry2 *e;
|
||||
|
||||
+ e = cpuid_find_entry(&tdx_fixed1_bits.cpuid, feature, index);
|
||||
+ if (e) {
|
||||
+ value |= cpuid_entry_get_reg(e, reg);
|
||||
+ }
|
||||
+
|
||||
if (is_feature_word_cpuid(feature, index, reg)) {
|
||||
e = cpuid_find_entry(tdx_supported_cpuid, feature, index);
|
||||
if (e) {
|
||||
diff --git a/target/i386/sev.c b/target/i386/sev.c
|
||||
index 24fcd078fc..edbad9bb92 100644
|
||||
--- a/target/i386/sev.c
|
||||
+++ b/target/i386/sev.c
|
||||
@@ -211,14 +211,6 @@ static const char *const sev_fw_errlist[] = {
|
||||
|
||||
#define SEV_FW_MAX_ERROR ARRAY_SIZE(sev_fw_errlist)
|
||||
|
||||
-/* <linux/kvm.h> doesn't expose this, so re-use the max from kvm.c */
|
||||
-#define KVM_MAX_CPUID_ENTRIES 100
|
||||
-
|
||||
-typedef struct KvmCpuidInfo {
|
||||
- struct kvm_cpuid2 cpuid;
|
||||
- struct kvm_cpuid_entry2 entries[KVM_MAX_CPUID_ENTRIES];
|
||||
-} KvmCpuidInfo;
|
||||
-
|
||||
#define SNP_CPUID_FUNCTION_MAXCOUNT 64
|
||||
#define SNP_CPUID_FUNCTION_UNKNOWN 0xFFFFFFFF
|
||||
|
||||
--
|
||||
2.50.1
|
||||
|
||||
60
SOURCES/kvm-i386-tdx-Add-XFD-to-supported-bit-of-TDX.patch
Normal file
60
SOURCES/kvm-i386-tdx-Add-XFD-to-supported-bit-of-TDX.patch
Normal file
@ -0,0 +1,60 @@
|
||||
From 2c833c9f0b720bcf4267f9025344586b4eaa4906 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
||||
Subject: [PATCH 077/115] i386/tdx: Add XFD to supported bit of TDX
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [77/115] 12485d15d9f665ad75d51f92380997df371180e4 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Just mark XFD as always supported for TDX. This simple solution relies
|
||||
on the fact KVM will report XFD as 0 when it's not supported by the
|
||||
hardware.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-49-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 9f5771c57dbe92d46361afd992a5851c846d0322)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.h | 1 +
|
||||
target/i386/kvm/tdx.c | 6 ++++++
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index 3a7a409809..19645eb6f8 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -1100,6 +1100,7 @@ uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w);
|
||||
#define CPUID_XSAVE_XSAVEC (1U << 1)
|
||||
#define CPUID_XSAVE_XGETBV1 (1U << 2)
|
||||
#define CPUID_XSAVE_XSAVES (1U << 3)
|
||||
+#define CPUID_XSAVE_XFD (1U << 4)
|
||||
|
||||
#define CPUID_6_EAX_ARAT (1U << 2)
|
||||
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index feb9cd7466..f15ed51a32 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -621,6 +621,12 @@ static void tdx_add_supported_cpuid_by_xfam(void)
|
||||
e->edx |= (tdx_caps->supported_xfam & CPUID_XSTATE_XCR0_MASK) >> 32;
|
||||
|
||||
e = find_in_supported_entry(0xd, 1);
|
||||
+ /*
|
||||
+ * Mark XFD always support for TDX, it will be cleared finally in
|
||||
+ * tdx_adjust_cpuid_features() if XFD is unavailable on the hardware
|
||||
+ * because in this case the original data has it as 0.
|
||||
+ */
|
||||
+ e->eax |= CPUID_XSAVE_XFD;
|
||||
e->ecx |= (tdx_caps->supported_xfam & CPUID_XSTATE_XSS_MASK);
|
||||
e->edx |= (tdx_caps->supported_xfam & CPUID_XSTATE_XSS_MASK) >> 32;
|
||||
}
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,113 @@
|
||||
From b62e9f0a875520807daa28d0b808e2ba9d96ca79 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:46 +0200
|
||||
Subject: [PATCH 038/115] i386/tdx: Add property sept-ve-disable for tdx-guest
|
||||
object
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [38/115] 3a21966b474dde36a34aa215e45262ba83a809ac (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Bit 28 of TD attribute, named SEPT_VE_DISABLE. When set to 1, it disables
|
||||
EPT violation conversion to #VE on guest TD access of PENDING pages.
|
||||
|
||||
Some guest OS (e.g., Linux TD guest) may require this bit as 1.
|
||||
Otherwise refuse to boot.
|
||||
|
||||
Add sept-ve-disable property for tdx-guest object, for user to configure
|
||||
this bit.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Acked-by: Markus Armbruster <armbru@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-10-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 6016e2972d94c90307b6caf55a8e3aee5424c09b)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
qapi/qom.json | 8 +++++++-
|
||||
target/i386/kvm/tdx.c | 23 +++++++++++++++++++++++
|
||||
2 files changed, 30 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/qapi/qom.json b/qapi/qom.json
|
||||
index 530efeb7c5..fefb54f90b 100644
|
||||
--- a/qapi/qom.json
|
||||
+++ b/qapi/qom.json
|
||||
@@ -1016,10 +1016,16 @@
|
||||
# @attributes: The 'attributes' of a TD guest that is passed to
|
||||
# KVM_TDX_INIT_VM
|
||||
#
|
||||
+# @sept-ve-disable: toggle bit 28 of TD attributes to control disabling
|
||||
+# of EPT violation conversion to #VE on guest TD access of PENDING
|
||||
+# pages. Some guest OS (e.g., Linux TD guest) may require this to
|
||||
+# be set, otherwise they refuse to boot.
|
||||
+#
|
||||
# Since: 10.1
|
||||
##
|
||||
{ 'struct': 'TdxGuestProperties',
|
||||
- 'data': { '*attributes': 'uint64' } }
|
||||
+ 'data': { '*attributes': 'uint64',
|
||||
+ '*sept-ve-disable': 'bool' } }
|
||||
|
||||
##
|
||||
# @ThreadContextProperties:
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index 8f02c76249..370bd86f2c 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -18,6 +18,8 @@
|
||||
#include "kvm_i386.h"
|
||||
#include "tdx.h"
|
||||
|
||||
+#define TDX_TD_ATTRIBUTES_SEPT_VE_DISABLE BIT_ULL(28)
|
||||
+
|
||||
static TdxGuest *tdx_guest;
|
||||
|
||||
static struct kvm_tdx_capabilities *tdx_caps;
|
||||
@@ -252,6 +254,24 @@ int tdx_pre_create_vcpu(CPUState *cpu, Error **errp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static bool tdx_guest_get_sept_ve_disable(Object *obj, Error **errp)
|
||||
+{
|
||||
+ TdxGuest *tdx = TDX_GUEST(obj);
|
||||
+
|
||||
+ return !!(tdx->attributes & TDX_TD_ATTRIBUTES_SEPT_VE_DISABLE);
|
||||
+}
|
||||
+
|
||||
+static void tdx_guest_set_sept_ve_disable(Object *obj, bool value, Error **errp)
|
||||
+{
|
||||
+ TdxGuest *tdx = TDX_GUEST(obj);
|
||||
+
|
||||
+ if (value) {
|
||||
+ tdx->attributes |= TDX_TD_ATTRIBUTES_SEPT_VE_DISABLE;
|
||||
+ } else {
|
||||
+ tdx->attributes &= ~TDX_TD_ATTRIBUTES_SEPT_VE_DISABLE;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/* tdx guest */
|
||||
OBJECT_DEFINE_TYPE_WITH_INTERFACES(TdxGuest,
|
||||
tdx_guest,
|
||||
@@ -272,6 +292,9 @@ static void tdx_guest_init(Object *obj)
|
||||
|
||||
object_property_add_uint64_ptr(obj, "attributes", &tdx->attributes,
|
||||
OBJ_PROP_FLAG_READWRITE);
|
||||
+ object_property_add_bool(obj, "sept-ve-disable",
|
||||
+ tdx_guest_get_sept_ve_disable,
|
||||
+ tdx_guest_set_sept_ve_disable);
|
||||
}
|
||||
|
||||
static void tdx_guest_finalize(Object *obj)
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,144 @@
|
||||
From d228f2ad7fb96be3ec1fa3256ee0404cf7e2b094 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
||||
Subject: [PATCH 075/115] i386/tdx: Add supported CPUID bits related to TD
|
||||
Attributes
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [75/115] 095f42329711d2cb7f147856ebf2775a522fd8e3 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
For TDX, some CPUID feature bit is configured via TD attributes. They
|
||||
are not covered by tdx_caps.cpuid (which only contians the directly
|
||||
configurable CPUID bits), but they are actually supported when the
|
||||
related attributre bit is supported.
|
||||
|
||||
Note, LASS and KeyLocker are not supported by KVM for TDX, nor does
|
||||
QEMU support it (see TDX_SUPPORTED_TD_ATTRS). They are defined in
|
||||
tdx_attrs_maps[] for the completeness of the existing TD Attribute
|
||||
bits that are related with CPUID features.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-47-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 31df29c532a9ef473c6efd497950a620099bf1da)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.h | 4 +++
|
||||
target/i386/kvm/tdx.c | 60 +++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 64 insertions(+)
|
||||
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index 529f24df00..e02cb75619 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -903,6 +903,8 @@ uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w);
|
||||
#define CPUID_7_0_ECX_LA57 (1U << 16)
|
||||
/* Read Processor ID */
|
||||
#define CPUID_7_0_ECX_RDPID (1U << 22)
|
||||
+/* KeyLocker */
|
||||
+#define CPUID_7_0_ECX_KeyLocker (1U << 23)
|
||||
/* Bus Lock Debug Exception */
|
||||
#define CPUID_7_0_ECX_BUS_LOCK_DETECT (1U << 24)
|
||||
/* Cache Line Demote Instruction */
|
||||
@@ -963,6 +965,8 @@ uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w);
|
||||
#define CPUID_7_1_EAX_AVX_VNNI (1U << 4)
|
||||
/* AVX512 BFloat16 Instruction */
|
||||
#define CPUID_7_1_EAX_AVX512_BF16 (1U << 5)
|
||||
+/* Linear address space separation */
|
||||
+#define CPUID_7_1_EAX_LASS (1U << 6)
|
||||
/* CMPCCXADD Instructions */
|
||||
#define CPUID_7_1_EAX_CMPCCXADD (1U << 7)
|
||||
/* Fast Zero REP MOVS */
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index 6fa30c3ec4..60dd239c05 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -458,6 +458,34 @@ KvmCpuidInfo tdx_fixed1_bits = {
|
||||
},
|
||||
};
|
||||
|
||||
+typedef struct TdxAttrsMap {
|
||||
+ uint32_t attr_index;
|
||||
+ uint32_t cpuid_leaf;
|
||||
+ uint32_t cpuid_subleaf;
|
||||
+ int cpuid_reg;
|
||||
+ uint32_t feat_mask;
|
||||
+} TdxAttrsMap;
|
||||
+
|
||||
+static TdxAttrsMap tdx_attrs_maps[] = {
|
||||
+ {.attr_index = 27,
|
||||
+ .cpuid_leaf = 7,
|
||||
+ .cpuid_subleaf = 1,
|
||||
+ .cpuid_reg = R_EAX,
|
||||
+ .feat_mask = CPUID_7_1_EAX_LASS,},
|
||||
+
|
||||
+ {.attr_index = 30,
|
||||
+ .cpuid_leaf = 7,
|
||||
+ .cpuid_subleaf = 0,
|
||||
+ .cpuid_reg = R_ECX,
|
||||
+ .feat_mask = CPUID_7_0_ECX_PKS,},
|
||||
+
|
||||
+ {.attr_index = 31,
|
||||
+ .cpuid_leaf = 7,
|
||||
+ .cpuid_subleaf = 0,
|
||||
+ .cpuid_reg = R_ECX,
|
||||
+ .feat_mask = CPUID_7_0_ECX_KeyLocker,},
|
||||
+};
|
||||
+
|
||||
static struct kvm_cpuid_entry2 *find_in_supported_entry(uint32_t function,
|
||||
uint32_t index)
|
||||
{
|
||||
@@ -494,6 +522,37 @@ static void tdx_add_supported_cpuid_by_fixed1_bits(void)
|
||||
}
|
||||
}
|
||||
|
||||
+static void tdx_add_supported_cpuid_by_attrs(void)
|
||||
+{
|
||||
+ struct kvm_cpuid_entry2 *e;
|
||||
+ TdxAttrsMap *map;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(tdx_attrs_maps); i++) {
|
||||
+ map = &tdx_attrs_maps[i];
|
||||
+ if (!((1ULL << map->attr_index) & tdx_caps->supported_attrs)) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ e = find_in_supported_entry(map->cpuid_leaf, map->cpuid_subleaf);
|
||||
+
|
||||
+ switch(map->cpuid_reg) {
|
||||
+ case R_EAX:
|
||||
+ e->eax |= map->feat_mask;
|
||||
+ break;
|
||||
+ case R_EBX:
|
||||
+ e->ebx |= map->feat_mask;
|
||||
+ break;
|
||||
+ case R_ECX:
|
||||
+ e->ecx |= map->feat_mask;
|
||||
+ break;
|
||||
+ case R_EDX:
|
||||
+ e->edx |= map->feat_mask;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void tdx_setup_supported_cpuid(void)
|
||||
{
|
||||
if (tdx_supported_cpuid) {
|
||||
@@ -508,6 +567,7 @@ static void tdx_setup_supported_cpuid(void)
|
||||
tdx_supported_cpuid->nent = tdx_caps->cpuid.nent;
|
||||
|
||||
tdx_add_supported_cpuid_by_fixed1_bits();
|
||||
+ tdx_add_supported_cpuid_by_attrs();
|
||||
}
|
||||
|
||||
static int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,220 @@
|
||||
From 714abb122a2cc4819b05a3893dfd2c61a9204c5e Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
||||
Subject: [PATCH 076/115] i386/tdx: Add supported CPUID bits relates to XFAM
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [76/115] 459d99074c90bfd8048585dec42749cb18493ee9 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Some CPUID bits are controlled by XFAM. They are not covered by
|
||||
tdx_caps.cpuid (which only contians the directly configurable bits), but
|
||||
they are actually supported when the related XFAM bit is supported.
|
||||
|
||||
Add these XFAM controlled bits to TDX supported CPUID bits based on the
|
||||
supported_xfam.
|
||||
|
||||
Besides, incorporate the supported_xfam into the supported CPUID leaf of
|
||||
0xD.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-48-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 8c94c84cb9e0140b48acc9c9d404525ca7ef7457)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/cpu.c | 12 -------
|
||||
target/i386/cpu.h | 16 ++++++++++
|
||||
target/i386/kvm/tdx.c | 73 +++++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 89 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 2da456da64..cd6d9e8c1c 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -1660,15 +1660,6 @@ bool is_feature_word_cpuid(uint32_t feature, uint32_t index, int reg)
|
||||
return false;
|
||||
}
|
||||
|
||||
-typedef struct FeatureMask {
|
||||
- FeatureWord index;
|
||||
- uint64_t mask;
|
||||
-} FeatureMask;
|
||||
-
|
||||
-typedef struct FeatureDep {
|
||||
- FeatureMask from, to;
|
||||
-} FeatureDep;
|
||||
-
|
||||
static FeatureDep feature_dependencies[] = {
|
||||
{
|
||||
.from = { FEAT_7_0_EDX, CPUID_7_0_EDX_ARCH_CAPABILITIES },
|
||||
@@ -1837,9 +1828,6 @@ static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = {
|
||||
};
|
||||
#undef REGISTER
|
||||
|
||||
-/* CPUID feature bits available in XSS */
|
||||
-#define CPUID_XSTATE_XSS_MASK (XSTATE_ARCH_LBR_MASK)
|
||||
-
|
||||
ExtSaveArea x86_ext_save_areas[XSAVE_STATE_AREA_COUNT] = {
|
||||
[XSTATE_FP_BIT] = {
|
||||
/* x87 FP state component is always enabled if XSAVE is supported */
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index e02cb75619..3a7a409809 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -589,6 +589,7 @@ typedef enum X86Seg {
|
||||
#define XSTATE_OPMASK_BIT 5
|
||||
#define XSTATE_ZMM_Hi256_BIT 6
|
||||
#define XSTATE_Hi16_ZMM_BIT 7
|
||||
+#define XSTATE_PT_BIT 8
|
||||
#define XSTATE_PKRU_BIT 9
|
||||
#define XSTATE_ARCH_LBR_BIT 15
|
||||
#define XSTATE_XTILE_CFG_BIT 17
|
||||
@@ -602,6 +603,7 @@ typedef enum X86Seg {
|
||||
#define XSTATE_OPMASK_MASK (1ULL << XSTATE_OPMASK_BIT)
|
||||
#define XSTATE_ZMM_Hi256_MASK (1ULL << XSTATE_ZMM_Hi256_BIT)
|
||||
#define XSTATE_Hi16_ZMM_MASK (1ULL << XSTATE_Hi16_ZMM_BIT)
|
||||
+#define XSTATE_PT_MASK (1ULL << XSTATE_PT_BIT)
|
||||
#define XSTATE_PKRU_MASK (1ULL << XSTATE_PKRU_BIT)
|
||||
#define XSTATE_ARCH_LBR_MASK (1ULL << XSTATE_ARCH_LBR_BIT)
|
||||
#define XSTATE_XTILE_CFG_MASK (1ULL << XSTATE_XTILE_CFG_BIT)
|
||||
@@ -624,6 +626,11 @@ typedef enum X86Seg {
|
||||
XSTATE_Hi16_ZMM_MASK | XSTATE_PKRU_MASK | \
|
||||
XSTATE_XTILE_CFG_MASK | XSTATE_XTILE_DATA_MASK)
|
||||
|
||||
+/* CPUID feature bits available in XSS */
|
||||
+#define CPUID_XSTATE_XSS_MASK (XSTATE_ARCH_LBR_MASK)
|
||||
+
|
||||
+#define CPUID_XSTATE_MASK (CPUID_XSTATE_XCR0_MASK | CPUID_XSTATE_XSS_MASK)
|
||||
+
|
||||
/* CPUID feature words */
|
||||
typedef enum FeatureWord {
|
||||
FEAT_1_EDX, /* CPUID[1].EDX */
|
||||
@@ -671,6 +678,15 @@ typedef enum FeatureWord {
|
||||
FEATURE_WORDS,
|
||||
} FeatureWord;
|
||||
|
||||
+typedef struct FeatureMask {
|
||||
+ FeatureWord index;
|
||||
+ uint64_t mask;
|
||||
+} FeatureMask;
|
||||
+
|
||||
+typedef struct FeatureDep {
|
||||
+ FeatureMask from, to;
|
||||
+} FeatureDep;
|
||||
+
|
||||
typedef uint64_t FeatureWordArray[FEATURE_WORDS];
|
||||
uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w);
|
||||
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index 60dd239c05..feb9cd7466 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -23,6 +23,8 @@
|
||||
|
||||
#include <linux/kvm_para.h>
|
||||
|
||||
+#include "cpu.h"
|
||||
+#include "cpu-internal.h"
|
||||
#include "hw/i386/e820_memory_layout.h"
|
||||
#include "hw/i386/tdvf.h"
|
||||
#include "hw/i386/x86.h"
|
||||
@@ -486,6 +488,32 @@ static TdxAttrsMap tdx_attrs_maps[] = {
|
||||
.feat_mask = CPUID_7_0_ECX_KeyLocker,},
|
||||
};
|
||||
|
||||
+typedef struct TdxXFAMDep {
|
||||
+ int xfam_bit;
|
||||
+ FeatureMask feat_mask;
|
||||
+} TdxXFAMDep;
|
||||
+
|
||||
+/*
|
||||
+ * Note, only the CPUID bits whose virtualization type are "XFAM & Native" are
|
||||
+ * defiend here.
|
||||
+ *
|
||||
+ * For those whose virtualization type are "XFAM & Configured & Native", they
|
||||
+ * are reported as configurable bits. And they are not supported if not in the
|
||||
+ * configureable bits list from KVM even if the corresponding XFAM bit is
|
||||
+ * supported.
|
||||
+ */
|
||||
+TdxXFAMDep tdx_xfam_deps[] = {
|
||||
+ { XSTATE_YMM_BIT, { FEAT_1_ECX, CPUID_EXT_FMA }},
|
||||
+ { XSTATE_YMM_BIT, { FEAT_7_0_EBX, CPUID_7_0_EBX_AVX2 }},
|
||||
+ { XSTATE_OPMASK_BIT, { FEAT_7_0_ECX, CPUID_7_0_ECX_AVX512_VBMI}},
|
||||
+ { XSTATE_OPMASK_BIT, { FEAT_7_0_EDX, CPUID_7_0_EDX_AVX512_FP16}},
|
||||
+ { XSTATE_PT_BIT, { FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT}},
|
||||
+ { XSTATE_PKRU_BIT, { FEAT_7_0_ECX, CPUID_7_0_ECX_PKU}},
|
||||
+ { XSTATE_XTILE_CFG_BIT, { FEAT_7_0_EDX, CPUID_7_0_EDX_AMX_BF16 }},
|
||||
+ { XSTATE_XTILE_CFG_BIT, { FEAT_7_0_EDX, CPUID_7_0_EDX_AMX_TILE }},
|
||||
+ { XSTATE_XTILE_CFG_BIT, { FEAT_7_0_EDX, CPUID_7_0_EDX_AMX_INT8 }},
|
||||
+};
|
||||
+
|
||||
static struct kvm_cpuid_entry2 *find_in_supported_entry(uint32_t function,
|
||||
uint32_t index)
|
||||
{
|
||||
@@ -553,6 +581,50 @@ static void tdx_add_supported_cpuid_by_attrs(void)
|
||||
}
|
||||
}
|
||||
|
||||
+static void tdx_add_supported_cpuid_by_xfam(void)
|
||||
+{
|
||||
+ struct kvm_cpuid_entry2 *e;
|
||||
+ int i;
|
||||
+
|
||||
+ const TdxXFAMDep *xfam_dep;
|
||||
+ const FeatureWordInfo *f;
|
||||
+ for (i = 0; i < ARRAY_SIZE(tdx_xfam_deps); i++) {
|
||||
+ xfam_dep = &tdx_xfam_deps[i];
|
||||
+ if (!((1ULL << xfam_dep->xfam_bit) & tdx_caps->supported_xfam)) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ f = &feature_word_info[xfam_dep->feat_mask.index];
|
||||
+ if (f->type != CPUID_FEATURE_WORD) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ e = find_in_supported_entry(f->cpuid.eax, f->cpuid.ecx);
|
||||
+ switch(f->cpuid.reg) {
|
||||
+ case R_EAX:
|
||||
+ e->eax |= xfam_dep->feat_mask.mask;
|
||||
+ break;
|
||||
+ case R_EBX:
|
||||
+ e->ebx |= xfam_dep->feat_mask.mask;
|
||||
+ break;
|
||||
+ case R_ECX:
|
||||
+ e->ecx |= xfam_dep->feat_mask.mask;
|
||||
+ break;
|
||||
+ case R_EDX:
|
||||
+ e->edx |= xfam_dep->feat_mask.mask;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ e = find_in_supported_entry(0xd, 0);
|
||||
+ e->eax |= (tdx_caps->supported_xfam & CPUID_XSTATE_XCR0_MASK);
|
||||
+ e->edx |= (tdx_caps->supported_xfam & CPUID_XSTATE_XCR0_MASK) >> 32;
|
||||
+
|
||||
+ e = find_in_supported_entry(0xd, 1);
|
||||
+ e->ecx |= (tdx_caps->supported_xfam & CPUID_XSTATE_XSS_MASK);
|
||||
+ e->edx |= (tdx_caps->supported_xfam & CPUID_XSTATE_XSS_MASK) >> 32;
|
||||
+}
|
||||
+
|
||||
static void tdx_setup_supported_cpuid(void)
|
||||
{
|
||||
if (tdx_supported_cpuid) {
|
||||
@@ -568,6 +640,7 @@ static void tdx_setup_supported_cpuid(void)
|
||||
|
||||
tdx_add_supported_cpuid_by_fixed1_bits();
|
||||
tdx_add_supported_cpuid_by_attrs();
|
||||
+ tdx_add_supported_cpuid_by_xfam();
|
||||
}
|
||||
|
||||
static int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,66 @@
|
||||
From 8d316b8468ec2e87ffc2e75c422698a2acdbcd16 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:46 +0200
|
||||
Subject: [PATCH 054/115] i386/tdx: Call KVM_TDX_INIT_VCPU to initialize TDX
|
||||
vcpu
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [54/115] 01b560fa024020f7be4e649cabd47f9f6bca920a (bonzini/rhel-qemu-kvm)
|
||||
|
||||
TDX vcpu needs to be initialized by SEAMCALL(TDH.VP.INIT) and KVM
|
||||
provides vcpu level IOCTL KVM_TDX_INIT_VCPU for it.
|
||||
|
||||
KVM_TDX_INIT_VCPU needs the address of the HOB as input. Invoke it for
|
||||
each vcpu after HOB list is created.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-26-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 41f7fd22073561a23229c0479d9d708dee9d3a1e)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/kvm/tdx.c | 14 ++++++++++++++
|
||||
1 file changed, 14 insertions(+)
|
||||
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index 8f0826ac11..7980daf8c4 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -259,6 +259,18 @@ static void tdx_init_ram_entries(void)
|
||||
tdx_guest->nr_ram_entries = j;
|
||||
}
|
||||
|
||||
+static void tdx_post_init_vcpus(void)
|
||||
+{
|
||||
+ TdxFirmwareEntry *hob;
|
||||
+ CPUState *cpu;
|
||||
+
|
||||
+ hob = tdx_get_hob_entry(tdx_guest);
|
||||
+ CPU_FOREACH(cpu) {
|
||||
+ tdx_vcpu_ioctl(cpu, KVM_TDX_INIT_VCPU, 0, (void *)hob->address,
|
||||
+ &error_fatal);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void tdx_finalize_vm(Notifier *notifier, void *unused)
|
||||
{
|
||||
TdxFirmware *tdvf = &tdx_guest->tdvf;
|
||||
@@ -302,6 +314,8 @@ static void tdx_finalize_vm(Notifier *notifier, void *unused)
|
||||
|
||||
tdvf_hob_create(tdx_guest, tdx_get_hob_entry(tdx_guest));
|
||||
|
||||
+ tdx_post_init_vcpus();
|
||||
+
|
||||
for_each_tdx_fw_entry(tdvf, entry) {
|
||||
struct kvm_tdx_init_mem_region region;
|
||||
uint32_t flags;
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,75 @@
|
||||
From 7dd643f8005449c3e34643f2cb85fcbab8011482 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:49 +0200
|
||||
Subject: [PATCH 091/115] i386/tdx: Clarify the error message of
|
||||
mrconfigid/mrowner/mrownerconfig
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [91/115] 5f8559f8d9f842f79916f49f4806dd4cf2f8c686 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
The error message is misleading - we successfully decoded the data,
|
||||
the decoded data was simply with the wrong length.
|
||||
|
||||
Change the error message to show it is an length check failure with both
|
||||
the received and expected values.
|
||||
|
||||
Suggested-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
||||
Link: https://lore.kernel.org/r/20250603050305.1704586-4-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 41cd354d350d3c64915be9c5decbf20abd84e486)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/kvm/tdx.c | 12 +++++++++---
|
||||
1 file changed, 9 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index ca3641441c..ed3a55991a 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -1032,7 +1032,9 @@ int tdx_pre_create_vcpu(CPUState *cpu, Error **errp)
|
||||
return -1;
|
||||
}
|
||||
if (data_len != QCRYPTO_HASH_DIGEST_LEN_SHA384) {
|
||||
- error_setg(errp, "TDX: failed to decode mrconfigid");
|
||||
+ error_setg(errp, "TDX 'mrconfigid' sha384 digest was %ld bytes, "
|
||||
+ "expected %d bytes", data_len,
|
||||
+ QCRYPTO_HASH_DIGEST_LEN_SHA384);
|
||||
return -1;
|
||||
}
|
||||
memcpy(init_vm->mrconfigid, data, data_len);
|
||||
@@ -1045,7 +1047,9 @@ int tdx_pre_create_vcpu(CPUState *cpu, Error **errp)
|
||||
return -1;
|
||||
}
|
||||
if (data_len != QCRYPTO_HASH_DIGEST_LEN_SHA384) {
|
||||
- error_setg(errp, "TDX: failed to decode mrowner");
|
||||
+ error_setg(errp, "TDX 'mrowner' sha384 digest was %ld bytes, "
|
||||
+ "expected %d bytes", data_len,
|
||||
+ QCRYPTO_HASH_DIGEST_LEN_SHA384);
|
||||
return -1;
|
||||
}
|
||||
memcpy(init_vm->mrowner, data, data_len);
|
||||
@@ -1058,7 +1062,9 @@ int tdx_pre_create_vcpu(CPUState *cpu, Error **errp)
|
||||
return -1;
|
||||
}
|
||||
if (data_len != QCRYPTO_HASH_DIGEST_LEN_SHA384) {
|
||||
- error_setg(errp, "TDX: failed to decode mrownerconfig");
|
||||
+ error_setg(errp, "TDX 'mrownerconfig' sha384 digest was %ld bytes, "
|
||||
+ "expected %d bytes", data_len,
|
||||
+ QCRYPTO_HASH_DIGEST_LEN_SHA384);
|
||||
return -1;
|
||||
}
|
||||
memcpy(init_vm->mrownerconfig, data, data_len);
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,80 @@
|
||||
From 25f3b21b6b1654d1ffde72e231a4635b5929a6a8 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
||||
Subject: [PATCH 078/115] i386/tdx: Define supported KVM features for TDX
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [78/115] d0ab8e6f6795d750c9fd07bf19bec65078424075 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
For TDX, only limited KVM PV features are supported.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-50-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 4d6e288a350a977b0fb0613db952087928ccd93e)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/kvm/tdx.c | 20 ++++++++++++++++++++
|
||||
1 file changed, 20 insertions(+)
|
||||
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index f15ed51a32..32e03caf43 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -32,6 +32,8 @@
|
||||
#include "kvm_i386.h"
|
||||
#include "tdx.h"
|
||||
|
||||
+#include "standard-headers/asm-x86/kvm_para.h"
|
||||
+
|
||||
#define TDX_MIN_TSC_FREQUENCY_KHZ (100 * 1000)
|
||||
#define TDX_MAX_TSC_FREQUENCY_KHZ (10 * 1000 * 1000)
|
||||
|
||||
@@ -44,6 +46,14 @@
|
||||
TDX_TD_ATTRIBUTES_PKS | \
|
||||
TDX_TD_ATTRIBUTES_PERFMON)
|
||||
|
||||
+#define TDX_SUPPORTED_KVM_FEATURES ((1U << KVM_FEATURE_NOP_IO_DELAY) | \
|
||||
+ (1U << KVM_FEATURE_PV_UNHALT) | \
|
||||
+ (1U << KVM_FEATURE_PV_TLB_FLUSH) | \
|
||||
+ (1U << KVM_FEATURE_PV_SEND_IPI) | \
|
||||
+ (1U << KVM_FEATURE_POLL_CONTROL) | \
|
||||
+ (1U << KVM_FEATURE_PV_SCHED_YIELD) | \
|
||||
+ (1U << KVM_FEATURE_MSI_EXT_DEST_ID))
|
||||
+
|
||||
static TdxGuest *tdx_guest;
|
||||
|
||||
static struct kvm_tdx_capabilities *tdx_caps;
|
||||
@@ -631,6 +641,14 @@ static void tdx_add_supported_cpuid_by_xfam(void)
|
||||
e->edx |= (tdx_caps->supported_xfam & CPUID_XSTATE_XSS_MASK) >> 32;
|
||||
}
|
||||
|
||||
+static void tdx_add_supported_kvm_features(void)
|
||||
+{
|
||||
+ struct kvm_cpuid_entry2 *e;
|
||||
+
|
||||
+ e = find_in_supported_entry(0x40000001, 0);
|
||||
+ e->eax = TDX_SUPPORTED_KVM_FEATURES;
|
||||
+}
|
||||
+
|
||||
static void tdx_setup_supported_cpuid(void)
|
||||
{
|
||||
if (tdx_supported_cpuid) {
|
||||
@@ -647,6 +665,8 @@ static void tdx_setup_supported_cpuid(void)
|
||||
tdx_add_supported_cpuid_by_fixed1_bits();
|
||||
tdx_add_supported_cpuid_by_attrs();
|
||||
tdx_add_supported_cpuid_by_xfam();
|
||||
+
|
||||
+ tdx_add_supported_kvm_features();
|
||||
}
|
||||
|
||||
static int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
||||
--
|
||||
2.50.1
|
||||
|
||||
56
SOURCES/kvm-i386-tdx-Disable-PIC-for-TDX-VMs.patch
Normal file
56
SOURCES/kvm-i386-tdx-Disable-PIC-for-TDX-VMs.patch
Normal file
@ -0,0 +1,56 @@
|
||||
From 52482dfcf0f97cd5db7a210497bdf45390cb7600 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:47 +0200
|
||||
Subject: [PATCH 066/115] i386/tdx: Disable PIC for TDX VMs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [66/115] 8f3badca2c7cb18d3d10bb1208396f63b7aeb47b (bonzini/rhel-qemu-kvm)
|
||||
|
||||
Legacy PIC (8259) cannot be supported for TDX VMs since TDX module
|
||||
doesn't allow directly interrupt injection. Using posted interrupts
|
||||
for the PIC is not a viable option as the guest BIOS/kernel will not
|
||||
do EOI for PIC IRQs, i.e. will leave the vIRR bit set.
|
||||
|
||||
Hence disable PIC for TDX VMs and error out if user wants PIC.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-38-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit e7ef60892c80a9ce5b8504ceb13a81f4e0d4b3f7)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/kvm/tdx.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index 9bd6843988..4f17e17308 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -381,6 +381,13 @@ static int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+ if (x86ms->pic == ON_OFF_AUTO_AUTO) {
|
||||
+ x86ms->pic = ON_OFF_AUTO_OFF;
|
||||
+ } else if (x86ms->pic == ON_OFF_AUTO_ON) {
|
||||
+ error_setg(errp, "TDX VM doesn't support PIC");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
if (!tdx_caps) {
|
||||
r = get_tdx_capabilities(errp);
|
||||
if (r) {
|
||||
--
|
||||
2.50.1
|
||||
|
||||
61
SOURCES/kvm-i386-tdx-Disable-SMM-for-TDX-VMs.patch
Normal file
61
SOURCES/kvm-i386-tdx-Disable-SMM-for-TDX-VMs.patch
Normal file
@ -0,0 +1,61 @@
|
||||
From e8e1554e0b626131745170c94a780b0d875aad63 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:47 +0200
|
||||
Subject: [PATCH 065/115] i386/tdx: Disable SMM for TDX VMs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [65/115] 69f950f26ffbea4f8ad6ff7f0be7ee3a4ce13c2b (bonzini/rhel-qemu-kvm)
|
||||
|
||||
TDX doesn't support SMM and VMM cannot emulate SMM for TDX VMs because
|
||||
VMM cannot manipulate TDX VM's memory.
|
||||
|
||||
Disable SMM for TDX VMs and error out if user requests to enable SMM.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-37-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 810d4e83d07ca0d072205453a42c324a51d5a5fa)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/kvm/tdx.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
||||
index 7bc36b620e..9bd6843988 100644
|
||||
--- a/target/i386/kvm/tdx.c
|
||||
+++ b/target/i386/kvm/tdx.c
|
||||
@@ -367,11 +367,20 @@ static Notifier tdx_machine_done_notify = {
|
||||
|
||||
static int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
||||
{
|
||||
+ MachineState *ms = MACHINE(qdev_get_machine());
|
||||
+ X86MachineState *x86ms = X86_MACHINE(ms);
|
||||
TdxGuest *tdx = TDX_GUEST(cgs);
|
||||
int r = 0;
|
||||
|
||||
kvm_mark_guest_state_protected();
|
||||
|
||||
+ if (x86ms->smm == ON_OFF_AUTO_AUTO) {
|
||||
+ x86ms->smm = ON_OFF_AUTO_OFF;
|
||||
+ } else if (x86ms->smm == ON_OFF_AUTO_ON) {
|
||||
+ error_setg(errp, "TDX VM doesn't support SMM");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
if (!tdx_caps) {
|
||||
r = get_tdx_capabilities(errp);
|
||||
if (r) {
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,78 @@
|
||||
From 43d75b6ffdd152f55c366befb9eabbc8d0a7f6e7 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:46 +0200
|
||||
Subject: [PATCH 048/115] i386/tdx: Don't initialize pc.rom for TDX VMs
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [48/115] 857ab7fccb138b45db15621688e412aef24b5821 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
For TDX, the address below 1MB are entirely general RAM. No need to
|
||||
initialize pc.rom memory region for TDs.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-20-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 49b1f0f812372129736c1df0421c8f67d86d362b)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
hw/i386/pc.c | 29 ++++++++++++++++-------------
|
||||
1 file changed, 16 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
||||
index 5237538640..057cd1fb86 100644
|
||||
--- a/hw/i386/pc.c
|
||||
+++ b/hw/i386/pc.c
|
||||
@@ -43,6 +43,7 @@
|
||||
#include "sysemu/xen.h"
|
||||
#include "sysemu/reset.h"
|
||||
#include "kvm/kvm_i386.h"
|
||||
+#include "kvm/tdx.h"
|
||||
#include "hw/xen/xen.h"
|
||||
#include "qapi/qmp/qlist.h"
|
||||
#include "qemu/error-report.h"
|
||||
@@ -1131,21 +1132,23 @@ void pc_memory_init(PCMachineState *pcms,
|
||||
/* Initialize PC system firmware */
|
||||
pc_system_firmware_init(pcms, rom_memory);
|
||||
|
||||
- option_rom_mr = g_malloc(sizeof(*option_rom_mr));
|
||||
- if (machine_require_guest_memfd(machine)) {
|
||||
- memory_region_init_ram_guest_memfd(option_rom_mr, NULL, "pc.rom",
|
||||
- PC_ROM_SIZE, &error_fatal);
|
||||
- } else {
|
||||
- memory_region_init_ram(option_rom_mr, NULL, "pc.rom", PC_ROM_SIZE,
|
||||
- &error_fatal);
|
||||
- if (pcmc->pci_enabled) {
|
||||
- memory_region_set_readonly(option_rom_mr, true);
|
||||
+ if (!is_tdx_vm()) {
|
||||
+ option_rom_mr = g_malloc(sizeof(*option_rom_mr));
|
||||
+ if (machine_require_guest_memfd(machine)) {
|
||||
+ memory_region_init_ram_guest_memfd(option_rom_mr, NULL, "pc.rom",
|
||||
+ PC_ROM_SIZE, &error_fatal);
|
||||
+ } else {
|
||||
+ memory_region_init_ram(option_rom_mr, NULL, "pc.rom", PC_ROM_SIZE,
|
||||
+ &error_fatal);
|
||||
+ if (pcmc->pci_enabled) {
|
||||
+ memory_region_set_readonly(option_rom_mr, true);
|
||||
+ }
|
||||
}
|
||||
+ memory_region_add_subregion_overlap(rom_memory,
|
||||
+ PC_ROM_MIN_VGA,
|
||||
+ option_rom_mr,
|
||||
+ 1);
|
||||
}
|
||||
- memory_region_add_subregion_overlap(rom_memory,
|
||||
- PC_ROM_MIN_VGA,
|
||||
- option_rom_mr,
|
||||
- 1);
|
||||
|
||||
fw_cfg = fw_cfg_arch_create(machine,
|
||||
x86ms->boot_cpus, x86ms->apic_id_limit);
|
||||
--
|
||||
2.50.1
|
||||
|
||||
59
SOURCES/kvm-i386-tdx-Don-t-mask-off-CPUID_EXT_PDCM.patch
Normal file
59
SOURCES/kvm-i386-tdx-Don-t-mask-off-CPUID_EXT_PDCM.patch
Normal file
@ -0,0 +1,59 @@
|
||||
From ec1ff403bb13fbb487a19a16c3da299038fecf2c Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:50 +0200
|
||||
Subject: [PATCH 104/115] i386/tdx: Don't mask off CPUID_EXT_PDCM
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [104/115] 46c1e5c86031d5d9ab9082e2d0affb3ddf7d1fb2 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
It gets below warning when booting TDX VMs:
|
||||
|
||||
warning: TDX forcibly sets the feature: CPUID[eax=01h].ECX.pdcm [bit 15]
|
||||
|
||||
Because CPUID_EXT_PDCM is fixed1 for TDX, and MSR_IA32_PERF_CAPABILITIES is
|
||||
supported for TDX guest unconditioanlly.
|
||||
|
||||
Don't mask off CPUID_EXT_PDCM for TDX.
|
||||
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250625035710.2770679-1-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 7ff24fb657d35c014f735f69aef03810fde607ab)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
Conflict: no call to mark_unavailable_features
|
||||
---
|
||||
target/i386/cpu.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||||
index 2160754869..d0161f922c 100644
|
||||
--- a/target/i386/cpu.c
|
||||
+++ b/target/i386/cpu.c
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "sysemu/hvf.h"
|
||||
#include "hvf/hvf-i386.h"
|
||||
#include "kvm/kvm_i386.h"
|
||||
+#include "kvm/tdx.h"
|
||||
#include "sev.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/error-report.h"
|
||||
@@ -8011,7 +8012,8 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
- if (!cpu->enable_pmu) {
|
||||
+ /* PDCM is fixed1 bit for TDX */
|
||||
+ if (!cpu->enable_pmu && !is_tdx_vm()) {
|
||||
env->features[FEAT_1_ECX] &= ~CPUID_EXT_PDCM;
|
||||
}
|
||||
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
From 6339bd26122c876a663e841810de28c064e09128 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Fri, 18 Jul 2025 18:03:47 +0200
|
||||
Subject: [PATCH 068/115] i386/tdx: Don't synchronize guest tsc for TDs
|
||||
|
||||
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||||
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
||||
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
||||
RH-Acked-by: Yash Mankad <None>
|
||||
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||||
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||||
RH-Commit: [68/115] 56f6dc49e20933d8539b2413a902a2fbad2751e0 (bonzini/rhel-qemu-kvm)
|
||||
|
||||
TSC of TDs is not accessible and KVM doesn't allow access of
|
||||
MSR_IA32_TSC for TDs. To avoid the assert() in kvm_get_tsc, make
|
||||
kvm_synchronize_all_tsc() noop for TDs,
|
||||
|
||||
Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
|
||||
Reviewed-by: Connor Kuehl <ckuehl@redhat.com>
|
||||
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||||
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250508150002.689633-40-xiaoyao.li@intel.com
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
(cherry picked from commit 0ed55865b49b703af93e160d48935812a7114e07)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
target/i386/kvm/kvm.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
||||
index f4809ee004..0c47eef03c 100644
|
||||
--- a/target/i386/kvm/kvm.c
|
||||
+++ b/target/i386/kvm/kvm.c
|
||||
@@ -319,7 +319,7 @@ void kvm_synchronize_all_tsc(void)
|
||||
{
|
||||
CPUState *cpu;
|
||||
|
||||
- if (kvm_enabled()) {
|
||||
+ if (kvm_enabled() && !is_tdx_vm()) {
|
||||
CPU_FOREACH(cpu) {
|
||||
run_on_cpu(cpu, do_kvm_synchronize_tsc, RUN_ON_CPU_NULL);
|
||||
}
|
||||
--
|
||||
2.50.1
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user