!1047 [sync] PR-1041: QEMU update to version 8.2.0-25:
From: @openeuler-sync-bot Reviewed-by: @imxcc Signed-off-by: @imxcc
This commit is contained in:
commit
7ec2731682
39
Add-virtCCA-Coda-annotation.patch
Normal file
39
Add-virtCCA-Coda-annotation.patch
Normal file
@ -0,0 +1,39 @@
|
||||
From 0cf5a4c56d34542bcc2f646446bf54828a51a014 Mon Sep 17 00:00:00 2001
|
||||
From: yangxiangkai <yangxiangkai@huawei.com>
|
||||
Date: Tue, 12 Nov 2024 09:03:51 +0800
|
||||
Subject: [PATCH] Add virtCCA Coda annotation Adjust the position of the
|
||||
security device Signed-off-by: yangxiangkai <yangxiangkai@huawei.com>
|
||||
|
||||
---
|
||||
hw/arm/virt.c | 1 +
|
||||
linux-headers/linux/vfio.h | 2 +-
|
||||
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index e73a795d3d..a744393f6e 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -162,6 +162,7 @@ static const MemMapEntry base_memmap[] = {
|
||||
[VIRT_PVTIME] = { 0x090a0000, 0x00010000 },
|
||||
[VIRT_SECURE_GPIO] = { 0x090b0000, 0x00001000 },
|
||||
[VIRT_CPUHP_ACPI] = { 0x090c0000, ACPI_CPU_HOTPLUG_REG_LEN},
|
||||
+ /* In the virtCCA scenario, this space is used for MSI interrupt mapping */
|
||||
[VIRT_MMIO] = { 0x0a000000, 0x00000200 },
|
||||
[VIRT_CPUFREQ] = { 0x0b000000, 0x00010000 },
|
||||
/* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
|
||||
diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h
|
||||
index c27a43d74b..5b1e2871af 100644
|
||||
--- a/linux-headers/linux/vfio.h
|
||||
+++ b/linux-headers/linux/vfio.h
|
||||
@@ -225,7 +225,7 @@ struct vfio_device_info {
|
||||
#define VFIO_DEVICE_FLAGS_FSL_MC (1 << 6) /* vfio-fsl-mc device */
|
||||
#define VFIO_DEVICE_FLAGS_CAPS (1 << 7) /* Info supports caps */
|
||||
#define VFIO_DEVICE_FLAGS_CDX (1 << 8) /* vfio-cdx device */
|
||||
-#define VFIO_DEVICE_FLAGS_SECURE (1 << 9) /* secure pci device */
|
||||
+#define VFIO_DEVICE_FLAGS_SECURE (1 << 15) /* secure pci device */
|
||||
__u32 num_regions; /* Max region index + 1 */
|
||||
__u32 num_irqs; /* Max IRQ index + 1 */
|
||||
__u32 cap_offset; /* Offset within info struct of first cap */
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
294
cvm-Add-support-for-TEE-based-national-encryption-ac.patch
Normal file
294
cvm-Add-support-for-TEE-based-national-encryption-ac.patch
Normal file
@ -0,0 +1,294 @@
|
||||
From dffc0f55d93ececee55a8548d7dab227ee76b234 Mon Sep 17 00:00:00 2001
|
||||
From: liupingwei <liupingwei0317@outlook.com>
|
||||
Date: Thu, 24 Oct 2024 19:05:58 +0800
|
||||
Subject: [PATCH] cvm : Add support for TEE-based national encryption
|
||||
acceleration.
|
||||
|
||||
This commit enables the use of TEE for national encryption acceleration
|
||||
in cvm and speeds up OpenSSL encrption /decryption operations.
|
||||
|
||||
Signed-off-by: liupingwei <liupingwei0317@outlook.com>
|
||||
---
|
||||
hw/arm/virt.c | 61 ++++++++++++++++++++++++++++++-
|
||||
include/hw/arm/virt.h | 1 +
|
||||
linux-headers/asm-arm64/kvm.h | 10 ++++++
|
||||
qapi/qom.json | 1 +
|
||||
target/arm/kvm-tmm.c | 68 +++++++++++++++++++++++++++++++++--
|
||||
target/arm/kvm_arm.h | 4 +++
|
||||
6 files changed, 142 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index e73a795d3d..248788db03 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -1967,6 +1967,10 @@ static void virt_set_memmap(VirtMachineState *vms, int pa_bits)
|
||||
"kvm-type", &error_abort);
|
||||
|
||||
if (!strcmp(kvm_type, "cvm")) {
|
||||
+ /* support kae vf device tree nodes */
|
||||
+ vms->memmap[VIRT_PCIE_MMIO] = (MemMapEntry) { 0x10000000, 0x2edf0000 };
|
||||
+ vms->memmap[VIRT_KAE_DEVICE] = (MemMapEntry) { 0x3edf0000, 0x00200000 };
|
||||
+
|
||||
vms->memmap[VIRT_MEM].base = 3 * GiB;
|
||||
vms->memmap[VIRT_MEM].size = ms->ram_size;
|
||||
info_report("[qemu] fix VIRT_MEM range 0x%llx - 0x%llx\n", (unsigned long long)(vms->memmap[VIRT_MEM].base),
|
||||
@@ -2380,6 +2384,56 @@ out:
|
||||
return;
|
||||
}
|
||||
|
||||
+static void fdt_add_hisi_sec_nodes(const VirtMachineState *vms, int dev_id)
|
||||
+{
|
||||
+ const MachineState *ms = MACHINE(vms);
|
||||
+ hwaddr size = 0x10000;
|
||||
+
|
||||
+ /*
|
||||
+ * Calculate the base address for the sec device node.
|
||||
+ * Each device group contains one sec device and one hpre device,spaced by 2 * size.
|
||||
+ */
|
||||
+ hwaddr base = vms->memmap[VIRT_KAE_DEVICE].base + dev_id * 2 * size;
|
||||
+ char *nodename;
|
||||
+
|
||||
+ tmm_set_sec_addr(base, dev_id);
|
||||
+
|
||||
+ nodename = g_strdup_printf("/hisi-sec@%" PRIx64, base);
|
||||
+ qemu_fdt_add_subnode(ms->fdt, nodename);
|
||||
+ qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "hisilicon,hip07-sec-vf");
|
||||
+ qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 2, base, 2, size);
|
||||
+ g_free(nodename);
|
||||
+}
|
||||
+
|
||||
+static void fdt_add_hisi_hpre_nodes(const VirtMachineState *vms, int dev_id)
|
||||
+{
|
||||
+ const MachineState *ms = MACHINE(vms);
|
||||
+ hwaddr size = 0x10000;
|
||||
+
|
||||
+ /*
|
||||
+ * Calculate the base address for the hpre device node.
|
||||
+ * Each hpre device follows the corresponding sec device by an additional offset of size.
|
||||
+ */
|
||||
+ hwaddr base = vms->memmap[VIRT_KAE_DEVICE].base + dev_id * 2 * size + size;
|
||||
+ char *nodename;
|
||||
+
|
||||
+ tmm_set_hpre_addr(base, dev_id);
|
||||
+
|
||||
+ nodename = g_strdup_printf("/hisi-hpre@%" PRIx64, base);
|
||||
+ qemu_fdt_add_subnode(ms->fdt, nodename);
|
||||
+ qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "hisilicon,hip07-hpre-vf");
|
||||
+ qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 2, base, 2, size);
|
||||
+ g_free(nodename);
|
||||
+}
|
||||
+
|
||||
+static void fdt_add_all_hisi_nodes(const VirtMachineState *vms, int dev_id)
|
||||
+{
|
||||
+ for (int i = 0; i < dev_id; i++) {
|
||||
+ fdt_add_hisi_sec_nodes(vms, i);
|
||||
+ fdt_add_hisi_hpre_nodes(vms, i);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void machvirt_init(MachineState *machine)
|
||||
{
|
||||
VirtMachineState *vms = VIRT_MACHINE(machine);
|
||||
@@ -2530,14 +2584,19 @@ static void machvirt_init(MachineState *machine)
|
||||
}
|
||||
}
|
||||
|
||||
+ create_fdt(vms);
|
||||
+
|
||||
if (virtcca_cvm_enabled()) {
|
||||
+ int kae_num = tmm_get_kae_num();
|
||||
+ fdt_add_all_hisi_nodes(vms, kae_num);
|
||||
+
|
||||
int ret = kvm_arm_tmm_init(machine->cgs, &error_fatal);
|
||||
if (ret != 0) {
|
||||
error_report("fail to initialize TMM");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
- create_fdt(vms);
|
||||
+
|
||||
qemu_log("cpu init start\n");
|
||||
|
||||
cpu_class = object_class_by_name(machine->cpu_type);
|
||||
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
|
||||
index 27f5333772..76a0d3fa5b 100644
|
||||
--- a/include/hw/arm/virt.h
|
||||
+++ b/include/hw/arm/virt.h
|
||||
@@ -66,6 +66,7 @@ enum {
|
||||
VIRT_FW_CFG,
|
||||
VIRT_PCIE,
|
||||
VIRT_PCIE_MMIO,
|
||||
+ VIRT_KAE_DEVICE,
|
||||
VIRT_PCIE_PIO,
|
||||
VIRT_PCIE_ECAM,
|
||||
VIRT_PLATFORM_BUS,
|
||||
diff --git a/linux-headers/asm-arm64/kvm.h b/linux-headers/asm-arm64/kvm.h
|
||||
index 2b040b5d60..552fdcb18f 100644
|
||||
--- a/linux-headers/asm-arm64/kvm.h
|
||||
+++ b/linux-headers/asm-arm64/kvm.h
|
||||
@@ -541,6 +541,9 @@ struct reg_mask_range {
|
||||
#define KVM_CAP_ARM_TMM_CFG_SVE 2
|
||||
#define KVM_CAP_ARM_TMM_CFG_DBG 3
|
||||
#define KVM_CAP_ARM_TMM_CFG_PMU 4
|
||||
+#define KVM_CAP_ARM_TMM_CFG_KAE 5
|
||||
+
|
||||
+#define KVM_ARM_TMM_MAX_KAE_VF_NUM 11
|
||||
|
||||
struct kvm_cap_arm_tmm_config_item {
|
||||
__u32 cfg;
|
||||
@@ -570,6 +573,13 @@ struct kvm_cap_arm_tmm_config_item {
|
||||
struct {
|
||||
__u32 num_pmu_cntrs;
|
||||
};
|
||||
+
|
||||
+ /* cfg == KVM_CAP_ARM_TMM_CFG_KAE */
|
||||
+ struct {
|
||||
+ __u32 kae_vf_num;
|
||||
+ __u64 sec_addr[KVM_ARM_TMM_MAX_KAE_VF_NUM];
|
||||
+ __u64 hpre_addr[KVM_ARM_TMM_MAX_KAE_VF_NUM];
|
||||
+ };
|
||||
/* Fix the size of the union */
|
||||
__u8 reserved[256];
|
||||
};
|
||||
diff --git a/qapi/qom.json b/qapi/qom.json
|
||||
index 213edd8db2..293d727a04 100644
|
||||
--- a/qapi/qom.json
|
||||
+++ b/qapi/qom.json
|
||||
@@ -921,6 +921,7 @@
|
||||
{ 'struct': 'TmmGuestProperties',
|
||||
'data': { '*sve-vector-length': 'uint32',
|
||||
'*num-pmu-counters': 'uint32',
|
||||
+ '*kae': 'uint32',
|
||||
'*measurement-algo': 'TmmGuestMeasurementAlgo' } }
|
||||
|
||||
##
|
||||
diff --git a/target/arm/kvm-tmm.c b/target/arm/kvm-tmm.c
|
||||
index efe2ca0006..ea6bcc0f40 100644
|
||||
--- a/target/arm/kvm-tmm.c
|
||||
+++ b/target/arm/kvm-tmm.c
|
||||
@@ -19,13 +19,20 @@
|
||||
#include "sysemu/kvm.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "hw/loader.h"
|
||||
+#include "linux-headers/asm-arm64/kvm.h"
|
||||
|
||||
#define TYPE_TMM_GUEST "tmm-guest"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(TmmGuest, TMM_GUEST)
|
||||
|
||||
#define TMM_PAGE_SIZE qemu_real_host_page_size()
|
||||
-#define TMM_MAX_PMU_CTRS 0x20
|
||||
-#define TMM_MAX_CFG 5
|
||||
+#define TMM_MAX_PMU_CTRS 0x20
|
||||
+#define TMM_MAX_CFG 6
|
||||
+
|
||||
+typedef struct {
|
||||
+ uint32_t kae_vf_num;
|
||||
+ hwaddr sec_addr[KVM_ARM_TMM_MAX_KAE_VF_NUM];
|
||||
+ hwaddr hpre_addr[KVM_ARM_TMM_MAX_KAE_VF_NUM];
|
||||
+} KaeDeviceInfo;
|
||||
|
||||
struct TmmGuest {
|
||||
ConfidentialGuestSupport parent_obj;
|
||||
@@ -33,6 +40,7 @@ struct TmmGuest {
|
||||
TmmGuestMeasurementAlgo measurement_algo;
|
||||
uint32_t sve_vl;
|
||||
uint32_t num_pmu_cntrs;
|
||||
+ KaeDeviceInfo kae_device_info;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
@@ -92,6 +100,17 @@ static int tmm_configure_one(TmmGuest *guest, uint32_t cfg, Error **errp)
|
||||
args.num_pmu_cntrs = guest->num_pmu_cntrs;
|
||||
cfg_str = "PMU";
|
||||
break;
|
||||
+ case KVM_CAP_ARM_TMM_CFG_KAE:
|
||||
+ if (!guest->kae_device_info.kae_vf_num) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+ args.kae_vf_num= guest->kae_device_info.kae_vf_num;
|
||||
+ for (int i = 0; i < guest->kae_device_info.kae_vf_num; i++) {
|
||||
+ args.sec_addr[i] = guest->kae_device_info.sec_addr[i];
|
||||
+ args.hpre_addr[i] = guest->kae_device_info.hpre_addr[i];
|
||||
+ }
|
||||
+ cfg_str = "KAE";
|
||||
+ break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
@@ -289,6 +308,47 @@ static void tmm_set_measurement_algo(Object *obj, int algo, Error **errp G_GNUC_
|
||||
guest->measurement_algo = algo;
|
||||
}
|
||||
|
||||
+static void tmm_get_kae_vf_num(Object *obj, Visitor *v, const char *name,
|
||||
+ void *opaque, Error **errp)
|
||||
+{
|
||||
+ TmmGuest *guest = TMM_GUEST(obj);
|
||||
+
|
||||
+ visit_type_uint32(v, name, &guest->kae_device_info.kae_vf_num, errp);
|
||||
+}
|
||||
+
|
||||
+static void tmm_set_kae_vf_num(Object *obj, Visitor *v, const char *name,
|
||||
+ void *opaque, Error **errp)
|
||||
+{
|
||||
+ TmmGuest *guest = TMM_GUEST(obj);
|
||||
+ uint32_t value;
|
||||
+
|
||||
+ if (!visit_type_uint32(v, name, &value, errp)) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (value > KVM_ARM_TMM_MAX_KAE_VF_NUM) {
|
||||
+ error_setg(errp, "invalid number of kae vfs");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ guest->kae_device_info.kae_vf_num = value;
|
||||
+}
|
||||
+
|
||||
+int tmm_get_kae_num(void)
|
||||
+{
|
||||
+ return tmm_guest->kae_device_info.kae_vf_num;
|
||||
+}
|
||||
+
|
||||
+void tmm_set_sec_addr(hwaddr base, int num)
|
||||
+{
|
||||
+ tmm_guest->kae_device_info.sec_addr[num] = base;
|
||||
+}
|
||||
+
|
||||
+void tmm_set_hpre_addr(hwaddr base, int num)
|
||||
+{
|
||||
+ tmm_guest->kae_device_info.hpre_addr[num] = base;
|
||||
+}
|
||||
+
|
||||
static void tmm_guest_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
object_class_property_add_enum(oc, "measurement-algo",
|
||||
@@ -314,6 +374,10 @@ static void tmm_guest_class_init(ObjectClass *oc, void *data)
|
||||
NULL, NULL);
|
||||
object_class_property_set_description(oc, "num-pmu-counters",
|
||||
"Number of PMU counters");
|
||||
+ object_class_property_add(oc, "kae", "uint32", tmm_get_kae_vf_num,
|
||||
+ tmm_set_kae_vf_num, NULL, NULL);
|
||||
+ object_class_property_set_description(oc, "kae",
|
||||
+ "Number of KAE virtual functions. 0 disables KAE (the default)");
|
||||
}
|
||||
|
||||
static void tmm_guest_instance_init(Object *obj)
|
||||
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
|
||||
index d6c7139f4a..31457a57f7 100644
|
||||
--- a/target/arm/kvm_arm.h
|
||||
+++ b/target/arm/kvm_arm.h
|
||||
@@ -390,6 +390,10 @@ int kvm_arm_set_irq(int cpu, int irqtype, int irq, int level);
|
||||
|
||||
void tmm_add_ram_region(hwaddr base1, hwaddr len1, hwaddr base2, hwaddr len2, bool populate);
|
||||
|
||||
+int tmm_get_kae_num(void);
|
||||
+void tmm_set_sec_addr(hwaddr base, int num);
|
||||
+void tmm_set_hpre_addr(hwaddr base, int num);
|
||||
+
|
||||
int kvm_arm_tmm_init(ConfidentialGuestSupport *cgs, Error **errp);
|
||||
bool kvm_arm_tmm_enabled(void);
|
||||
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
671
hw-arm-virt-Keep-Guest-L1-cache-type-consistent-with.patch
Normal file
671
hw-arm-virt-Keep-Guest-L1-cache-type-consistent-with.patch
Normal file
@ -0,0 +1,671 @@
|
||||
From 6060f8cad07a3d2a49795fef19d585a9d205ecef Mon Sep 17 00:00:00 2001
|
||||
From: Jia Qingtong <jiaqingtong97@gmail.com>
|
||||
Date: Tue, 24 Sep 2024 18:24:33 +0800
|
||||
Subject: [PATCH] hw/arm/virt:Keep Guest L1 cache type consistent with KVM
|
||||
|
||||
Linux KVM normalize the cache configuration and expose a
|
||||
fabricated CLIDR_EL1 value to guest, where L1 cache type
|
||||
could be unified or seperate instruction cache and data
|
||||
cache. Let's keep guest L1 cache type consistent with
|
||||
KVM by checking the guest visable CLIDR_EL1, which can
|
||||
avoid abnormal issue in guest when it's probing cache
|
||||
info conbined CLIDR_EL1 with ACPI PPTT and DT.
|
||||
|
||||
Signed-off-by: Yanan Wang <wangyanan55@huawei.com>
|
||||
Signed-off-by: lishusen <lishusen2@huawei.com>
|
||||
---
|
||||
hw/acpi/aml-build.c | 165 ++---------------------------------
|
||||
hw/arm/virt-acpi-build.c | 167 ++++++++++++++++++++++++++++++++++++
|
||||
hw/arm/virt.c | 86 +++++++++++++++----
|
||||
include/hw/acpi/aml-build.h | 54 ++----------
|
||||
include/hw/arm/virt.h | 60 +++++++++++++
|
||||
5 files changed, 306 insertions(+), 226 deletions(-)
|
||||
|
||||
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
|
||||
index bf9c59f544..0d4994bafe 100644
|
||||
--- a/hw/acpi/aml-build.c
|
||||
+++ b/hw/acpi/aml-build.c
|
||||
@@ -47,7 +47,7 @@ static void build_prepend_byte(GArray *array, uint8_t val)
|
||||
g_array_prepend_val(array, val);
|
||||
}
|
||||
|
||||
-static void build_append_byte(GArray *array, uint8_t val)
|
||||
+void build_append_byte(GArray *array, uint8_t val)
|
||||
{
|
||||
g_array_append_val(array, val);
|
||||
}
|
||||
@@ -1990,10 +1990,10 @@ void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms,
|
||||
* ACPI spec, Revision 6.3
|
||||
* 5.2.29.1 Processor hierarchy node structure (Type 0)
|
||||
*/
|
||||
-static void build_processor_hierarchy_node(GArray *tbl, uint32_t flags,
|
||||
- uint32_t parent, uint32_t id,
|
||||
- uint32_t *priv_rsrc,
|
||||
- uint32_t priv_num)
|
||||
+void build_processor_hierarchy_node(GArray *tbl, uint32_t flags,
|
||||
+ uint32_t parent, uint32_t id,
|
||||
+ uint32_t *priv_rsrc,
|
||||
+ uint32_t priv_num)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -2016,161 +2016,6 @@ static void build_processor_hierarchy_node(GArray *tbl, uint32_t flags,
|
||||
}
|
||||
}
|
||||
|
||||
-/*
|
||||
- * ACPI spec, Revision 6.3
|
||||
- * 5.2.29.2 Cache Type Structure (Type 1)
|
||||
- */
|
||||
-static void build_cache_hierarchy_node(GArray *tbl, uint32_t next_level,
|
||||
- uint32_t cache_type)
|
||||
-{
|
||||
- build_append_byte(tbl, 1);
|
||||
- build_append_byte(tbl, 24);
|
||||
- build_append_int_noprefix(tbl, 0, 2);
|
||||
- build_append_int_noprefix(tbl, 127, 4);
|
||||
- build_append_int_noprefix(tbl, next_level, 4);
|
||||
-
|
||||
- switch (cache_type) {
|
||||
- case ARM_L1D_CACHE: /* L1 dcache info */
|
||||
- build_append_int_noprefix(tbl, ARM_L1DCACHE_SIZE, 4);
|
||||
- build_append_int_noprefix(tbl, ARM_L1DCACHE_SETS, 4);
|
||||
- build_append_byte(tbl, ARM_L1DCACHE_ASSOCIATIVITY);
|
||||
- build_append_byte(tbl, ARM_L1DCACHE_ATTRIBUTES);
|
||||
- build_append_int_noprefix(tbl, ARM_L1DCACHE_LINE_SIZE, 2);
|
||||
- break;
|
||||
- case ARM_L1I_CACHE: /* L1 icache info */
|
||||
- build_append_int_noprefix(tbl, ARM_L1ICACHE_SIZE, 4);
|
||||
- build_append_int_noprefix(tbl, ARM_L1ICACHE_SETS, 4);
|
||||
- build_append_byte(tbl, ARM_L1ICACHE_ASSOCIATIVITY);
|
||||
- build_append_byte(tbl, ARM_L1ICACHE_ATTRIBUTES);
|
||||
- build_append_int_noprefix(tbl, ARM_L1ICACHE_LINE_SIZE, 2);
|
||||
- break;
|
||||
- case ARM_L2_CACHE: /* L2 cache info */
|
||||
- build_append_int_noprefix(tbl, ARM_L2CACHE_SIZE, 4);
|
||||
- build_append_int_noprefix(tbl, ARM_L2CACHE_SETS, 4);
|
||||
- build_append_byte(tbl, ARM_L2CACHE_ASSOCIATIVITY);
|
||||
- build_append_byte(tbl, ARM_L2CACHE_ATTRIBUTES);
|
||||
- build_append_int_noprefix(tbl, ARM_L2CACHE_LINE_SIZE, 2);
|
||||
- break;
|
||||
- case ARM_L3_CACHE: /* L3 cache info */
|
||||
- build_append_int_noprefix(tbl, ARM_L3CACHE_SIZE, 4);
|
||||
- build_append_int_noprefix(tbl, ARM_L3CACHE_SETS, 4);
|
||||
- build_append_byte(tbl, ARM_L3CACHE_ASSOCIATIVITY);
|
||||
- build_append_byte(tbl, ARM_L3CACHE_ATTRIBUTES);
|
||||
- build_append_int_noprefix(tbl, ARM_L3CACHE_LINE_SIZE, 2);
|
||||
- break;
|
||||
- default:
|
||||
- build_append_int_noprefix(tbl, 0, 4);
|
||||
- build_append_int_noprefix(tbl, 0, 4);
|
||||
- build_append_byte(tbl, 0);
|
||||
- build_append_byte(tbl, 0);
|
||||
- build_append_int_noprefix(tbl, 0, 2);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-/*
|
||||
- * ACPI spec, Revision 6.3
|
||||
- * 5.2.29 Processor Properties Topology Table (PPTT)
|
||||
- */
|
||||
-void build_pptt_arm(GArray *table_data, BIOSLinker *linker, MachineState *ms,
|
||||
- const char *oem_id, const char *oem_table_id)
|
||||
-{
|
||||
- MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
- GQueue *list = g_queue_new();
|
||||
- guint pptt_start = table_data->len;
|
||||
- guint parent_offset;
|
||||
- guint length, i;
|
||||
- int uid = 0;
|
||||
- int socket;
|
||||
- AcpiTable table = { .sig = "PPTT", .rev = 2,
|
||||
- .oem_id = oem_id, .oem_table_id = oem_table_id };
|
||||
-
|
||||
- acpi_table_begin(&table, table_data);
|
||||
-
|
||||
- for (socket = 0; socket < ms->smp.sockets; socket++) {
|
||||
- uint32_t l3_cache_offset = table_data->len - pptt_start;
|
||||
- build_cache_hierarchy_node(table_data, 0, ARM_L3_CACHE);
|
||||
-
|
||||
- g_queue_push_tail(list,
|
||||
- GUINT_TO_POINTER(table_data->len - pptt_start));
|
||||
- build_processor_hierarchy_node(
|
||||
- table_data,
|
||||
- /*
|
||||
- * Physical package - represents the boundary
|
||||
- * of a physical package
|
||||
- */
|
||||
- (1 << 0),
|
||||
- 0, socket, &l3_cache_offset, 1);
|
||||
- }
|
||||
-
|
||||
- if (mc->smp_props.clusters_supported) {
|
||||
- length = g_queue_get_length(list);
|
||||
- for (i = 0; i < length; i++) {
|
||||
- int cluster;
|
||||
-
|
||||
- parent_offset = GPOINTER_TO_UINT(g_queue_pop_head(list));
|
||||
- for (cluster = 0; cluster < ms->smp.clusters; cluster++) {
|
||||
- g_queue_push_tail(list,
|
||||
- GUINT_TO_POINTER(table_data->len - pptt_start));
|
||||
- build_processor_hierarchy_node(
|
||||
- table_data,
|
||||
- (0 << 0), /* not a physical package */
|
||||
- parent_offset, cluster, NULL, 0);
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- length = g_queue_get_length(list);
|
||||
- for (i = 0; i < length; i++) {
|
||||
- int core;
|
||||
-
|
||||
- parent_offset = GPOINTER_TO_UINT(g_queue_pop_head(list));
|
||||
- for (core = 0; core < ms->smp.cores; core++) {
|
||||
- uint32_t priv_rsrc[3] = {};
|
||||
- priv_rsrc[0] = table_data->len - pptt_start; /* L2 cache offset */
|
||||
- build_cache_hierarchy_node(table_data, 0, ARM_L2_CACHE);
|
||||
-
|
||||
- priv_rsrc[1] = table_data->len - pptt_start; /* L1 dcache offset */
|
||||
- build_cache_hierarchy_node(table_data, priv_rsrc[0], ARM_L1D_CACHE);
|
||||
-
|
||||
- priv_rsrc[2] = table_data->len - pptt_start; /* L1 icache offset */
|
||||
- build_cache_hierarchy_node(table_data, priv_rsrc[0], ARM_L1I_CACHE);
|
||||
-
|
||||
- if (ms->smp.threads > 1) {
|
||||
- g_queue_push_tail(list,
|
||||
- GUINT_TO_POINTER(table_data->len - pptt_start));
|
||||
- build_processor_hierarchy_node(
|
||||
- table_data,
|
||||
- (0 << 0), /* not a physical package */
|
||||
- parent_offset, core, priv_rsrc, 3);
|
||||
- } else {
|
||||
- build_processor_hierarchy_node(
|
||||
- table_data,
|
||||
- (1 << 1) | /* ACPI Processor ID valid */
|
||||
- (1 << 3), /* Node is a Leaf */
|
||||
- parent_offset, uid++, priv_rsrc, 3);
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- length = g_queue_get_length(list);
|
||||
- for (i = 0; i < length; i++) {
|
||||
- int thread;
|
||||
-
|
||||
- parent_offset = GPOINTER_TO_UINT(g_queue_pop_head(list));
|
||||
- for (thread = 0; thread < ms->smp.threads; thread++) {
|
||||
- build_processor_hierarchy_node(
|
||||
- table_data,
|
||||
- (1 << 1) | /* ACPI Processor ID valid */
|
||||
- (1 << 2) | /* Processor is a Thread */
|
||||
- (1 << 3), /* Node is a Leaf */
|
||||
- parent_offset, uid++, NULL, 0);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- g_queue_free(list);
|
||||
- acpi_table_end(linker, &table);
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* ACPI spec, Revision 6.3
|
||||
* 5.2.29 Processor Properties Topology Table (PPTT)
|
||||
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
|
||||
index 179600d4fe..86984b7167 100644
|
||||
--- a/hw/arm/virt-acpi-build.c
|
||||
+++ b/hw/arm/virt-acpi-build.c
|
||||
@@ -63,6 +63,173 @@
|
||||
|
||||
#define ACPI_BUILD_TABLE_SIZE 0x20000
|
||||
|
||||
+/*
|
||||
+ * ACPI spec, Revision 6.3
|
||||
+ * 5.2.29.2 Cache Type Structure (Type 1)
|
||||
+ */
|
||||
+static void build_cache_hierarchy_node(GArray *tbl, uint32_t next_level,
|
||||
+ uint32_t cache_type)
|
||||
+{
|
||||
+ build_append_byte(tbl, 1);
|
||||
+ build_append_byte(tbl, 24);
|
||||
+ build_append_int_noprefix(tbl, 0, 2);
|
||||
+ build_append_int_noprefix(tbl, 127, 4);
|
||||
+ build_append_int_noprefix(tbl, next_level, 4);
|
||||
+
|
||||
+ switch (cache_type) {
|
||||
+ case ARM_L1D_CACHE: /* L1 dcache info */
|
||||
+ build_append_int_noprefix(tbl, ARM_L1DCACHE_SIZE, 4);
|
||||
+ build_append_int_noprefix(tbl, ARM_L1DCACHE_SETS, 4);
|
||||
+ build_append_byte(tbl, ARM_L1DCACHE_ASSOCIATIVITY);
|
||||
+ build_append_byte(tbl, ARM_L1DCACHE_ATTRIBUTES);
|
||||
+ build_append_int_noprefix(tbl, ARM_L1DCACHE_LINE_SIZE, 2);
|
||||
+ break;
|
||||
+ case ARM_L1I_CACHE: /* L1 icache info */
|
||||
+ build_append_int_noprefix(tbl, ARM_L1ICACHE_SIZE, 4);
|
||||
+ build_append_int_noprefix(tbl, ARM_L1ICACHE_SETS, 4);
|
||||
+ build_append_byte(tbl, ARM_L1ICACHE_ASSOCIATIVITY);
|
||||
+ build_append_byte(tbl, ARM_L1ICACHE_ATTRIBUTES);
|
||||
+ build_append_int_noprefix(tbl, ARM_L1ICACHE_LINE_SIZE, 2);
|
||||
+ break;
|
||||
+ case ARM_L1_CACHE: /* L1 cache info */
|
||||
+ build_append_int_noprefix(tbl, ARM_L1CACHE_SIZE, 4);
|
||||
+ build_append_int_noprefix(tbl, ARM_L1CACHE_SETS, 4);
|
||||
+ build_append_byte(tbl, ARM_L1CACHE_ASSOCIATIVITY);
|
||||
+ build_append_byte(tbl, ARM_L1CACHE_ATTRIBUTES);
|
||||
+ build_append_int_noprefix(tbl, ARM_L1CACHE_LINE_SIZE, 2);
|
||||
+ break;
|
||||
+ case ARM_L2_CACHE: /* L2 cache info */
|
||||
+ build_append_int_noprefix(tbl, ARM_L2CACHE_SIZE, 4);
|
||||
+ build_append_int_noprefix(tbl, ARM_L2CACHE_SETS, 4);
|
||||
+ build_append_byte(tbl, ARM_L2CACHE_ASSOCIATIVITY);
|
||||
+ build_append_byte(tbl, ARM_L2CACHE_ATTRIBUTES);
|
||||
+ build_append_int_noprefix(tbl, ARM_L2CACHE_LINE_SIZE, 2);
|
||||
+ break;
|
||||
+ case ARM_L3_CACHE: /* L3 cache info */
|
||||
+ build_append_int_noprefix(tbl, ARM_L3CACHE_SIZE, 4);
|
||||
+ build_append_int_noprefix(tbl, ARM_L3CACHE_SETS, 4);
|
||||
+ build_append_byte(tbl, ARM_L3CACHE_ASSOCIATIVITY);
|
||||
+ build_append_byte(tbl, ARM_L3CACHE_ATTRIBUTES);
|
||||
+ build_append_int_noprefix(tbl, ARM_L3CACHE_LINE_SIZE, 2);
|
||||
+ break;
|
||||
+ default:
|
||||
+ build_append_int_noprefix(tbl, 0, 4);
|
||||
+ build_append_int_noprefix(tbl, 0, 4);
|
||||
+ build_append_byte(tbl, 0);
|
||||
+ build_append_byte(tbl, 0);
|
||||
+ build_append_int_noprefix(tbl, 0, 2);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * ACPI spec, Revision 6.3
|
||||
+ * 5.2.29 Processor Properties Topology Table (PPTT)
|
||||
+ */
|
||||
+static void build_pptt_arm(GArray *table_data, BIOSLinker *linker, MachineState *ms,
|
||||
+ const char *oem_id, const char *oem_table_id)
|
||||
+{
|
||||
+ MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
+ GQueue *list = g_queue_new();
|
||||
+ guint pptt_start = table_data->len;
|
||||
+ guint parent_offset;
|
||||
+ guint length, i;
|
||||
+ int uid = 0;
|
||||
+ int socket;
|
||||
+ AcpiTable table = { .sig = "PPTT", .rev = 2,
|
||||
+ .oem_id = oem_id, .oem_table_id = oem_table_id };
|
||||
+ bool unified_l1 = cpu_l1_cache_unified(0);
|
||||
+
|
||||
+ acpi_table_begin(&table, table_data);
|
||||
+
|
||||
+ for (socket = 0; socket < ms->smp.sockets; socket++) {
|
||||
+ uint32_t l3_cache_offset = table_data->len - pptt_start;
|
||||
+ build_cache_hierarchy_node(table_data, 0, ARM_L3_CACHE);
|
||||
+
|
||||
+ g_queue_push_tail(list,
|
||||
+ GUINT_TO_POINTER(table_data->len - pptt_start));
|
||||
+ build_processor_hierarchy_node(
|
||||
+ table_data,
|
||||
+ /*
|
||||
+ * Physical package - represents the boundary
|
||||
+ * of a physical package
|
||||
+ */
|
||||
+ (1 << 0),
|
||||
+ 0, socket, &l3_cache_offset, 1);
|
||||
+ }
|
||||
+
|
||||
+ if (mc->smp_props.clusters_supported) {
|
||||
+ length = g_queue_get_length(list);
|
||||
+ for (i = 0; i < length; i++) {
|
||||
+ int cluster;
|
||||
+
|
||||
+ parent_offset = GPOINTER_TO_UINT(g_queue_pop_head(list));
|
||||
+ for (cluster = 0; cluster < ms->smp.clusters; cluster++) {
|
||||
+ g_queue_push_tail(list,
|
||||
+ GUINT_TO_POINTER(table_data->len - pptt_start));
|
||||
+ build_processor_hierarchy_node(
|
||||
+ table_data,
|
||||
+ (0 << 0), /* not a physical package */
|
||||
+ parent_offset, cluster, NULL, 0);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ length = g_queue_get_length(list);
|
||||
+ for (i = 0; i < length; i++) {
|
||||
+ int core;
|
||||
+
|
||||
+ parent_offset = GPOINTER_TO_UINT(g_queue_pop_head(list));
|
||||
+ for (core = 0; core < ms->smp.cores; core++) {
|
||||
+ uint32_t priv_rsrc[3] = {};
|
||||
+ priv_rsrc[0] = table_data->len - pptt_start; /* L2 cache offset */
|
||||
+ build_cache_hierarchy_node(table_data, 0, ARM_L2_CACHE);
|
||||
+
|
||||
+ if (unified_l1) {
|
||||
+ priv_rsrc[1] = table_data->len - pptt_start; /* L1 cache offset */
|
||||
+ build_cache_hierarchy_node(table_data, priv_rsrc[0], ARM_L1_CACHE);
|
||||
+ } else {
|
||||
+ priv_rsrc[1] = table_data->len - pptt_start; /* L1 dcache offset */
|
||||
+ build_cache_hierarchy_node(table_data, priv_rsrc[0], ARM_L1D_CACHE);
|
||||
+ priv_rsrc[2] = table_data->len - pptt_start; /* L1 icache offset */
|
||||
+ build_cache_hierarchy_node(table_data, priv_rsrc[0], ARM_L1I_CACHE);
|
||||
+ }
|
||||
+
|
||||
+ if (ms->smp.threads > 1) {
|
||||
+ g_queue_push_tail(list,
|
||||
+ GUINT_TO_POINTER(table_data->len - pptt_start));
|
||||
+ build_processor_hierarchy_node(
|
||||
+ table_data,
|
||||
+ (0 << 0), /* not a physical package */
|
||||
+ parent_offset, core, priv_rsrc, 3);
|
||||
+ } else {
|
||||
+ build_processor_hierarchy_node(
|
||||
+ table_data,
|
||||
+ (1 << 1) | /* ACPI Processor ID valid */
|
||||
+ (1 << 3), /* Node is a Leaf */
|
||||
+ parent_offset, uid++, priv_rsrc, 3);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ length = g_queue_get_length(list);
|
||||
+ for (i = 0; i < length; i++) {
|
||||
+ int thread;
|
||||
+
|
||||
+ parent_offset = GPOINTER_TO_UINT(g_queue_pop_head(list));
|
||||
+ for (thread = 0; thread < ms->smp.threads; thread++) {
|
||||
+ build_processor_hierarchy_node(
|
||||
+ table_data,
|
||||
+ (1 << 1) | /* ACPI Processor ID valid */
|
||||
+ (1 << 2) | /* Processor is a Thread */
|
||||
+ (1 << 3), /* Node is a Leaf */
|
||||
+ parent_offset, uid++, NULL, 0);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ g_queue_free(list);
|
||||
+ acpi_table_end(linker, &table);
|
||||
+}
|
||||
+
|
||||
static void acpi_dsdt_add_psd(Aml *dev, int cpus)
|
||||
{
|
||||
Aml *pkg;
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index e31c289968..a9efcec85e 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -401,6 +401,39 @@ static void fdt_add_timer_nodes(const VirtMachineState *vms)
|
||||
INTID_TO_PPI(ARCH_TIMER_NS_EL2_IRQ), irqflags);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * In CLIDR_EL1 exposed to guest by the hypervisor, L1 cache type
|
||||
+ * maybe unified or seperate ins and data. We need to read the
|
||||
+ * guest visable CLIDR_EL1 and check L1 cache type.
|
||||
+ */
|
||||
+bool cpu_l1_cache_unified(int cpu)
|
||||
+{
|
||||
+ bool unified = false;
|
||||
+ uint64_t clidr;
|
||||
+ ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(cpu));
|
||||
+ CPUState *cs = CPU(armcpu);
|
||||
+ int ret;
|
||||
+
|
||||
+ if (kvm_enabled()) {
|
||||
+ struct kvm_one_reg reg = {
|
||||
+ .id = ARM64_REG_CLIDR_EL1,
|
||||
+ .addr = (uintptr_t)&clidr
|
||||
+ };
|
||||
+
|
||||
+ ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®);
|
||||
+ if (ret) {
|
||||
+ error_setg(&error_fatal, "Get vCPU clidr from KVM failed:%d", ret);
|
||||
+ return unified;
|
||||
+ }
|
||||
+
|
||||
+ if (CLIDR_CTYPE(clidr, 1) == CTYPE_UNIFIED) {
|
||||
+ unified = true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return unified;
|
||||
+}
|
||||
+
|
||||
static void fdt_add_l3cache_nodes(const VirtMachineState *vms)
|
||||
{
|
||||
int i;
|
||||
@@ -415,9 +448,10 @@ static void fdt_add_l3cache_nodes(const VirtMachineState *vms)
|
||||
qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "cache");
|
||||
qemu_fdt_setprop_string(ms->fdt, nodename, "cache-unified", "true");
|
||||
qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-level", 3);
|
||||
- qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-size", 0x2000000);
|
||||
- qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-line-size", 128);
|
||||
- qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-sets", 2048);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-size", ARM_L3CACHE_SIZE);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-line-size",
|
||||
+ ARM_L3CACHE_LINE_SIZE);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-sets", ARM_L3CACHE_SETS);
|
||||
qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle",
|
||||
qemu_fdt_alloc_phandle(ms->fdt));
|
||||
g_free(nodename);
|
||||
@@ -436,10 +470,12 @@ static void fdt_add_l2cache_nodes(const VirtMachineState *vms)
|
||||
char *nodename = g_strdup_printf("/cpus/l2-cache%d", cpu);
|
||||
|
||||
qemu_fdt_add_subnode(ms->fdt, nodename);
|
||||
+ qemu_fdt_setprop_string(ms->fdt, nodename, "cache-unified", "true");
|
||||
qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "cache");
|
||||
- qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-size", 0x80000);
|
||||
- qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-line-size", 64);
|
||||
- qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-sets", 1024);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-size", ARM_L2CACHE_SIZE);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-line-size",
|
||||
+ ARM_L2CACHE_LINE_SIZE);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-sets", ARM_L2CACHE_SETS);
|
||||
qemu_fdt_setprop_phandle(ms->fdt, nodename, "next-level-cache",
|
||||
next_path);
|
||||
qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle",
|
||||
@@ -453,18 +489,32 @@ static void fdt_add_l2cache_nodes(const VirtMachineState *vms)
|
||||
static void fdt_add_l1cache_prop(const VirtMachineState *vms,
|
||||
char *nodename, int cpu)
|
||||
{
|
||||
- const MachineState *ms = MACHINE(vms);
|
||||
- char *cachename = g_strdup_printf("/cpus/l2-cache%d", cpu);
|
||||
-
|
||||
- qemu_fdt_setprop_cell(ms->fdt, nodename, "d-cache-size", 0x10000);
|
||||
- qemu_fdt_setprop_cell(ms->fdt, nodename, "d-cache-line-size", 64);
|
||||
- qemu_fdt_setprop_cell(ms->fdt, nodename, "d-cache-sets", 256);
|
||||
- qemu_fdt_setprop_cell(ms->fdt, nodename, "i-cache-size", 0x10000);
|
||||
- qemu_fdt_setprop_cell(ms->fdt, nodename, "i-cache-line-size", 64);
|
||||
- qemu_fdt_setprop_cell(ms->fdt, nodename, "i-cache-sets", 256);
|
||||
- qemu_fdt_setprop_phandle(ms->fdt, nodename, "next-level-cache",
|
||||
- cachename);
|
||||
- g_free(cachename);
|
||||
+ const MachineState *ms = MACHINE(vms);
|
||||
+ char *next_path = g_strdup_printf("/cpus/l2-cache%d", cpu);
|
||||
+ bool unified_l1 = cpu_l1_cache_unified(0);
|
||||
+
|
||||
+ if (unified_l1) {
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-size", ARM_L1CACHE_SIZE);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-line-size",
|
||||
+ ARM_L1CACHE_LINE_SIZE);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "cache-sets", ARM_L1CACHE_SETS);
|
||||
+ } else {
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "d-cache-size",
|
||||
+ ARM_L1DCACHE_SIZE);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "d-cache-line-size",
|
||||
+ ARM_L1DCACHE_LINE_SIZE);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "d-cache-sets",
|
||||
+ ARM_L1DCACHE_SETS);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "i-cache-size",
|
||||
+ ARM_L1ICACHE_SIZE);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "i-cache-line-size",
|
||||
+ ARM_L1ICACHE_LINE_SIZE);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, nodename, "i-cache-sets",
|
||||
+ ARM_L1ICACHE_SETS);
|
||||
+ }
|
||||
+ qemu_fdt_setprop_phandle(ms->fdt, nodename, "next-level-cache", next_path);
|
||||
+
|
||||
+ g_free(next_path);
|
||||
}
|
||||
|
||||
static void fdt_add_cpu_nodes(const VirtMachineState *vms)
|
||||
diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
|
||||
index 7281c281f6..91f9cbf4f1 100644
|
||||
--- a/include/hw/acpi/aml-build.h
|
||||
+++ b/include/hw/acpi/aml-build.h
|
||||
@@ -221,51 +221,6 @@ struct AcpiBuildTables {
|
||||
BIOSLinker *linker;
|
||||
} AcpiBuildTables;
|
||||
|
||||
-/* Definitions of the hardcoded cache info*/
|
||||
-
|
||||
-typedef enum {
|
||||
- ARM_L1D_CACHE,
|
||||
- ARM_L1I_CACHE,
|
||||
- ARM_L2_CACHE,
|
||||
- ARM_L3_CACHE
|
||||
-} ArmCacheType;
|
||||
-
|
||||
-/* L1 data cache: */
|
||||
-#define ARM_L1DCACHE_SIZE 65536
|
||||
-#define ARM_L1DCACHE_SETS 256
|
||||
-#define ARM_L1DCACHE_ASSOCIATIVITY 4
|
||||
-#define ARM_L1DCACHE_ATTRIBUTES 2
|
||||
-#define ARM_L1DCACHE_LINE_SIZE 64
|
||||
-
|
||||
-/* L1 instruction cache: */
|
||||
-#define ARM_L1ICACHE_SIZE 65536
|
||||
-#define ARM_L1ICACHE_SETS 256
|
||||
-#define ARM_L1ICACHE_ASSOCIATIVITY 4
|
||||
-#define ARM_L1ICACHE_ATTRIBUTES 4
|
||||
-#define ARM_L1ICACHE_LINE_SIZE 64
|
||||
-
|
||||
-/* Level 2 unified cache: */
|
||||
-#define ARM_L2CACHE_SIZE 524288
|
||||
-#define ARM_L2CACHE_SETS 1024
|
||||
-#define ARM_L2CACHE_ASSOCIATIVITY 8
|
||||
-#define ARM_L2CACHE_ATTRIBUTES 10
|
||||
-#define ARM_L2CACHE_LINE_SIZE 64
|
||||
-
|
||||
-/* Level 3 unified cache: */
|
||||
-#define ARM_L3CACHE_SIZE 33554432
|
||||
-#define ARM_L3CACHE_SETS 2048
|
||||
-#define ARM_L3CACHE_ASSOCIATIVITY 15
|
||||
-#define ARM_L3CACHE_ATTRIBUTES 10
|
||||
-#define ARM_L3CACHE_LINE_SIZE 128
|
||||
-
|
||||
-struct offset_status {
|
||||
- uint32_t parent;
|
||||
- uint32_t l2_offset;
|
||||
- uint32_t l1d_offset;
|
||||
- uint32_t l1i_offset;
|
||||
-};
|
||||
-
|
||||
-
|
||||
typedef
|
||||
struct CrsRangeEntry {
|
||||
uint64_t base;
|
||||
@@ -460,6 +415,7 @@ Aml *aml_sizeof(Aml *arg);
|
||||
Aml *aml_concatenate(Aml *source1, Aml *source2, Aml *target);
|
||||
Aml *aml_object_type(Aml *object);
|
||||
|
||||
+void build_append_byte(GArray *array, uint8_t val);
|
||||
void build_append_int_noprefix(GArray *table, uint64_t value, int size);
|
||||
|
||||
typedef struct AcpiTable {
|
||||
@@ -537,10 +493,12 @@ void build_srat_memory(GArray *table_data, uint64_t base,
|
||||
void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms,
|
||||
const char *oem_id, const char *oem_table_id);
|
||||
|
||||
-void build_pptt(GArray *table_data, BIOSLinker *linker, MachineState *ms,
|
||||
- const char *oem_id, const char *oem_table_id);
|
||||
+void build_processor_hierarchy_node(GArray *tbl, uint32_t flags,
|
||||
+ uint32_t parent, uint32_t id,
|
||||
+ uint32_t *priv_rsrc,
|
||||
+ uint32_t priv_num);
|
||||
|
||||
-void build_pptt_arm(GArray *table_data, BIOSLinker *linker, MachineState *ms,
|
||||
+void build_pptt(GArray *table_data, BIOSLinker *linker, MachineState *ms,
|
||||
const char *oem_id, const char *oem_table_id);
|
||||
|
||||
void build_fadt(GArray *tbl, BIOSLinker *linker, const AcpiFadtData *f,
|
||||
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
|
||||
index 76a0d3fa5b..4b7dc61c24 100644
|
||||
--- a/include/hw/arm/virt.h
|
||||
+++ b/include/hw/arm/virt.h
|
||||
@@ -47,6 +47,65 @@
|
||||
/* See Linux kernel arch/arm64/include/asm/pvclock-abi.h */
|
||||
#define PVTIME_SIZE_PER_CPU 64
|
||||
|
||||
+/* ARM CLIDR_EL1 related definitions */
|
||||
+/* Ctypen, bits[3(n - 1) + 2 : 3(n - 1)], for n = 1 to 7 */
|
||||
+#define CTYPE_NONE 0b000
|
||||
+#define CTYPE_INS 0b001
|
||||
+#define CTYPE_DATA 0b010
|
||||
+#define CTYPE_INS_DATA 0b011
|
||||
+#define CTYPE_UNIFIED 0b100
|
||||
+
|
||||
+#define ARM64_REG_CLIDR_EL1 ARM64_SYS_REG(3, 1, 0, 0, 1)
|
||||
+
|
||||
+#define CLIDR_CTYPE_SHIFT(level) (3 * (level - 1))
|
||||
+#define CLIDR_CTYPE_MASK(level) (7 << CLIDR_CTYPE_SHIFT(level))
|
||||
+#define CLIDR_CTYPE(clidr, level) \
|
||||
+ (((clidr) & CLIDR_CTYPE_MASK(level)) >> CLIDR_CTYPE_SHIFT(level))
|
||||
+
|
||||
+/* L1 data cache */
|
||||
+#define ARM_L1DCACHE_SIZE 65536
|
||||
+#define ARM_L1DCACHE_SETS 256
|
||||
+#define ARM_L1DCACHE_ASSOCIATIVITY 4
|
||||
+#define ARM_L1DCACHE_ATTRIBUTES 2
|
||||
+#define ARM_L1DCACHE_LINE_SIZE 64
|
||||
+
|
||||
+/* L1 instruction cache */
|
||||
+#define ARM_L1ICACHE_SIZE 65536
|
||||
+#define ARM_L1ICACHE_SETS 256
|
||||
+#define ARM_L1ICACHE_ASSOCIATIVITY 4
|
||||
+#define ARM_L1ICACHE_ATTRIBUTES 4
|
||||
+#define ARM_L1ICACHE_LINE_SIZE 64
|
||||
+
|
||||
+/* L1 unified cache */
|
||||
+#define ARM_L1CACHE_SIZE 131072
|
||||
+#define ARM_L1CACHE_SETS 256
|
||||
+#define ARM_L1CACHE_ASSOCIATIVITY 4
|
||||
+#define ARM_L1CACHE_ATTRIBUTES 10
|
||||
+#define ARM_L1CACHE_LINE_SIZE 128
|
||||
+
|
||||
+/* L2 unified cache */
|
||||
+#define ARM_L2CACHE_SIZE 524288
|
||||
+#define ARM_L2CACHE_SETS 1024
|
||||
+#define ARM_L2CACHE_ASSOCIATIVITY 8
|
||||
+#define ARM_L2CACHE_ATTRIBUTES 10
|
||||
+#define ARM_L2CACHE_LINE_SIZE 64
|
||||
+
|
||||
+/* L3 unified cache */
|
||||
+#define ARM_L3CACHE_SIZE 33554432
|
||||
+#define ARM_L3CACHE_SETS 2048
|
||||
+#define ARM_L3CACHE_ASSOCIATIVITY 15
|
||||
+#define ARM_L3CACHE_ATTRIBUTES 10
|
||||
+#define ARM_L3CACHE_LINE_SIZE 128
|
||||
+
|
||||
+/* Definitions of the hardcoded cache info */
|
||||
+typedef enum {
|
||||
+ ARM_L1D_CACHE,
|
||||
+ ARM_L1I_CACHE,
|
||||
+ ARM_L1_CACHE,
|
||||
+ ARM_L2_CACHE,
|
||||
+ ARM_L3_CACHE
|
||||
+} ArmCacheType;
|
||||
+
|
||||
enum {
|
||||
VIRT_FLASH,
|
||||
VIRT_MEM,
|
||||
@@ -194,6 +253,7 @@ OBJECT_DECLARE_TYPE(VirtMachineState, VirtMachineClass, VIRT_MACHINE)
|
||||
|
||||
void virt_acpi_setup(VirtMachineState *vms);
|
||||
bool virt_is_acpi_enabled(VirtMachineState *vms);
|
||||
+bool cpu_l1_cache_unified(int cpu);
|
||||
|
||||
/* Return number of redistributors that fit in the specified region */
|
||||
static uint32_t virt_redist_capacity(VirtMachineState *vms, int region)
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
36
hw-audio-hda-free-timer-on-exit.patch
Normal file
36
hw-audio-hda-free-timer-on-exit.patch
Normal file
@ -0,0 +1,36 @@
|
||||
From 28bf94c86d3914b8b517dae483d1d69b3afabacc Mon Sep 17 00:00:00 2001
|
||||
From: qihao_yewu <qihao_yewu@cmss.chinamobile.com>
|
||||
Date: Tue, 5 Nov 2024 07:03:48 -0500
|
||||
Subject: [PATCH] hw/audio/hda: free timer on exit
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
cheery-pick from f27206ceedbe2efae37c8d143c5eb2db05251508
|
||||
|
||||
Fixes: 280c1e1cd ("audio/hda: create millisecond timers that handle IO")
|
||||
|
||||
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||
Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com>
|
||||
Message-ID: <20241008125028.1177932-2-marcandre.lureau@redhat.com>
|
||||
Signed-off-by: qihao_yewu <qihao_yewu@cmss.chinamobile.com>
|
||||
---
|
||||
hw/audio/hda-codec.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/audio/hda-codec.c b/hw/audio/hda-codec.c
|
||||
index 0bc20d49f6..19f401cabe 100644
|
||||
--- a/hw/audio/hda-codec.c
|
||||
+++ b/hw/audio/hda-codec.c
|
||||
@@ -751,7 +751,7 @@ static void hda_audio_exit(HDACodecDevice *hda)
|
||||
continue;
|
||||
}
|
||||
if (a->use_timer) {
|
||||
- timer_del(st->buft);
|
||||
+ timer_free(st->buft);
|
||||
}
|
||||
if (st->output) {
|
||||
AUD_close_out(&a->card, st->voice.out);
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
37
hw-cxl-Ensure-there-is-enough-data-for-the-header-in.patch
Normal file
37
hw-cxl-Ensure-there-is-enough-data-for-the-header-in.patch
Normal file
@ -0,0 +1,37 @@
|
||||
From 830009038a73e496598c26679b7e30d7e931a1cf Mon Sep 17 00:00:00 2001
|
||||
From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
|
||||
Date: Fri, 1 Nov 2024 13:39:16 +0000
|
||||
Subject: [PATCH] hw/cxl: Ensure there is enough data for the header in
|
||||
cmd_ccls_set_lsa()
|
||||
|
||||
The properties of the requested set command cannot be established if
|
||||
len_in is less than the size of the header.
|
||||
|
||||
Reported-by: Esifiel <esifiel@gmail.com>
|
||||
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
|
||||
Message-Id: <20241101133917.27634-10-Jonathan.Cameron@huawei.com>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Zhongrui Tang <tangzhongrui_yewu@cmss.chinamobile.com>
|
||||
---
|
||||
hw/cxl/cxl-mailbox-utils.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c
|
||||
index 6eff56fb1b..9f2304389b 100644
|
||||
--- a/hw/cxl/cxl-mailbox-utils.c
|
||||
+++ b/hw/cxl/cxl-mailbox-utils.c
|
||||
@@ -897,8 +897,8 @@ static CXLRetCode cmd_ccls_set_lsa(const struct cxl_cmd *cmd,
|
||||
const size_t hdr_len = offsetof(struct set_lsa_pl, data);
|
||||
|
||||
*len_out = 0;
|
||||
- if (!len_in) {
|
||||
- return CXL_MBOX_SUCCESS;
|
||||
+ if (len_in < hdr_len) {
|
||||
+ return CXL_MBOX_INVALID_PAYLOAD_LENGTH;
|
||||
}
|
||||
|
||||
if (set_lsa_payload->offset + len_in > cvc->get_lsa_size(ct3d) + hdr_len) {
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
52
hw-pci-Add-parenthesis-to-PCI_BUILD_BDF-macro.patch
Normal file
52
hw-pci-Add-parenthesis-to-PCI_BUILD_BDF-macro.patch
Normal file
@ -0,0 +1,52 @@
|
||||
From 3c108b874b8b142a42939d785d6706a44e7035d7 Mon Sep 17 00:00:00 2001
|
||||
From: Roque Arcudia Hernandez <roqueh@google.com>
|
||||
Date: Fri, 1 Nov 2024 21:59:23 +0000
|
||||
Subject: [PATCH] hw/pci: Add parenthesis to PCI_BUILD_BDF macro
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The bus parameter in the macro PCI_BUILD_BDF is not surrounded by
|
||||
parenthesis. This can create a compile error when warnings are
|
||||
treated as errors or can potentially create runtime errors due to the
|
||||
operator precedence.
|
||||
|
||||
For instance:
|
||||
|
||||
file.c:x:32: error: suggest parentheses around '-' inside '<<'
|
||||
[-Werror=parentheses]
|
||||
171 | uint16_t bdf = PCI_BUILD_BDF(a - b, sdev->devfn);
|
||||
| ~~^~~
|
||||
include/hw/pci/pci.h:19:41: note: in definition of macro
|
||||
'PCI_BUILD_BDF'
|
||||
19 | #define PCI_BUILD_BDF(bus, devfn) ((bus << 8) | (devfn))
|
||||
| ^~~
|
||||
cc1: all warnings being treated as errors
|
||||
|
||||
Signed-off-by: Roque Arcudia Hernandez <roqueh@google.com>
|
||||
Reviewed-by: Nabih Estefan <nabihestefan@google.com>
|
||||
Message-Id: <20241101215923.3399311-1-roqueh@google.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Signed-off-by: Zhongrui Tang <tangzhongrui_yewu@cmss.chinamobile.com>
|
||||
---
|
||||
include/hw/pci/pci.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
|
||||
index fa6313aabc..7cf7b5619a 100644
|
||||
--- a/include/hw/pci/pci.h
|
||||
+++ b/include/hw/pci/pci.h
|
||||
@@ -15,7 +15,7 @@ extern bool pci_available;
|
||||
#define PCI_BUS_NUM(x) (((x) >> 8) & 0xff)
|
||||
#define PCI_SLOT(devfn) (((devfn) >> 3) & 0x1f)
|
||||
#define PCI_FUNC(devfn) ((devfn) & 0x07)
|
||||
-#define PCI_BUILD_BDF(bus, devfn) ((bus << 8) | (devfn))
|
||||
+#define PCI_BUILD_BDF(bus, devfn) (((bus) << 8) | (devfn))
|
||||
#define PCI_BDF_TO_DEVFN(x) ((x) & 0xff)
|
||||
#define PCI_BUS_MAX 256
|
||||
#define PCI_DEVFN_MAX 256
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
593
hw-vfio-add-device-hct-based-on-vfio.patch
Normal file
593
hw-vfio-add-device-hct-based-on-vfio.patch
Normal file
@ -0,0 +1,593 @@
|
||||
From ebafa8d737b5f08e787803375d6e942ecdaef1a9 Mon Sep 17 00:00:00 2001
|
||||
From: Yabin Li <liyabin@hygon.cn>
|
||||
Date: Fri, 4 Aug 2023 21:09:08 +0800
|
||||
Subject: [PATCH] hw/vfio: add device hct based on vfio.
|
||||
|
||||
add hct device based on vfio, used to simulate ccp devices
|
||||
|
||||
Signed-off-by: Yabin Li <liyabin@hygon.cn>
|
||||
Signed-off-by: yangdepei <yangdepei@hygon.cn>
|
||||
---
|
||||
hw/vfio/Kconfig | 6 +
|
||||
hw/vfio/hct.c | 543 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
hw/vfio/meson.build | 1 +
|
||||
3 files changed, 550 insertions(+)
|
||||
create mode 100644 hw/vfio/hct.c
|
||||
|
||||
diff --git a/hw/vfio/Kconfig b/hw/vfio/Kconfig
|
||||
index 7cdba0560a..5f0d3c2d2b 100644
|
||||
--- a/hw/vfio/Kconfig
|
||||
+++ b/hw/vfio/Kconfig
|
||||
@@ -41,3 +41,9 @@ config VFIO_IGD
|
||||
bool
|
||||
default y if PC_PCI
|
||||
depends on VFIO_PCI
|
||||
+
|
||||
+config VFIO_HCT
|
||||
+ bool
|
||||
+ default y
|
||||
+ select VFIO
|
||||
+ depends on LINUX && PCI
|
||||
diff --git a/hw/vfio/hct.c b/hw/vfio/hct.c
|
||||
new file mode 100644
|
||||
index 0000000000..476e86c61d
|
||||
--- /dev/null
|
||||
+++ b/hw/vfio/hct.c
|
||||
@@ -0,0 +1,543 @@
|
||||
+/*
|
||||
+ * vfio based mediated ccp(hct) assignment support
|
||||
+ *
|
||||
+ * Copyright 2023 HYGON Corp.
|
||||
+ *
|
||||
+ * This work is licensed under the terms of the GNU GPL, version 2 or (at
|
||||
+ * your option) any later version. See the COPYING file in the top-level
|
||||
+ * directory.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/vfio.h>
|
||||
+#include <sys/ioctl.h>
|
||||
+#include <sys/mman.h>
|
||||
+#include <sys/stat.h>
|
||||
+#include <fcntl.h>
|
||||
+
|
||||
+#include "qemu/osdep.h"
|
||||
+#include "qemu/queue.h"
|
||||
+#include "qemu/main-loop.h"
|
||||
+#include "qemu/log.h"
|
||||
+#include "trace.h"
|
||||
+#include "hw/pci/pci.h"
|
||||
+#include "hw/vfio/pci.h"
|
||||
+#include "qemu/range.h"
|
||||
+#include "sysemu/kvm.h"
|
||||
+#include "hw/pci/msi.h"
|
||||
+#include "qemu/error-report.h"
|
||||
+#include "qapi/error.h"
|
||||
+#include "hw/qdev-properties.h"
|
||||
+
|
||||
+#define MAX_CCP_CNT 16
|
||||
+#define PAGE_SIZE 4096
|
||||
+#define HCT_SHARED_MEMORY_SIZE (PAGE_SIZE * MAX_CCP_CNT)
|
||||
+#define CCP_INDEX_BYTES 4
|
||||
+#define PATH_MAX 4096
|
||||
+#define TYPE_HCT_DEV "hct"
|
||||
+#define PCI_HCT_DEV(obj) OBJECT_CHECK(HCTDevState, (obj), TYPE_HCT_DEV)
|
||||
+#define HCT_MMIO_SIZE (1 << 20)
|
||||
+#define HCT_MAX_PASID (1 << 8)
|
||||
+
|
||||
+#define PCI_VENDOR_ID_HYGON_CCP 0x1d94
|
||||
+#define PCI_DEVICE_ID_HYGON_CCP 0x1468
|
||||
+
|
||||
+#define HCT_SHARE_DEV "/dev/hct_share"
|
||||
+
|
||||
+#define HCT_VERSION_STRING "0.2"
|
||||
+#define DEF_VERSION_STRING "0.1"
|
||||
+#define VERSION_SIZE 16
|
||||
+
|
||||
+#define HCT_SHARE_IOC_TYPE 'C'
|
||||
+#define HCT_SHARE_OP_TYPE 0x01
|
||||
+#define HCT_SHARE_OP _IOWR(HCT_SHARE_IOC_TYPE, \
|
||||
+ HCT_SHARE_OP_TYPE, \
|
||||
+ struct hct_dev_ctrl)
|
||||
+#define HCT_SHARE_OP_DMA_MAP 0x01
|
||||
+#define HCT_SHARE_OP_GET_ID 0x03
|
||||
+#define HCT_SHARE_OP_GET_PASID 0x04
|
||||
+#define HCT_SHARE_OP_DMA_UNMAP 0x05
|
||||
+#define HCT_SHARE_OP_GET_VERSION 0x06
|
||||
+
|
||||
+/* BARS */
|
||||
+#define HCT_REG_BAR_IDX 2
|
||||
+#define HCT_SHARED_BAR_IDX 3
|
||||
+#define HCT_PASID_BAR_IDX 4
|
||||
+
|
||||
+#define PASID_OFFSET 40
|
||||
+
|
||||
+static volatile struct hct_data {
|
||||
+ int init;
|
||||
+ int hct_fd;
|
||||
+ unsigned long pasid;
|
||||
+ uint8_t *pasid_memory;
|
||||
+ uint8_t *hct_shared_memory;
|
||||
+ uint8_t ccp_index[MAX_CCP_CNT];
|
||||
+ uint8_t ccp_cnt;
|
||||
+} hct_data;
|
||||
+
|
||||
+typedef struct SharedDevice {
|
||||
+ PCIDevice dev;
|
||||
+ int shared_memory_offset;
|
||||
+} SharedDevice;
|
||||
+
|
||||
+typedef struct HctDevState {
|
||||
+ SharedDevice sdev;
|
||||
+ VFIODevice vdev;
|
||||
+ MemoryRegion mmio;
|
||||
+ MemoryRegion shared;
|
||||
+ MemoryRegion pasid;
|
||||
+ void *maps[PCI_NUM_REGIONS];
|
||||
+} HCTDevState;
|
||||
+
|
||||
+struct hct_dev_ctrl {
|
||||
+ unsigned char op;
|
||||
+ unsigned char rsvd[3];
|
||||
+ union {
|
||||
+ unsigned char version[VERSION_SIZE];
|
||||
+ struct {
|
||||
+ unsigned long vaddr;
|
||||
+ unsigned long iova;
|
||||
+ unsigned long size;
|
||||
+ };
|
||||
+ unsigned int id;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+static int pasid_get_and_init(HCTDevState *state)
|
||||
+{
|
||||
+ struct hct_dev_ctrl ctrl;
|
||||
+ int ret;
|
||||
+
|
||||
+ ctrl.op = HCT_SHARE_OP_GET_PASID;
|
||||
+ ctrl.id = -1;
|
||||
+ ret = ioctl(hct_data.hct_fd, HCT_SHARE_OP, &ctrl);
|
||||
+ if (ret < 0) {
|
||||
+ ret = -errno;
|
||||
+ error_report("GET_PASID fail: %d", -errno);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ *hct_data.pasid_memory = ctrl.id;
|
||||
+ hct_data.pasid = ctrl.id;
|
||||
+
|
||||
+out:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static const MemoryRegionOps hct_mmio_ops = {
|
||||
+ .endianness = DEVICE_NATIVE_ENDIAN,
|
||||
+ .valid =
|
||||
+ {
|
||||
+ .min_access_size = 4,
|
||||
+ .max_access_size = 4,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static void vfio_hct_detach_device(HCTDevState *state)
|
||||
+{
|
||||
+ vfio_detach_device(&state->vdev);
|
||||
+ g_free(state->vdev.name);
|
||||
+}
|
||||
+
|
||||
+static void vfio_hct_exit(PCIDevice *dev)
|
||||
+{
|
||||
+ HCTDevState *state = PCI_HCT_DEV(dev);
|
||||
+
|
||||
+ vfio_hct_detach_device(state);
|
||||
+
|
||||
+ if (hct_data.hct_fd) {
|
||||
+ qemu_close(hct_data.hct_fd);
|
||||
+ hct_data.hct_fd = 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static Property vfio_hct_properties[] = {
|
||||
+ DEFINE_PROP_STRING("sysfsdev", HCTDevState, vdev.sysfsdev),
|
||||
+ DEFINE_PROP_END_OF_LIST(),
|
||||
+};
|
||||
+
|
||||
+static void vfio_ccp_compute_needs_reset(VFIODevice *vdev)
|
||||
+{
|
||||
+ vdev->needs_reset = false;
|
||||
+}
|
||||
+
|
||||
+struct VFIODeviceOps vfio_ccp_ops = {
|
||||
+ .vfio_compute_needs_reset = vfio_ccp_compute_needs_reset,
|
||||
+};
|
||||
+
|
||||
+/* create BAR2, BAR3 and BAR4 space for the virtual machine. */
|
||||
+static int vfio_hct_region_mmap(HCTDevState *state)
|
||||
+{
|
||||
+ int ret;
|
||||
+ int i;
|
||||
+ struct vfio_region_info *info;
|
||||
+
|
||||
+ for (i = 0; i < PCI_ROM_SLOT; i++) {
|
||||
+ ret = vfio_get_region_info(&state->vdev, i, &info);
|
||||
+ if (ret)
|
||||
+ goto out;
|
||||
+
|
||||
+ if (info->size) {
|
||||
+ state->maps[i] = mmap(NULL, info->size, PROT_READ | PROT_WRITE,
|
||||
+ MAP_SHARED, state->vdev.fd, info->offset);
|
||||
+ if (state->maps[i] == MAP_FAILED) {
|
||||
+ ret = -errno;
|
||||
+ g_free(info);
|
||||
+ error_report("vfio mmap fail\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+ g_free(info);
|
||||
+ }
|
||||
+
|
||||
+ memory_region_init_io(&state->mmio, OBJECT(state), &hct_mmio_ops, state,
|
||||
+ "hct mmio", HCT_MMIO_SIZE);
|
||||
+ memory_region_init_ram_device_ptr(&state->mmio, OBJECT(state), "hct mmio",
|
||||
+ HCT_MMIO_SIZE,
|
||||
+ state->maps[HCT_REG_BAR_IDX]);
|
||||
+
|
||||
+ memory_region_init_io(&state->shared, OBJECT(state), &hct_mmio_ops, state,
|
||||
+ "hct shared memory", PAGE_SIZE);
|
||||
+ memory_region_init_ram_device_ptr(
|
||||
+ &state->shared, OBJECT(state), "hct shared memory", PAGE_SIZE,
|
||||
+ (void *)hct_data.hct_shared_memory +
|
||||
+ state->sdev.shared_memory_offset * PAGE_SIZE);
|
||||
+
|
||||
+ memory_region_init_io(&state->pasid, OBJECT(state), &hct_mmio_ops, state,
|
||||
+ "hct pasid", PAGE_SIZE);
|
||||
+ memory_region_init_ram_device_ptr(&state->pasid, OBJECT(state), "hct pasid",
|
||||
+ PAGE_SIZE, hct_data.pasid_memory);
|
||||
+
|
||||
+ pci_register_bar(&state->sdev.dev, HCT_REG_BAR_IDX,
|
||||
+ PCI_BASE_ADDRESS_SPACE_MEMORY, &state->mmio);
|
||||
+ pci_register_bar(&state->sdev.dev, HCT_SHARED_BAR_IDX,
|
||||
+ PCI_BASE_ADDRESS_SPACE_MEMORY, &state->shared);
|
||||
+ pci_register_bar(&state->sdev.dev, HCT_PASID_BAR_IDX,
|
||||
+ PCI_BASE_ADDRESS_SPACE_MEMORY, &state->pasid);
|
||||
+out:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int hct_check_duplicated_index(int index)
|
||||
+{
|
||||
+ int cnt;
|
||||
+ for (cnt = 0; cnt < hct_data.ccp_cnt; cnt++) {
|
||||
+ if (hct_data.ccp_index[cnt] == index) {
|
||||
+ error_report("many mdev shouldn't be mapped to one ccp in a "
|
||||
+ "virtual machine!\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ hct_data.ccp_index[hct_data.ccp_cnt++] = index;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int hct_get_ccp_index(HCTDevState *state)
|
||||
+{
|
||||
+ char path[PATH_MAX];
|
||||
+ char buf[CCP_INDEX_BYTES];
|
||||
+ int fd;
|
||||
+ int ret;
|
||||
+ int ccp_index;
|
||||
+
|
||||
+ snprintf(path, PATH_MAX, "%s/vendor/id", state->vdev.sysfsdev);
|
||||
+ fd = qemu_open_old(path, O_RDONLY);
|
||||
+ if (fd < 0) {
|
||||
+ error_report("open %s fail\n", path);
|
||||
+ return -errno;
|
||||
+ }
|
||||
+
|
||||
+ ret = read(fd, buf, sizeof(buf));
|
||||
+ if (ret < 0) {
|
||||
+ ret = -errno;
|
||||
+ error_report("read %s fail\n", path);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (1 != sscanf(buf, "%d", &ccp_index)) {
|
||||
+ ret = -errno;
|
||||
+ error_report("format addr %s fail\n", buf);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (!hct_check_duplicated_index(ccp_index)) {
|
||||
+ state->sdev.shared_memory_offset = ccp_index;
|
||||
+ } else {
|
||||
+ ret = -1;
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ qemu_close(fd);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int hct_api_version_check(void)
|
||||
+{
|
||||
+ struct hct_dev_ctrl ctrl;
|
||||
+ int ret;
|
||||
+
|
||||
+ ctrl.op = HCT_SHARE_OP_GET_VERSION;
|
||||
+ memcpy(ctrl.version, DEF_VERSION_STRING, sizeof(DEF_VERSION_STRING));
|
||||
+ ret = ioctl(hct_data.hct_fd, HCT_SHARE_OP, &ctrl);
|
||||
+ if (ret < 0) {
|
||||
+ error_report("ret %d, errno %d: fail to get hct.ko version, please "
|
||||
+ "update hct.ko to version 0.2.\n",
|
||||
+ ret, errno);
|
||||
+ return -1;
|
||||
+ } else if (memcmp(ctrl.version, HCT_VERSION_STRING,
|
||||
+ sizeof(HCT_VERSION_STRING)) < 0) {
|
||||
+ error_report("The API version %s is larger than hct.ko version %s, "
|
||||
+ "please update hct.ko to version 0.2\n",
|
||||
+ HCT_VERSION_STRING, ctrl.version);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int hct_shared_memory_init(void)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ hct_data.hct_shared_memory =
|
||||
+ mmap(NULL, HCT_SHARED_MEMORY_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
+ hct_data.hct_fd, 0);
|
||||
+ if (hct_data.hct_shared_memory == MAP_FAILED) {
|
||||
+ ret = -errno;
|
||||
+ error_report("map hct shared memory fail\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static void hct_listener_region_add(MemoryListener *listener,
|
||||
+ MemoryRegionSection *section)
|
||||
+{
|
||||
+ struct hct_dev_ctrl ctrl;
|
||||
+ hwaddr iova;
|
||||
+ Int128 llend, llsize;
|
||||
+ void *vaddr;
|
||||
+ int ret;
|
||||
+
|
||||
+ iova = REAL_HOST_PAGE_ALIGN(section->offset_within_address_space);
|
||||
+ llend = int128_make64(section->offset_within_address_space);
|
||||
+ llend = int128_add(llend, section->size);
|
||||
+ llend = int128_add(llend, int128_exts64(qemu_real_host_page_mask()));
|
||||
+
|
||||
+ if (int128_ge(int128_make64(iova), llend)) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (!section->mr->ram) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ vaddr = memory_region_get_ram_ptr(section->mr) +
|
||||
+ section->offset_within_region +
|
||||
+ (iova - section->offset_within_address_space);
|
||||
+ llsize = int128_sub(llend, int128_make64(iova));
|
||||
+
|
||||
+ ctrl.op = HCT_SHARE_OP_DMA_MAP;
|
||||
+ ctrl.iova = iova | (hct_data.pasid << PASID_OFFSET);
|
||||
+ ctrl.vaddr = (uint64_t)vaddr;
|
||||
+ ctrl.size = llsize;
|
||||
+ ret = ioctl(hct_data.hct_fd, HCT_SHARE_OP, &ctrl);
|
||||
+ if (ret < 0)
|
||||
+ error_report("VFIO_MAP_DMA: %d, iova=%lx", -errno, iova);
|
||||
+}
|
||||
+
|
||||
+static void hct_listener_region_del(MemoryListener *listener,
|
||||
+ MemoryRegionSection *section)
|
||||
+{
|
||||
+ struct hct_dev_ctrl ctrl;
|
||||
+ hwaddr iova;
|
||||
+ Int128 llend, llsize;
|
||||
+ int ret;
|
||||
+
|
||||
+ iova = REAL_HOST_PAGE_ALIGN(section->offset_within_address_space);
|
||||
+ llend = int128_make64(section->offset_within_address_space);
|
||||
+ llend = int128_add(llend, section->size);
|
||||
+ llend = int128_add(llend, int128_exts64(qemu_real_host_page_mask()));
|
||||
+
|
||||
+ if (int128_ge(int128_make64(iova), llend)) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (!section->mr->ram) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ llsize = int128_sub(llend, int128_make64(iova));
|
||||
+
|
||||
+ ctrl.op = HCT_SHARE_OP_DMA_UNMAP;
|
||||
+ ctrl.iova = iova | (hct_data.pasid << PASID_OFFSET);
|
||||
+ ctrl.size = llsize;
|
||||
+ ret = ioctl(hct_data.hct_fd, HCT_SHARE_OP, &ctrl);
|
||||
+ if (ret < 0)
|
||||
+ error_report("VFIO_UNMAP_DMA: %d", -errno);
|
||||
+}
|
||||
+
|
||||
+static MemoryListener hct_memory_listener = {
|
||||
+ .region_add = hct_listener_region_add,
|
||||
+ .region_del = hct_listener_region_del,
|
||||
+};
|
||||
+
|
||||
+static void hct_data_uninit(HCTDevState *state)
|
||||
+{
|
||||
+ if (hct_data.hct_fd) {
|
||||
+ qemu_close(hct_data.hct_fd);
|
||||
+ hct_data.hct_fd = 0;
|
||||
+ }
|
||||
+
|
||||
+ if (hct_data.pasid) {
|
||||
+ hct_data.pasid = 0;
|
||||
+ }
|
||||
+
|
||||
+ if (hct_data.pasid_memory) {
|
||||
+ munmap(hct_data.pasid_memory, PAGE_SIZE);
|
||||
+ hct_data.pasid_memory = NULL;
|
||||
+ }
|
||||
+
|
||||
+ if (hct_data.hct_shared_memory) {
|
||||
+ munmap((void *)hct_data.hct_shared_memory, HCT_SHARED_MEMORY_SIZE);
|
||||
+ hct_data.hct_shared_memory = NULL;
|
||||
+ }
|
||||
+
|
||||
+ memory_listener_unregister(&hct_memory_listener);
|
||||
+}
|
||||
+
|
||||
+static int hct_data_init(HCTDevState *state)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ if (hct_data.init == 0) {
|
||||
+
|
||||
+ hct_data.hct_fd = qemu_open_old(HCT_SHARE_DEV, O_RDWR);
|
||||
+ if (hct_data.hct_fd < 0) {
|
||||
+ error_report("fail to open %s, errno %d.", HCT_SHARE_DEV, errno);
|
||||
+ ret = -errno;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ /* The hct.ko version number needs not to be less than 0.2. */
|
||||
+ ret = hct_api_version_check();
|
||||
+ if (ret)
|
||||
+ goto out;
|
||||
+
|
||||
+ /* assign a page to the virtual BAR3 of each CCP. */
|
||||
+ ret = hct_shared_memory_init();
|
||||
+ if (ret)
|
||||
+ goto out;
|
||||
+
|
||||
+ hct_data.pasid_memory = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
|
||||
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
+ if (hct_data.pasid_memory < 0)
|
||||
+ goto unmap_shared_memory_exit;
|
||||
+
|
||||
+ /* assign a unique pasid to each virtual machine. */
|
||||
+ ret = pasid_get_and_init(state);
|
||||
+ if (ret < 0)
|
||||
+ goto unmap_pasid_memory_exit;
|
||||
+
|
||||
+ /* perform DMA_MAP and DMA_UNMAP operations on all memories of the
|
||||
+ * virtual machine. */
|
||||
+ memory_listener_register(&hct_memory_listener, &address_space_memory);
|
||||
+
|
||||
+ hct_data.init = 1;
|
||||
+ }
|
||||
+
|
||||
+ return hct_get_ccp_index(state);
|
||||
+
|
||||
+unmap_pasid_memory_exit:
|
||||
+ munmap(hct_data.pasid_memory, PAGE_SIZE);
|
||||
+
|
||||
+unmap_shared_memory_exit:
|
||||
+ munmap((void *)hct_data.hct_shared_memory, HCT_SHARED_MEMORY_SIZE);
|
||||
+
|
||||
+out:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+/* When device is loaded */
|
||||
+static void vfio_hct_realize(PCIDevice *pci_dev, Error **errp)
|
||||
+{
|
||||
+ int ret;
|
||||
+ char *mdevid;
|
||||
+ Error *err = NULL;
|
||||
+ HCTDevState *state = PCI_HCT_DEV(pci_dev);
|
||||
+
|
||||
+ /* parsing mdev device name from startup scripts */
|
||||
+ mdevid = g_path_get_basename(state->vdev.sysfsdev);
|
||||
+ state->vdev.name = g_strdup_printf("%s", mdevid);
|
||||
+
|
||||
+ ret = hct_data_init(state);
|
||||
+ if (ret < 0) {
|
||||
+ g_free(state->vdev.name);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ ret = vfio_attach_device(state->vdev.name, &state->vdev,
|
||||
+ pci_device_iommu_address_space(pci_dev), &err);
|
||||
+
|
||||
+ if (ret) {
|
||||
+ error_report("attach device failed, name = %s", state->vdev.name);
|
||||
+ goto data_uninit_out;
|
||||
+ }
|
||||
+
|
||||
+ state->vdev.ops = &vfio_ccp_ops;
|
||||
+ state->vdev.dev = &state->sdev.dev.qdev;
|
||||
+
|
||||
+ ret = vfio_hct_region_mmap(state);
|
||||
+ if (ret < 0)
|
||||
+ goto detach_device_out;
|
||||
+
|
||||
+ return;
|
||||
+
|
||||
+detach_device_out:
|
||||
+ vfio_hct_detach_device(state);
|
||||
+
|
||||
+data_uninit_out:
|
||||
+ hct_data_uninit(state);
|
||||
+
|
||||
+out:
|
||||
+ return;
|
||||
+}
|
||||
+
|
||||
+static void hct_dev_class_init(ObjectClass *klass, void *data)
|
||||
+{
|
||||
+ DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
+ PCIDeviceClass *pdc = PCI_DEVICE_CLASS(klass);
|
||||
+
|
||||
+ dc->desc = "HCT Device";
|
||||
+ device_class_set_props(dc, vfio_hct_properties);
|
||||
+
|
||||
+ pdc->realize = vfio_hct_realize;
|
||||
+ pdc->exit = vfio_hct_exit;
|
||||
+ pdc->vendor_id = PCI_VENDOR_ID_HYGON_CCP;
|
||||
+ pdc->device_id = PCI_DEVICE_ID_HYGON_CCP;
|
||||
+ pdc->class_id = PCI_CLASS_CRYPT_OTHER;
|
||||
+ set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
+
|
||||
+ return;
|
||||
+}
|
||||
+
|
||||
+static const TypeInfo pci_hct_info = {
|
||||
+ .name = TYPE_HCT_DEV,
|
||||
+ .parent = TYPE_PCI_DEVICE,
|
||||
+ .instance_size = sizeof(HCTDevState),
|
||||
+ .class_init = hct_dev_class_init,
|
||||
+ .interfaces =
|
||||
+ (InterfaceInfo[]){
|
||||
+ {INTERFACE_CONVENTIONAL_PCI_DEVICE},
|
||||
+ {},
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static void hct_register_types(void) {
|
||||
+ type_register_static(&pci_hct_info);
|
||||
+}
|
||||
+
|
||||
+type_init(hct_register_types);
|
||||
diff --git a/hw/vfio/meson.build b/hw/vfio/meson.build
|
||||
index 2a6912c940..b1db4c8605 100644
|
||||
--- a/hw/vfio/meson.build
|
||||
+++ b/hw/vfio/meson.build
|
||||
@@ -17,5 +17,6 @@ vfio_ss.add(when: 'CONFIG_VFIO_XGMAC', if_true: files('calxeda-xgmac.c'))
|
||||
vfio_ss.add(when: 'CONFIG_VFIO_AMD_XGBE', if_true: files('amd-xgbe.c'))
|
||||
vfio_ss.add(when: 'CONFIG_VFIO_AP', if_true: files('ap.c'))
|
||||
vfio_ss.add(when: 'CONFIG_VFIO_IGD', if_true: files('igd.c'))
|
||||
+vfio_ss.add(when: 'CONFIG_VFIO_HCT', if_true: files('hct.c'))
|
||||
|
||||
specific_ss.add_all(when: 'CONFIG_VFIO', if_true: vfio_ss)
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
28
hw-vfio-hct-fix-ccp_index-error-caused-by-uninitiali.patch
Normal file
28
hw-vfio-hct-fix-ccp_index-error-caused-by-uninitiali.patch
Normal file
@ -0,0 +1,28 @@
|
||||
From 360bd43ff3c4e4938ee8af1a5ccf981152f7ca95 Mon Sep 17 00:00:00 2001
|
||||
From: yangdepei <yangdepei@hygon.cn>
|
||||
Date: Mon, 26 Aug 2024 15:40:25 +0800
|
||||
Subject: [PATCH] hw/vfio/hct: fix ccp_index error caused by uninitialized buf
|
||||
|
||||
Signed-off-by: yangdepei <yangdepei@hygon.cn>
|
||||
---
|
||||
hw/vfio/hct.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/vfio/hct.c b/hw/vfio/hct.c
|
||||
index 790bb78439..9374e95e85 100644
|
||||
--- a/hw/vfio/hct.c
|
||||
+++ b/hw/vfio/hct.c
|
||||
@@ -235,8 +235,8 @@ static int hct_check_duplicated_index(int index)
|
||||
|
||||
static int hct_get_ccp_index(HCTDevState *state)
|
||||
{
|
||||
- char path[PATH_MAX];
|
||||
- char buf[CCP_INDEX_BYTES];
|
||||
+ char path[PATH_MAX] = {0};
|
||||
+ char buf[CCP_INDEX_BYTES] = {0};
|
||||
int fd;
|
||||
int ret;
|
||||
int ccp_index;
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
79
hw-vfio-hct-qemu-startup-terminate-once-error-happen.patch
Normal file
79
hw-vfio-hct-qemu-startup-terminate-once-error-happen.patch
Normal file
@ -0,0 +1,79 @@
|
||||
From 32855e315c3050f09388f1335c0869bba065fbae Mon Sep 17 00:00:00 2001
|
||||
From: yangdepei <yangdepei@hygon.cn>
|
||||
Date: Fri, 27 Sep 2024 17:08:08 +0800
|
||||
Subject: [PATCH] hw/vfio/hct: qemu startup terminate once error happened in
|
||||
hct
|
||||
|
||||
Signed-off-by: yangdepei <yangdepei@hygon.cn>
|
||||
---
|
||||
hw/vfio/hct.c | 19 ++++++++++++++-----
|
||||
1 file changed, 14 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/hw/vfio/hct.c b/hw/vfio/hct.c
|
||||
index 9374e95e85..7fd3977182 100644
|
||||
--- a/hw/vfio/hct.c
|
||||
+++ b/hw/vfio/hct.c
|
||||
@@ -136,7 +136,9 @@ static const MemoryRegionOps hct_mmio_ops = {
|
||||
static void vfio_hct_detach_device(HCTDevState *state)
|
||||
{
|
||||
vfio_detach_device(&state->vdev);
|
||||
- g_free(state->vdev.name);
|
||||
+
|
||||
+ if (state->vdev.name)
|
||||
+ g_free(state->vdev.name);
|
||||
}
|
||||
|
||||
static void vfio_hct_exit(PCIDevice *dev)
|
||||
@@ -413,7 +415,6 @@ static int hct_data_init(HCTDevState *state)
|
||||
int ret;
|
||||
|
||||
if (hct_data.init == 0) {
|
||||
-
|
||||
hct_data.hct_fd = qemu_open_old(HCT_SHARE_DEV, O_RDWR);
|
||||
if (hct_data.hct_fd < 0) {
|
||||
error_report("fail to open %s, errno %d.", HCT_SHARE_DEV, errno);
|
||||
@@ -465,7 +466,6 @@ static void vfio_hct_realize(PCIDevice *pci_dev, Error **errp)
|
||||
{
|
||||
int ret;
|
||||
char *mdevid;
|
||||
- Error *err = NULL;
|
||||
HCTDevState *state = PCI_HCT_DEV(pci_dev);
|
||||
|
||||
/* parsing mdev device name from startup scripts */
|
||||
@@ -475,14 +475,18 @@ static void vfio_hct_realize(PCIDevice *pci_dev, Error **errp)
|
||||
ret = hct_data_init(state);
|
||||
if (ret < 0) {
|
||||
g_free(state->vdev.name);
|
||||
+ state->vdev.name = NULL;
|
||||
+ error_setg(errp, "hct data init failed");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = vfio_attach_device(state->vdev.name, &state->vdev,
|
||||
- pci_device_iommu_address_space(pci_dev), &err);
|
||||
+ pci_device_iommu_address_space(pci_dev), errp);
|
||||
|
||||
if (ret) {
|
||||
- error_report("attach device failed, name = %s", state->vdev.name);
|
||||
+ g_free(state->vdev.name);
|
||||
+ state->vdev.name = NULL;
|
||||
+ error_setg(errp, "attach device failed, name = %s", state->vdev.name);
|
||||
goto data_uninit_out;
|
||||
}
|
||||
|
||||
@@ -491,7 +495,12 @@ static void vfio_hct_realize(PCIDevice *pci_dev, Error **errp)
|
||||
|
||||
ret = vfio_hct_region_mmap(state);
|
||||
if (ret < 0)
|
||||
+ {
|
||||
+ g_free(state->vdev.name);
|
||||
+ state->vdev.name = NULL;
|
||||
+ error_setg(errp, "region mmap failed, name = %s", state->vdev.name);
|
||||
goto detach_device_out;
|
||||
+ }
|
||||
|
||||
return;
|
||||
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
57
hw-vfio-hct-update-support-ccp-count-to-48.patch
Normal file
57
hw-vfio-hct-update-support-ccp-count-to-48.patch
Normal file
@ -0,0 +1,57 @@
|
||||
From 3af7045d3aea901d366f4f6dee51e70998351698 Mon Sep 17 00:00:00 2001
|
||||
From: Yabin Li <liyabin@hygon.cn>
|
||||
Date: Tue, 23 Apr 2024 15:38:48 +0800
|
||||
Subject: [PATCH] hw/vfio/hct: update support ccp count to 48.
|
||||
|
||||
Signed-off-by: Yabin Li <liyabin@hygon.cn>
|
||||
Signed-off-by: yangdepei <yangdepei@hygon.cn>
|
||||
---
|
||||
hw/vfio/hct.c | 15 +++++++--------
|
||||
1 file changed, 7 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/hw/vfio/hct.c b/hw/vfio/hct.c
|
||||
index 476e86c61d..790bb78439 100644
|
||||
--- a/hw/vfio/hct.c
|
||||
+++ b/hw/vfio/hct.c
|
||||
@@ -28,7 +28,7 @@
|
||||
#include "qapi/error.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
|
||||
-#define MAX_CCP_CNT 16
|
||||
+#define MAX_CCP_CNT 48
|
||||
#define PAGE_SIZE 4096
|
||||
#define HCT_SHARED_MEMORY_SIZE (PAGE_SIZE * MAX_CCP_CNT)
|
||||
#define CCP_INDEX_BYTES 4
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
#define HCT_SHARE_DEV "/dev/hct_share"
|
||||
|
||||
-#define HCT_VERSION_STRING "0.2"
|
||||
+#define HCT_VERSION_STRING "0.5"
|
||||
#define DEF_VERSION_STRING "0.1"
|
||||
#define VERSION_SIZE 16
|
||||
|
||||
@@ -281,15 +281,14 @@ static int hct_api_version_check(void)
|
||||
memcpy(ctrl.version, DEF_VERSION_STRING, sizeof(DEF_VERSION_STRING));
|
||||
ret = ioctl(hct_data.hct_fd, HCT_SHARE_OP, &ctrl);
|
||||
if (ret < 0) {
|
||||
- error_report("ret %d, errno %d: fail to get hct.ko version, please "
|
||||
- "update hct.ko to version 0.2.\n",
|
||||
- ret, errno);
|
||||
+ error_report("ret %d, errno %d: fail to get hct.ko version.\n", ret,
|
||||
+ errno);
|
||||
return -1;
|
||||
} else if (memcmp(ctrl.version, HCT_VERSION_STRING,
|
||||
sizeof(HCT_VERSION_STRING)) < 0) {
|
||||
- error_report("The API version %s is larger than hct.ko version %s, "
|
||||
- "please update hct.ko to version 0.2\n",
|
||||
- HCT_VERSION_STRING, ctrl.version);
|
||||
+ error_report("The hct.ko version is %s, please upgrade to version %s "
|
||||
+ "or higher.\n",
|
||||
+ ctrl.version, HCT_VERSION_STRING);
|
||||
return -1;
|
||||
}
|
||||
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
51
meson.build-Remove-ncurses-workaround-for-OpenBSD.patch
Normal file
51
meson.build-Remove-ncurses-workaround-for-OpenBSD.patch
Normal file
@ -0,0 +1,51 @@
|
||||
From 199dcd16027e3573f5eeaa4396c361cfec91cbe1 Mon Sep 17 00:00:00 2001
|
||||
From: Susanooo <zhangchujun_yewu@cmss.chinamobile.com>
|
||||
Date: Fri, 25 Oct 2024 09:44:21 +0800
|
||||
Subject: [PATCH] meson.build: Remove ncurses workaround for OpenBSD
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
meson.build: Remove ncurses workaround for OpenBSD
|
||||
|
||||
OpenBSD 7.5 has upgraded to ncurses 6.4.
|
||||
|
||||
Signed-off-by: Brad Smith <brad@comstyle.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Michael Tokarev <mjt@tls.msk.ru>
|
||||
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
|
||||
Signed-off-by: zhangchujun <zhangchujun_yewu@cmss.chinamobile.com>
|
||||
---
|
||||
meson.build | 2 +-
|
||||
ui/curses.c | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/meson.build b/meson.build
|
||||
index 4024f9a4bb..b3ee125b72 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -1139,7 +1139,7 @@ iconv = not_found
|
||||
curses = not_found
|
||||
if have_system and get_option('curses').allowed()
|
||||
curses_test = '''
|
||||
- #if defined(__APPLE__) || defined(__OpenBSD__)
|
||||
+ #ifdef __APPLE__
|
||||
#define _XOPEN_SOURCE_EXTENDED 1
|
||||
#endif
|
||||
#include <locale.h>
|
||||
diff --git a/ui/curses.c b/ui/curses.c
|
||||
index 8bde8c5cf7..26438486fc 100644
|
||||
--- a/ui/curses.c
|
||||
+++ b/ui/curses.c
|
||||
@@ -38,7 +38,7 @@
|
||||
#include "ui/input.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
|
||||
-#if defined(__APPLE__) || defined(__OpenBSD__)
|
||||
+#ifdef __APPLE__
|
||||
#define _XOPEN_SOURCE_EXTENDED 1
|
||||
#endif
|
||||
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
36
qemu.spec
36
qemu.spec
@ -3,7 +3,7 @@
|
||||
|
||||
Name: qemu
|
||||
Version: 8.2.0
|
||||
Release: 24
|
||||
Release: 25
|
||||
Epoch: 11
|
||||
Summary: QEMU is a generic and open source machine emulator and virtualizer
|
||||
License: GPLv2 and BSD and MIT and CC-BY-SA-4.0
|
||||
@ -425,6 +425,22 @@ Patch0408: target-arm-Clear-high-SVE-elements-in-handle_vec_sim.patch
|
||||
Patch0409: target-ppc-Fix-migration-of-CPUs-with-TLB_EMB-TLB-ty.patch
|
||||
Patch0410: target-hppa-Fix-PSW-V-bit-packaging-in-cpu_hppa_get-.patch
|
||||
Patch0411: ppc-xive-Fix-ESB-length-overflow-on-32-bit-hosts.patch
|
||||
Patch0412: hw-vfio-add-device-hct-based-on-vfio.patch
|
||||
Patch0413: hw-vfio-hct-update-support-ccp-count-to-48.patch
|
||||
Patch0414: hw-vfio-hct-fix-ccp_index-error-caused-by-uninitiali.patch
|
||||
Patch0415: hw-vfio-hct-qemu-startup-terminate-once-error-happen.patch
|
||||
Patch0416: s390x-sclp-Simplify-get_sclp_device.patch
|
||||
Patch0417: ui-remove-break-after-g_assert_not_reached.patch
|
||||
Patch0418: ui-console-vc-Silence-warning-about-sprintf-on-OpenB.patch
|
||||
Patch0419: meson.build-Remove-ncurses-workaround-for-OpenBSD.patch
|
||||
Patch0420: hw-audio-hda-free-timer-on-exit.patch
|
||||
Patch0421: hw-pci-Add-parenthesis-to-PCI_BUILD_BDF-macro.patch
|
||||
Patch0422: hw-cxl-Ensure-there-is-enough-data-for-the-header-in.patch
|
||||
Patch0423: target-i386-sev-Fix-incompatibility-between-SEV-and-.patch
|
||||
Patch0424: target-i386-sev-Add-support-for-reuse-ASID-for-diffe.patch
|
||||
Patch0425: Add-virtCCA-Coda-annotation.patch
|
||||
Patch0426: cvm-Add-support-for-TEE-based-national-encryption-ac.patch
|
||||
Patch0427: hw-arm-virt-Keep-Guest-L1-cache-type-consistent-with.patch
|
||||
|
||||
BuildRequires: flex
|
||||
BuildRequires: gcc
|
||||
@ -1022,6 +1038,24 @@ getent passwd qemu >/dev/null || \
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Sat Nov 30 2024 Jiabo Feng <fengjiabo1@huawei.com> - 11:8.2.0-25
|
||||
- hw/arm/virt:Keep Guest L1 cache type consistent with KVM
|
||||
- cvm : Add support for TEE-based national encryption acceleration.
|
||||
- Add virtCCA Coda annotation Adjust the position of the security device
|
||||
- target/i386: sev: Add support for reuse ASID for different CSV guests
|
||||
- target/i386: sev: Fix incompatibility between SEV and CSV on the GET_ID API
|
||||
- hw/cxl: Ensure there is enough data for the header in cmd_ccls_set_lsa()
|
||||
- hw/pci: Add parenthesis to PCI_BUILD_BDF macro
|
||||
- hw/audio/hda: free timer on exit
|
||||
- meson.build: Remove ncurses workaround for OpenBSD
|
||||
- ui/console-vc: Silence warning about sprintf() on OpenBSD
|
||||
- ui: remove break after g_assert_not_reached()
|
||||
- s390x/sclp: Simplify get_sclp_device()
|
||||
- hw/vfio/hct: qemu startup terminate once error happened in hct
|
||||
- hw/vfio/hct: fix ccp_index error caused by uninitialized buf
|
||||
- hw/vfio/hct: update support ccp count to 48.
|
||||
- hw/vfio: add device hct based on vfio.
|
||||
|
||||
* Sat Nov 30 2024 Jiabo Feng <fengjiabo1@huawei.com> - 11:8.2.0-24
|
||||
- ppc/xive: Fix ESB length overflow on 32-bit hosts
|
||||
- target/hppa: Fix PSW V-bit packaging in cpu_hppa_get for hppa64
|
||||
|
||||
48
s390x-sclp-Simplify-get_sclp_device.patch
Normal file
48
s390x-sclp-Simplify-get_sclp_device.patch
Normal file
@ -0,0 +1,48 @@
|
||||
From 358b772c1289c1bf42dfe8c62b04b8a28d60ebf1 Mon Sep 17 00:00:00 2001
|
||||
From: Zhang Jiao <zhangjiao2_yewu@cmss.chinamobile.com>
|
||||
Date: Mon, 21 Oct 2024 14:28:13 +0800
|
||||
Subject: [PATCH] s390x/sclp: Simplify get_sclp_device()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
cheery-pick from 3d9836e46dbe1e46c39fe76a62d3085a71ddbf7a
|
||||
|
||||
get_sclp_device() scans the whole machine to find a TYPE_SCLP object.
|
||||
Now that the SCLPDevice instance is available under the machine state,
|
||||
use it to simplify the lookup. While at it, remove the inline to let
|
||||
the compiler decide on how to optimize.
|
||||
|
||||
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||
Message-ID: <20240502131533.377719-4-clg@redhat.com>
|
||||
Reviewed-by: Thomas Huth <thuth@redhat.com>
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
Signed-off-by: Zhang Jiao <zhangjiao2_yewu@cmss.chinamobile.com>
|
||||
---
|
||||
hw/s390x/sclp.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
|
||||
index 893e71a41b..69bf04e23a 100644
|
||||
--- a/hw/s390x/sclp.c
|
||||
+++ b/hw/s390x/sclp.c
|
||||
@@ -21,13 +21,14 @@
|
||||
#include "hw/s390x/s390-pci-bus.h"
|
||||
#include "hw/s390x/ipl.h"
|
||||
#include "hw/s390x/cpu-topology.h"
|
||||
+#include "hw/s390x/s390-virtio-ccw.h"
|
||||
|
||||
-static inline SCLPDevice *get_sclp_device(void)
|
||||
+static SCLPDevice *get_sclp_device(void)
|
||||
{
|
||||
static SCLPDevice *sclp;
|
||||
|
||||
if (!sclp) {
|
||||
- sclp = SCLP(object_resolve_path_type("", TYPE_SCLP, NULL));
|
||||
+ sclp = S390_CCW_MACHINE(qdev_get_machine())->sclp;
|
||||
}
|
||||
return sclp;
|
||||
}
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
177
target-i386-sev-Add-support-for-reuse-ASID-for-diffe.patch
Normal file
177
target-i386-sev-Add-support-for-reuse-ASID-for-diffe.patch
Normal file
@ -0,0 +1,177 @@
|
||||
From 8f4f8a2071e69130f0b9327ce8f9b92a5ae42c8d Mon Sep 17 00:00:00 2001
|
||||
From: appleLin <appleLin@hygon.cn>
|
||||
Date: Wed, 3 Aug 2022 21:02:41 +0800
|
||||
Subject: [PATCH] target/i386: sev: Add support for reuse ASID for different
|
||||
CSV guests
|
||||
|
||||
In you want to reuse one ASID for many CSV guests, you should provide a
|
||||
label (i.e. userid) and the length of the label when launch CSV guest.
|
||||
The CSV guests which were provided the same userid will share the same
|
||||
ASID.
|
||||
|
||||
Signed-off-by: hanliyang <hanliyang@hygon.cn>
|
||||
---
|
||||
linux-headers/linux/kvm.h | 5 +++++
|
||||
qapi/qom.json | 6 ++++-
|
||||
qemu-options.hx | 5 ++++-
|
||||
target/i386/csv.h | 2 ++
|
||||
target/i386/sev.c | 46 ++++++++++++++++++++++++++++++++++++++-
|
||||
5 files changed, 61 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
|
||||
index eb30402c2d..8dc00808ec 100644
|
||||
--- a/linux-headers/linux/kvm.h
|
||||
+++ b/linux-headers/linux/kvm.h
|
||||
@@ -2103,6 +2103,11 @@ struct kvm_csv_command_batch {
|
||||
__u64 csv_batch_list_uaddr;
|
||||
};
|
||||
|
||||
+struct kvm_csv_init {
|
||||
+ __u64 userid_addr;
|
||||
+ __u32 len;
|
||||
+};
|
||||
+
|
||||
#define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0)
|
||||
#define KVM_DEV_ASSIGN_PCI_2_3 (1 << 1)
|
||||
#define KVM_DEV_ASSIGN_MASK_INTX (1 << 2)
|
||||
diff --git a/qapi/qom.json b/qapi/qom.json
|
||||
index 213edd8db2..8c7461a113 100644
|
||||
--- a/qapi/qom.json
|
||||
+++ b/qapi/qom.json
|
||||
@@ -866,6 +866,9 @@
|
||||
# designated guest firmware page for measured boot with -kernel
|
||||
# (default: false) (since 6.2)
|
||||
#
|
||||
+# @user-id: the user id of the guest owner, only support on Hygon CPUs
|
||||
+# (since 8.2)
|
||||
+#
|
||||
# Since: 2.12
|
||||
##
|
||||
{ 'struct': 'SevGuestProperties',
|
||||
@@ -876,7 +879,8 @@
|
||||
'*handle': 'uint32',
|
||||
'*cbitpos': 'uint32',
|
||||
'reduced-phys-bits': 'uint32',
|
||||
- '*kernel-hashes': 'bool' } }
|
||||
+ '*kernel-hashes': 'bool',
|
||||
+ '*user-id': 'str' } }
|
||||
|
||||
##
|
||||
# @ThreadContextProperties:
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index 42fd09e4de..9829b1020a 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -5637,7 +5637,7 @@ SRST
|
||||
-object secret,id=sec0,keyid=secmaster0,format=base64,\\
|
||||
data=$SECRET,iv=$(<iv.b64)
|
||||
|
||||
- ``-object sev-guest,id=id,cbitpos=cbitpos,reduced-phys-bits=val,[sev-device=string,policy=policy,handle=handle,dh-cert-file=file,session-file=file,kernel-hashes=on|off]``
|
||||
+ ``-object sev-guest,id=id,cbitpos=cbitpos,reduced-phys-bits=val,[sev-device=string,policy=policy,handle=handle,dh-cert-file=file,session-file=file,kernel-hashes=on|off,user-id=id]``
|
||||
Create a Secure Encrypted Virtualization (SEV) guest object,
|
||||
which can be used to provide the guest memory encryption support
|
||||
on AMD processors.
|
||||
@@ -5681,6 +5681,9 @@ SRST
|
||||
cmdline to a designated guest firmware page for measured Linux
|
||||
boot with -kernel. The default is off. (Since 6.2)
|
||||
|
||||
+ The ``user-id`` set the user id of the guest owner, this only
|
||||
+ support on Hygon CPUs. (Since 8.2)
|
||||
+
|
||||
e.g to launch a SEV guest
|
||||
|
||||
.. parsed-literal::
|
||||
diff --git a/target/i386/csv.h b/target/i386/csv.h
|
||||
index ac4bb5bee1..05e7fd8dc1 100644
|
||||
--- a/target/i386/csv.h
|
||||
+++ b/target/i386/csv.h
|
||||
@@ -14,6 +14,8 @@
|
||||
#ifndef I386_CSV_H
|
||||
#define I386_CSV_H
|
||||
|
||||
+#define GUEST_POLICY_REUSE_ASID (1 << 7)
|
||||
+
|
||||
#ifdef CONFIG_CSV
|
||||
|
||||
#include "cpu.h"
|
||||
diff --git a/target/i386/sev.c b/target/i386/sev.c
|
||||
index 04888bc3a8..af61ca5ba8 100644
|
||||
--- a/target/i386/sev.c
|
||||
+++ b/target/i386/sev.c
|
||||
@@ -72,6 +72,7 @@ struct SevGuestState {
|
||||
uint32_t cbitpos;
|
||||
uint32_t reduced_phys_bits;
|
||||
bool kernel_hashes;
|
||||
+ char *user_id;
|
||||
|
||||
/* runtime state */
|
||||
uint32_t handle;
|
||||
@@ -373,6 +374,22 @@ sev_guest_set_dh_cert_file(Object *obj, const char *value, Error **errp)
|
||||
s->dh_cert_file = g_strdup(value);
|
||||
}
|
||||
|
||||
+static char *
|
||||
+sev_guest_get_user_id(Object *obj, Error **errp)
|
||||
+{
|
||||
+ SevGuestState *s = SEV_GUEST(obj);
|
||||
+
|
||||
+ return g_strdup(s->user_id);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+sev_guest_set_user_id(Object *obj, const char *value, Error **errp)
|
||||
+{
|
||||
+ SevGuestState *s = SEV_GUEST(obj);
|
||||
+
|
||||
+ s->user_id = g_strdup(value);
|
||||
+}
|
||||
+
|
||||
static char *
|
||||
sev_guest_get_sev_device(Object *obj, Error **errp)
|
||||
{
|
||||
@@ -426,6 +443,11 @@ sev_guest_class_init(ObjectClass *oc, void *data)
|
||||
sev_guest_set_kernel_hashes);
|
||||
object_class_property_set_description(oc, "kernel-hashes",
|
||||
"add kernel hashes to guest firmware for measured Linux boot");
|
||||
+ object_class_property_add_str(oc, "user-id",
|
||||
+ sev_guest_get_user_id,
|
||||
+ sev_guest_set_user_id);
|
||||
+ object_class_property_set_description(oc, "user-id",
|
||||
+ "user id of the guest owner");
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1174,7 +1196,29 @@ int sev_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
||||
}
|
||||
|
||||
trace_kvm_sev_init();
|
||||
- ret = sev_ioctl(sev->sev_fd, cmd, NULL, &fw_error);
|
||||
+
|
||||
+ /* Only support reuse asid for CSV/CSV2 guest */
|
||||
+ if (is_hygon_cpu() &&
|
||||
+ (sev_guest->policy & GUEST_POLICY_REUSE_ASID)) {
|
||||
+ char *user_id = NULL;
|
||||
+ struct kvm_csv_init *init_cmd_buf = NULL;
|
||||
+
|
||||
+ user_id = object_property_get_str(OBJECT(sev), "user-id", NULL);
|
||||
+ if (user_id && strlen(user_id)) {
|
||||
+ init_cmd_buf = g_new0(struct kvm_csv_init, 1);
|
||||
+ init_cmd_buf->len = strlen(user_id);
|
||||
+ init_cmd_buf->userid_addr = (__u64)user_id;
|
||||
+ }
|
||||
+ ret = sev_ioctl(sev->sev_fd, cmd, init_cmd_buf, &fw_error);
|
||||
+
|
||||
+ if (user_id) {
|
||||
+ g_free(user_id);
|
||||
+ g_free(init_cmd_buf);
|
||||
+ }
|
||||
+ } else {
|
||||
+ ret = sev_ioctl(sev->sev_fd, cmd, NULL, &fw_error);
|
||||
+ }
|
||||
+
|
||||
if (ret) {
|
||||
error_setg(errp, "%s: failed to initialize ret=%d fw_error=%d '%s'",
|
||||
__func__, ret, fw_error, fw_error_to_str(fw_error));
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
36
target-i386-sev-Fix-incompatibility-between-SEV-and-.patch
Normal file
36
target-i386-sev-Fix-incompatibility-between-SEV-and-.patch
Normal file
@ -0,0 +1,36 @@
|
||||
From c357946fa7c1d45a09b40214b5113f689bf7bbd0 Mon Sep 17 00:00:00 2001
|
||||
From: hanliyang <hanliyang@hygon.cn>
|
||||
Date: Fri, 1 Mar 2024 14:12:44 +0800
|
||||
Subject: [PATCH] target/i386: sev: Fix incompatibility between SEV and CSV on
|
||||
the GET_ID API
|
||||
|
||||
If the length of GET_ID request is too small, Hygon CSV will return
|
||||
SEV_RET_INVALID_PARAM. This return code doesn't comply with SEV API
|
||||
Spec.
|
||||
|
||||
Hygon will consider to fix the compitibility issue of return value
|
||||
of the GET_ID API, so also check whether the return value is
|
||||
SEV_RET_INVALID_LEN on Hygon CPUs.
|
||||
|
||||
Signed-off-by: hanliyang <hanliyang@hygon.cn>
|
||||
---
|
||||
target/i386/sev.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/target/i386/sev.c b/target/i386/sev.c
|
||||
index 2c6aecd1a3..04888bc3a8 100644
|
||||
--- a/target/i386/sev.c
|
||||
+++ b/target/i386/sev.c
|
||||
@@ -589,7 +589,8 @@ static int sev_get_cpu0_id(int fd, guchar **id, size_t *id_len, Error **errp)
|
||||
|
||||
/* query the ID length */
|
||||
r = sev_platform_ioctl(fd, SEV_GET_ID2, &get_id2, &err);
|
||||
- if (r < 0 && err != SEV_RET_INVALID_LEN) {
|
||||
+ if (r < 0 && err != SEV_RET_INVALID_LEN &&
|
||||
+ !(is_hygon_cpu() && err == SEV_RET_INVALID_PARAM)) {
|
||||
error_setg(errp, "SEV: Failed to get ID ret=%d fw_err=%d (%s)",
|
||||
r, err, fw_error_to_str(err));
|
||||
return 1;
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
52
ui-console-vc-Silence-warning-about-sprintf-on-OpenB.patch
Normal file
52
ui-console-vc-Silence-warning-about-sprintf-on-OpenB.patch
Normal file
@ -0,0 +1,52 @@
|
||||
From e41395594aab30a22ffaf1556d19ee623a33e6ec Mon Sep 17 00:00:00 2001
|
||||
From: Susanooo <zhangchujun_yewu@cmss.chinamobile.com>
|
||||
Date: Fri, 25 Oct 2024 09:33:41 +0800
|
||||
Subject: [PATCH] ui/console-vc: Silence warning about sprintf() on OpenBSD
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The linker on OpenBSD complains:
|
||||
|
||||
ld: warning: console-vc.c:824 (../src/ui/console-vc.c:824)([...]):
|
||||
warning: sprintf() is often misused, please use snprintf()
|
||||
|
||||
Using g_strdup_printf() is certainly better here, so let's switch
|
||||
to that function instead.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
|
||||
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||
Reviewed-by: Michael Tokarev <mjt@tls.msk.ru>
|
||||
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
|
||||
Signed-off-by: zhangchujun <zhangchujun_yewu@cmss.chinamobile.com>
|
||||
---
|
||||
ui/console-vc.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/ui/console-vc.c b/ui/console-vc.c
|
||||
index 9c13cc2981..b1903c3e48 100644
|
||||
--- a/ui/console-vc.c
|
||||
+++ b/ui/console-vc.c
|
||||
@@ -648,7 +648,7 @@ static void vc_putchar(VCChardev *vc, int ch)
|
||||
QemuTextConsole *s = vc->console;
|
||||
int i;
|
||||
int x, y;
|
||||
- char response[40];
|
||||
+ g_autofree char *response = NULL;
|
||||
|
||||
switch(vc->state) {
|
||||
case TTY_STATE_NORM:
|
||||
@@ -821,7 +821,7 @@ static void vc_putchar(VCChardev *vc, int ch)
|
||||
break;
|
||||
case 6:
|
||||
/* report cursor position */
|
||||
- sprintf(response, "\033[%d;%dR",
|
||||
+ response = g_strdup_printf("\033[%d;%dR",
|
||||
(s->y_base + s->y) % s->total_height + 1,
|
||||
s->x + 1);
|
||||
vc_respond_str(vc, response);
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
48
ui-remove-break-after-g_assert_not_reached.patch
Normal file
48
ui-remove-break-after-g_assert_not_reached.patch
Normal file
@ -0,0 +1,48 @@
|
||||
From c761dac5d72f0d7c4643125e0611c75334b4ec4e Mon Sep 17 00:00:00 2001
|
||||
From: Zhang Jiao <zhangjiao2_yewu@cmss.chinamobile.com>
|
||||
Date: Mon, 21 Oct 2024 15:58:54 +0800
|
||||
Subject: [PATCH] ui: remove break after g_assert_not_reached()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
cheery-pick from b3372e0ec818d7747963a2ec7ae04fd1a8152afd
|
||||
|
||||
Use of assert(false) can trip spurious control flow warnings from
|
||||
some versions of GCC (i.e. using -fsanitize=thread with gcc-12):
|
||||
|
||||
error: control reaches end of non-void function [-Werror=return-type]
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
break;
|
||||
| ^^^^^
|
||||
|
||||
Solve that by removing the unreachable 'break' statement, unifying
|
||||
the code base on g_assert_not_reached() instead.
|
||||
|
||||
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
|
||||
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Message-ID: <20240910221606.1817478-37-pierrick.bouvier@linaro.org>
|
||||
[PMD: Add description suggested by Eric Blake]
|
||||
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Signed-off-by: Zhang Jiao <zhangjiao2_yewu@cmss.chinamobile.com>
|
||||
---
|
||||
ui/qemu-pixman.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/ui/qemu-pixman.c b/ui/qemu-pixman.c
|
||||
index 5ca55dd199..6cada8b45e 100644
|
||||
--- a/ui/qemu-pixman.c
|
||||
+++ b/ui/qemu-pixman.c
|
||||
@@ -49,7 +49,6 @@ PixelFormat qemu_pixelformat_from_pixman(pixman_format_code_t format)
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
- break;
|
||||
}
|
||||
|
||||
pf.amax = (1 << pf.abits) - 1;
|
||||
--
|
||||
2.41.0.windows.1
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user