Qemu update to version 6.2.0-45
numa: Enable numa for SGX EPC sections target/ppc: enhance error handling in kvmppc_read_int* fix pointer double free in func qemu_savevm_state_complete_precopy_non_iterable Signed-off-by: yezengruan <yezengruan@huawei.com>
This commit is contained in:
parent
9931eba224
commit
bb777b4dce
38
bugfix-pointer-double-free-in-func-qemu_savevm_state.patch
Normal file
38
bugfix-pointer-double-free-in-func-qemu_savevm_state.patch
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
From 48ff0d29c594ccfa80a3d58c97bdb7e656c8f541 Mon Sep 17 00:00:00 2001
|
||||||
|
From: jiangdongxu <jiangdongxu1@huawei.com>
|
||||||
|
Date: Mon, 20 Jun 2022 17:19:44 +0800
|
||||||
|
Subject: [PATCH 9/9] bugfix: pointer double free in func
|
||||||
|
qemu_savevm_state_complete_precopy_non_iterable
|
||||||
|
|
||||||
|
vmdesc defined in qemu_savevm_state_complete_precopy_non_iterable is a g_autoptr,
|
||||||
|
it will be auto freed when function return. thus when we call json_writer_free
|
||||||
|
before function return to free vmdesc, it will be double freed. fix it.
|
||||||
|
|
||||||
|
Signed-off-by: jiangdongxu <jiangdongxu1@huawei.com>
|
||||||
|
---
|
||||||
|
migration/savevm.c | 2 --
|
||||||
|
1 file changed, 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/migration/savevm.c b/migration/savevm.c
|
||||||
|
index 803cd9004d..d59e976d50 100644
|
||||||
|
--- a/migration/savevm.c
|
||||||
|
+++ b/migration/savevm.c
|
||||||
|
@@ -1427,7 +1427,6 @@ int qemu_savevm_state_complete_precopy_non_iterable(QEMUFile *f,
|
||||||
|
ret = vmstate_save(f, se, vmdesc);
|
||||||
|
if (ret) {
|
||||||
|
qemu_file_set_error(f, ret);
|
||||||
|
- json_writer_free(vmdesc);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
trace_savevm_section_end(se->idstr, se->section_id, 0);
|
||||||
|
@@ -1444,7 +1443,6 @@ int qemu_savevm_state_complete_precopy_non_iterable(QEMUFile *f,
|
||||||
|
error_report("%s: bdrv_inactivate_all() failed (%d)",
|
||||||
|
__func__, ret);
|
||||||
|
qemu_file_set_error(f, ret);
|
||||||
|
- json_writer_free(vmdesc);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
81
doc-Add-the-SGX-numa-description.patch
Normal file
81
doc-Add-the-SGX-numa-description.patch
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
From adba5254ecbd9eace360d8eb3d5c635d3acd8d71 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Yang Zhong <yang.zhong@intel.com>
|
||||||
|
Date: Mon, 1 Nov 2021 12:20:08 -0400
|
||||||
|
Subject: [PATCH 3/9] doc: Add the SGX numa description
|
||||||
|
|
||||||
|
mainline inclusion
|
||||||
|
from mainline-v7.0.0-rc0
|
||||||
|
commit d1889b36098c79e2e6ac90faf3d0dc5ec0057677
|
||||||
|
category: feature
|
||||||
|
feature: NUMA support for SGX EPC sections
|
||||||
|
bugzilla: https://gitee.com/openeuler/intel-qemu/issues/I5K27A
|
||||||
|
|
||||||
|
Intel-SIG: commit d1889b36098c ("doc: Add the SGX numa description")
|
||||||
|
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
doc: Add the SGX numa description
|
||||||
|
|
||||||
|
Add the SGX numa reference command and how to check if
|
||||||
|
SGX numa is support or not with multiple EPC sections.
|
||||||
|
|
||||||
|
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
|
||||||
|
Message-Id: <20211101162009.62161-5-yang.zhong@intel.com>
|
||||||
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||||
|
Signed-off-by: Jason Zeng <jason.zeng@intel.com>
|
||||||
|
---
|
||||||
|
docs/system/i386/sgx.rst | 31 +++++++++++++++++++++++++++----
|
||||||
|
1 file changed, 27 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/docs/system/i386/sgx.rst b/docs/system/i386/sgx.rst
|
||||||
|
index f8fade5ac2..0f0a73f758 100644
|
||||||
|
--- a/docs/system/i386/sgx.rst
|
||||||
|
+++ b/docs/system/i386/sgx.rst
|
||||||
|
@@ -141,8 +141,7 @@ To launch a SGX guest:
|
||||||
|
|qemu_system_x86| \\
|
||||||
|
-cpu host,+sgx-provisionkey \\
|
||||||
|
-object memory-backend-epc,id=mem1,size=64M,prealloc=on \\
|
||||||
|
- -object memory-backend-epc,id=mem2,size=28M \\
|
||||||
|
- -M sgx-epc.0.memdev=mem1,sgx-epc.1.memdev=mem2
|
||||||
|
+ -M sgx-epc.0.memdev=mem1,sgx-epc.0.node=0
|
||||||
|
|
||||||
|
Utilizing SGX in the guest requires a kernel/OS with SGX support.
|
||||||
|
The support can be determined in guest by::
|
||||||
|
@@ -152,8 +151,32 @@ The support can be determined in guest by::
|
||||||
|
and SGX epc info by::
|
||||||
|
|
||||||
|
$ dmesg | grep sgx
|
||||||
|
- [ 1.242142] sgx: EPC section 0x180000000-0x181bfffff
|
||||||
|
- [ 1.242319] sgx: EPC section 0x181c00000-0x1837fffff
|
||||||
|
+ [ 0.182807] sgx: EPC section 0x140000000-0x143ffffff
|
||||||
|
+ [ 0.183695] sgx: [Firmware Bug]: Unable to map EPC section to online node. Fallback to the NUMA node 0.
|
||||||
|
+
|
||||||
|
+To launch a SGX numa guest:
|
||||||
|
+
|
||||||
|
+.. parsed-literal::
|
||||||
|
+
|
||||||
|
+ |qemu_system_x86| \\
|
||||||
|
+ -cpu host,+sgx-provisionkey \\
|
||||||
|
+ -object memory-backend-ram,size=2G,host-nodes=0,policy=bind,id=node0 \\
|
||||||
|
+ -object memory-backend-epc,id=mem0,size=64M,prealloc=on,host-nodes=0,policy=bind \\
|
||||||
|
+ -numa node,nodeid=0,cpus=0-1,memdev=node0 \\
|
||||||
|
+ -object memory-backend-ram,size=2G,host-nodes=1,policy=bind,id=node1 \\
|
||||||
|
+ -object memory-backend-epc,id=mem1,size=28M,prealloc=on,host-nodes=1,policy=bind \\
|
||||||
|
+ -numa node,nodeid=1,cpus=2-3,memdev=node1 \\
|
||||||
|
+ -M sgx-epc.0.memdev=mem0,sgx-epc.0.node=0,sgx-epc.1.memdev=mem1,sgx-epc.1.node=1
|
||||||
|
+
|
||||||
|
+and SGX epc numa info by::
|
||||||
|
+
|
||||||
|
+ $ dmesg | grep sgx
|
||||||
|
+ [ 0.369937] sgx: EPC section 0x180000000-0x183ffffff
|
||||||
|
+ [ 0.370259] sgx: EPC section 0x184000000-0x185bfffff
|
||||||
|
+
|
||||||
|
+ $ dmesg | grep SRAT
|
||||||
|
+ [ 0.009981] ACPI: SRAT: Node 0 PXM 0 [mem 0x180000000-0x183ffffff]
|
||||||
|
+ [ 0.009982] ACPI: SRAT: Node 1 PXM 1 [mem 0x184000000-0x185bfffff]
|
||||||
|
|
||||||
|
References
|
||||||
|
----------
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
291
numa-Enable-numa-for-SGX-EPC-sections.patch
Normal file
291
numa-Enable-numa-for-SGX-EPC-sections.patch
Normal file
@ -0,0 +1,291 @@
|
|||||||
|
From c9071221ea67c7ee72fab5956e4c2c9da3fd39ef Mon Sep 17 00:00:00 2001
|
||||||
|
From: Yang Zhong <yang.zhong@intel.com>
|
||||||
|
Date: Mon, 1 Nov 2021 12:20:05 -0400
|
||||||
|
Subject: [PATCH 1/9] numa: Enable numa for SGX EPC sections
|
||||||
|
|
||||||
|
mainline inclusion
|
||||||
|
from mainline-v7.0.0-rc0
|
||||||
|
commit 1105812382e1126d86dddc16b3700f8c79dc93d1
|
||||||
|
category: feature
|
||||||
|
feature: NUMA support for SGX EPC sections
|
||||||
|
bugzilla: https://gitee.com/openeuler/intel-qemu/issues/I5K27A
|
||||||
|
|
||||||
|
Intel-SIG: commit 1105812382e1 ("numa: Enable numa for SGX EPC sections")
|
||||||
|
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
numa: Enable numa for SGX EPC sections
|
||||||
|
|
||||||
|
The basic SGX did not enable numa for SGX EPC sections, which
|
||||||
|
result in all EPC sections located in numa node 0. This patch
|
||||||
|
enable SGX numa function in the guest and the EPC section can
|
||||||
|
work with RAM as one numa node.
|
||||||
|
|
||||||
|
The Guest kernel related log:
|
||||||
|
[ 0.009981] ACPI: SRAT: Node 0 PXM 0 [mem 0x180000000-0x183ffffff]
|
||||||
|
[ 0.009982] ACPI: SRAT: Node 1 PXM 1 [mem 0x184000000-0x185bfffff]
|
||||||
|
The SRAT table can normally show SGX EPC sections menory info in different
|
||||||
|
numa nodes.
|
||||||
|
|
||||||
|
The SGX EPC numa related command:
|
||||||
|
......
|
||||||
|
-m 4G,maxmem=20G \
|
||||||
|
-smp sockets=2,cores=2 \
|
||||||
|
-cpu host,+sgx-provisionkey \
|
||||||
|
-object memory-backend-ram,size=2G,host-nodes=0,policy=bind,id=node0 \
|
||||||
|
-object memory-backend-epc,id=mem0,size=64M,prealloc=on,host-nodes=0,policy=bind \
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=node0 \
|
||||||
|
-object memory-backend-ram,size=2G,host-nodes=1,policy=bind,id=node1 \
|
||||||
|
-object memory-backend-epc,id=mem1,size=28M,prealloc=on,host-nodes=1,policy=bind \
|
||||||
|
-numa node,nodeid=1,cpus=2-3,memdev=node1 \
|
||||||
|
-M sgx-epc.0.memdev=mem0,sgx-epc.0.node=0,sgx-epc.1.memdev=mem1,sgx-epc.1.node=1 \
|
||||||
|
......
|
||||||
|
|
||||||
|
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
|
||||||
|
Message-Id: <20211101162009.62161-2-yang.zhong@intel.com>
|
||||||
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||||
|
Signed-off-by: Jason Zeng <jason.zeng@intel.com>
|
||||||
|
---
|
||||||
|
hw/core/numa.c | 5 ++---
|
||||||
|
hw/i386/acpi-build.c | 2 ++
|
||||||
|
hw/i386/sgx-epc.c | 3 +++
|
||||||
|
hw/i386/sgx-stub.c | 4 ++++
|
||||||
|
hw/i386/sgx.c | 44 +++++++++++++++++++++++++++++++++++++++
|
||||||
|
include/hw/i386/sgx-epc.h | 3 +++
|
||||||
|
monitor/hmp-cmds.c | 1 +
|
||||||
|
qapi/machine.json | 10 ++++++++-
|
||||||
|
qemu-options.hx | 4 ++--
|
||||||
|
9 files changed, 70 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/core/numa.c b/hw/core/numa.c
|
||||||
|
index e6050b2273..1aa05dcf42 100644
|
||||||
|
--- a/hw/core/numa.c
|
||||||
|
+++ b/hw/core/numa.c
|
||||||
|
@@ -784,9 +784,8 @@ static void numa_stat_memory_devices(NumaNodeMem node_mem[])
|
||||||
|
break;
|
||||||
|
case MEMORY_DEVICE_INFO_KIND_SGX_EPC:
|
||||||
|
se = value->u.sgx_epc.data;
|
||||||
|
- /* TODO: once we support numa, assign to right node */
|
||||||
|
- node_mem[0].node_mem += se->size;
|
||||||
|
- node_mem[0].node_plugged_mem += se->size;
|
||||||
|
+ node_mem[se->node].node_mem += se->size;
|
||||||
|
+ node_mem[se->node].node_plugged_mem = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached();
|
||||||
|
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
|
||||||
|
index 0ec2932ec2..1e33e1f3d0 100644
|
||||||
|
--- a/hw/i386/acpi-build.c
|
||||||
|
+++ b/hw/i386/acpi-build.c
|
||||||
|
@@ -2068,6 +2068,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
|
||||||
|
nvdimm_build_srat(table_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ sgx_epc_build_srat(table_data);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* TODO: this part is not in ACPI spec and current linux kernel boots fine
|
||||||
|
* without these entries. But I recall there were issues the last time I
|
||||||
|
diff --git a/hw/i386/sgx-epc.c b/hw/i386/sgx-epc.c
|
||||||
|
index e508827e78..96b2940d75 100644
|
||||||
|
--- a/hw/i386/sgx-epc.c
|
||||||
|
+++ b/hw/i386/sgx-epc.c
|
||||||
|
@@ -21,6 +21,7 @@
|
||||||
|
|
||||||
|
static Property sgx_epc_properties[] = {
|
||||||
|
DEFINE_PROP_UINT64(SGX_EPC_ADDR_PROP, SGXEPCDevice, addr, 0),
|
||||||
|
+ DEFINE_PROP_UINT32(SGX_EPC_NUMA_NODE_PROP, SGXEPCDevice, node, 0),
|
||||||
|
DEFINE_PROP_LINK(SGX_EPC_MEMDEV_PROP, SGXEPCDevice, hostmem,
|
||||||
|
TYPE_MEMORY_BACKEND_EPC, HostMemoryBackendEpc *),
|
||||||
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
@@ -139,6 +140,8 @@ static void sgx_epc_md_fill_device_info(const MemoryDeviceState *md,
|
||||||
|
se->memaddr = epc->addr;
|
||||||
|
se->size = object_property_get_uint(OBJECT(epc), SGX_EPC_SIZE_PROP,
|
||||||
|
NULL);
|
||||||
|
+ se->node = object_property_get_uint(OBJECT(epc), SGX_EPC_NUMA_NODE_PROP,
|
||||||
|
+ NULL);
|
||||||
|
se->memdev = object_get_canonical_path(OBJECT(epc->hostmem));
|
||||||
|
|
||||||
|
info->u.sgx_epc.data = se;
|
||||||
|
diff --git a/hw/i386/sgx-stub.c b/hw/i386/sgx-stub.c
|
||||||
|
index c9b379e665..26833eb233 100644
|
||||||
|
--- a/hw/i386/sgx-stub.c
|
||||||
|
+++ b/hw/i386/sgx-stub.c
|
||||||
|
@@ -6,6 +6,10 @@
|
||||||
|
#include "qapi/error.h"
|
||||||
|
#include "qapi/qapi-commands-misc-target.h"
|
||||||
|
|
||||||
|
+void sgx_epc_build_srat(GArray *table_data)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
SGXInfo *qmp_query_sgx(Error **errp)
|
||||||
|
{
|
||||||
|
error_setg(errp, "SGX support is not compiled in");
|
||||||
|
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
|
||||||
|
index 8fef3dd8fa..d04299904a 100644
|
||||||
|
--- a/hw/i386/sgx.c
|
||||||
|
+++ b/hw/i386/sgx.c
|
||||||
|
@@ -23,6 +23,7 @@
|
||||||
|
#include "sysemu/hw_accel.h"
|
||||||
|
#include "sysemu/reset.h"
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
+#include "hw/acpi/aml-build.h"
|
||||||
|
|
||||||
|
#define SGX_MAX_EPC_SECTIONS 8
|
||||||
|
#define SGX_CPUID_EPC_INVALID 0x0
|
||||||
|
@@ -36,6 +37,46 @@
|
||||||
|
|
||||||
|
#define RETRY_NUM 2
|
||||||
|
|
||||||
|
+static int sgx_epc_device_list(Object *obj, void *opaque)
|
||||||
|
+{
|
||||||
|
+ GSList **list = opaque;
|
||||||
|
+
|
||||||
|
+ if (object_dynamic_cast(obj, TYPE_SGX_EPC)) {
|
||||||
|
+ *list = g_slist_append(*list, DEVICE(obj));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ object_child_foreach(obj, sgx_epc_device_list, opaque);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static GSList *sgx_epc_get_device_list(void)
|
||||||
|
+{
|
||||||
|
+ GSList *list = NULL;
|
||||||
|
+
|
||||||
|
+ object_child_foreach(qdev_get_machine(), sgx_epc_device_list, &list);
|
||||||
|
+ return list;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void sgx_epc_build_srat(GArray *table_data)
|
||||||
|
+{
|
||||||
|
+ GSList *device_list = sgx_epc_get_device_list();
|
||||||
|
+
|
||||||
|
+ for (; device_list; device_list = device_list->next) {
|
||||||
|
+ DeviceState *dev = device_list->data;
|
||||||
|
+ Object *obj = OBJECT(dev);
|
||||||
|
+ uint64_t addr, size;
|
||||||
|
+ int node;
|
||||||
|
+
|
||||||
|
+ node = object_property_get_uint(obj, SGX_EPC_NUMA_NODE_PROP,
|
||||||
|
+ &error_abort);
|
||||||
|
+ addr = object_property_get_uint(obj, SGX_EPC_ADDR_PROP, &error_abort);
|
||||||
|
+ size = object_property_get_uint(obj, SGX_EPC_SIZE_PROP, &error_abort);
|
||||||
|
+
|
||||||
|
+ build_srat_memory(table_data, addr, size, node, MEM_AFFINITY_ENABLED);
|
||||||
|
+ }
|
||||||
|
+ g_slist_free(device_list);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high)
|
||||||
|
{
|
||||||
|
return (low & MAKE_64BIT_MASK(12, 20)) +
|
||||||
|
@@ -226,6 +267,9 @@ void pc_machine_init_sgx_epc(PCMachineState *pcms)
|
||||||
|
/* set the memdev link with memory backend */
|
||||||
|
object_property_parse(obj, SGX_EPC_MEMDEV_PROP, list->value->memdev,
|
||||||
|
&error_fatal);
|
||||||
|
+ /* set the numa node property for sgx epc object */
|
||||||
|
+ object_property_set_uint(obj, SGX_EPC_NUMA_NODE_PROP, list->value->node,
|
||||||
|
+ &error_fatal);
|
||||||
|
object_property_set_bool(obj, "realized", true, &error_fatal);
|
||||||
|
object_unref(obj);
|
||||||
|
}
|
||||||
|
diff --git a/include/hw/i386/sgx-epc.h b/include/hw/i386/sgx-epc.h
|
||||||
|
index a6a65be854..581fac389a 100644
|
||||||
|
--- a/include/hw/i386/sgx-epc.h
|
||||||
|
+++ b/include/hw/i386/sgx-epc.h
|
||||||
|
@@ -25,6 +25,7 @@
|
||||||
|
#define SGX_EPC_ADDR_PROP "addr"
|
||||||
|
#define SGX_EPC_SIZE_PROP "size"
|
||||||
|
#define SGX_EPC_MEMDEV_PROP "memdev"
|
||||||
|
+#define SGX_EPC_NUMA_NODE_PROP "node"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SGXEPCDevice:
|
||||||
|
@@ -38,6 +39,7 @@ typedef struct SGXEPCDevice {
|
||||||
|
|
||||||
|
/* public */
|
||||||
|
uint64_t addr;
|
||||||
|
+ uint32_t node;
|
||||||
|
HostMemoryBackendEpc *hostmem;
|
||||||
|
} SGXEPCDevice;
|
||||||
|
|
||||||
|
@@ -56,6 +58,7 @@ typedef struct SGXEPCState {
|
||||||
|
} SGXEPCState;
|
||||||
|
|
||||||
|
bool sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size);
|
||||||
|
+void sgx_epc_build_srat(GArray *table_data);
|
||||||
|
|
||||||
|
static inline uint64_t sgx_epc_above_4g_end(SGXEPCState *sgx_epc)
|
||||||
|
{
|
||||||
|
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
|
||||||
|
index 294652034e..9570011232 100644
|
||||||
|
--- a/monitor/hmp-cmds.c
|
||||||
|
+++ b/monitor/hmp-cmds.c
|
||||||
|
@@ -1823,6 +1823,7 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
|
||||||
|
se->id ? se->id : "");
|
||||||
|
monitor_printf(mon, " memaddr: 0x%" PRIx64 "\n", se->memaddr);
|
||||||
|
monitor_printf(mon, " size: %" PRIu64 "\n", se->size);
|
||||||
|
+ monitor_printf(mon, " node: %" PRId64 "\n", se->node);
|
||||||
|
monitor_printf(mon, " memdev: %s\n", se->memdev);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
diff --git a/qapi/machine.json b/qapi/machine.json
|
||||||
|
index 6ed8488255..85c35e7fc5 100644
|
||||||
|
--- a/qapi/machine.json
|
||||||
|
+++ b/qapi/machine.json
|
||||||
|
@@ -1209,12 +1209,15 @@
|
||||||
|
#
|
||||||
|
# @memdev: memory backend linked with device
|
||||||
|
#
|
||||||
|
+# @node: the numa node
|
||||||
|
+#
|
||||||
|
# Since: 6.2
|
||||||
|
##
|
||||||
|
{ 'struct': 'SgxEPCDeviceInfo',
|
||||||
|
'data': { '*id': 'str',
|
||||||
|
'memaddr': 'size',
|
||||||
|
'size': 'size',
|
||||||
|
+ 'node': 'int',
|
||||||
|
'memdev': 'str'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1287,10 +1290,15 @@
|
||||||
|
#
|
||||||
|
# @memdev: memory backend linked with device
|
||||||
|
#
|
||||||
|
+# @node: the numa node
|
||||||
|
+#
|
||||||
|
# Since: 6.2
|
||||||
|
##
|
||||||
|
{ 'struct': 'SgxEPC',
|
||||||
|
- 'data': { 'memdev': 'str' } }
|
||||||
|
+ 'data': { 'memdev': 'str',
|
||||||
|
+ 'node': 'int'
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
|
||||||
|
##
|
||||||
|
# @SgxEPCProperties:
|
||||||
|
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||||
|
index 74d335e4c3..1aaf38c613 100644
|
||||||
|
--- a/qemu-options.hx
|
||||||
|
+++ b/qemu-options.hx
|
||||||
|
@@ -127,11 +127,11 @@ SRST
|
||||||
|
ERST
|
||||||
|
|
||||||
|
DEF("M", HAS_ARG, QEMU_OPTION_M,
|
||||||
|
- " sgx-epc.0.memdev=memid\n",
|
||||||
|
+ " sgx-epc.0.memdev=memid,sgx-epc.0.node=numaid\n",
|
||||||
|
QEMU_ARCH_ALL)
|
||||||
|
|
||||||
|
SRST
|
||||||
|
-``sgx-epc.0.memdev=@var{memid}``
|
||||||
|
+``sgx-epc.0.memdev=@var{memid},sgx-epc.0.node=@var{numaid}``
|
||||||
|
Define an SGX EPC section.
|
||||||
|
ERST
|
||||||
|
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
213
numa-Support-SGX-numa-in-the-monitor-and-Libvirt-int.patch
Normal file
213
numa-Support-SGX-numa-in-the-monitor-and-Libvirt-int.patch
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
From 86648f137c72241005327b55208eeeed8b3cfd5e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Yang Zhong <yang.zhong@intel.com>
|
||||||
|
Date: Mon, 1 Nov 2021 12:20:07 -0400
|
||||||
|
Subject: [PATCH 2/9] numa: Support SGX numa in the monitor and Libvirt
|
||||||
|
interfaces
|
||||||
|
|
||||||
|
from mainline-v7.0.0-rc0
|
||||||
|
commit 4755927ae12547c2e7cb22c5fa1b39038c6c11b1
|
||||||
|
category: feature
|
||||||
|
feature: NUMA support for SGX EPC sections
|
||||||
|
bugzilla: https://gitee.com/openeuler/intel-qemu/issues/I5K27A
|
||||||
|
|
||||||
|
Intel-SIG: commit 4755927ae125 ("numa: Support SGX numa in the monitor and
|
||||||
|
Libvirt interfaces")
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
numa: Support SGX numa in the monitor and Libvirt interfaces
|
||||||
|
|
||||||
|
Add the SGXEPCSection list into SGXInfo to show the multiple
|
||||||
|
SGX EPC sections detailed info, not the total size like before.
|
||||||
|
This patch can enable numa support for 'info sgx' command and
|
||||||
|
QMP interfaces. The new interfaces show each EPC section info
|
||||||
|
in one numa node. Libvirt can use QMP interface to get the
|
||||||
|
detailed host SGX EPC capabilities to decide how to allocate
|
||||||
|
host EPC sections to guest.
|
||||||
|
|
||||||
|
(qemu) info sgx
|
||||||
|
SGX support: enabled
|
||||||
|
SGX1 support: enabled
|
||||||
|
SGX2 support: enabled
|
||||||
|
FLC support: enabled
|
||||||
|
NUMA node #0: size=67108864
|
||||||
|
NUMA node #1: size=29360128
|
||||||
|
|
||||||
|
The QMP interface show:
|
||||||
|
(QEMU) query-sgx
|
||||||
|
{"return": {"sgx": true, "sgx2": true, "sgx1": true, "sections": \
|
||||||
|
[{"node": 0, "size": 67108864}, {"node": 1, "size": 29360128}], "flc": true}}
|
||||||
|
|
||||||
|
(QEMU) query-sgx-capabilities
|
||||||
|
{"return": {"sgx": true, "sgx2": true, "sgx1": true, "sections": \
|
||||||
|
[{"node": 0, "size": 17070817280}, {"node": 1, "size": 17079205888}], "flc": true}}
|
||||||
|
|
||||||
|
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
|
||||||
|
Message-Id: <20211101162009.62161-4-yang.zhong@intel.com>
|
||||||
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||||
|
Signed-off-by: Jason Zeng <jason.zeng@intel.com>
|
||||||
|
---
|
||||||
|
hw/i386/sgx.c | 51 +++++++++++++++++++++++++++++++++++--------
|
||||||
|
qapi/misc-target.json | 19 ++++++++++++++--
|
||||||
|
2 files changed, 59 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
|
||||||
|
index d04299904a..5de5dd0893 100644
|
||||||
|
--- a/hw/i386/sgx.c
|
||||||
|
+++ b/hw/i386/sgx.c
|
||||||
|
@@ -83,11 +83,13 @@ static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high)
|
||||||
|
((high & MAKE_64BIT_MASK(0, 20)) << 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static uint64_t sgx_calc_host_epc_section_size(void)
|
||||||
|
+static SGXEPCSectionList *sgx_calc_host_epc_sections(void)
|
||||||
|
{
|
||||||
|
+ SGXEPCSectionList *head = NULL, **tail = &head;
|
||||||
|
+ SGXEPCSection *section;
|
||||||
|
uint32_t i, type;
|
||||||
|
uint32_t eax, ebx, ecx, edx;
|
||||||
|
- uint64_t size = 0;
|
||||||
|
+ uint32_t j = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < SGX_MAX_EPC_SECTIONS; i++) {
|
||||||
|
host_cpuid(0x12, i + 2, &eax, &ebx, &ecx, &edx);
|
||||||
|
@@ -101,10 +103,13 @@ static uint64_t sgx_calc_host_epc_section_size(void)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- size += sgx_calc_section_metric(ecx, edx);
|
||||||
|
+ section = g_new0(SGXEPCSection, 1);
|
||||||
|
+ section->node = j++;
|
||||||
|
+ section->size = sgx_calc_section_metric(ecx, edx);
|
||||||
|
+ QAPI_LIST_APPEND(tail, section);
|
||||||
|
}
|
||||||
|
|
||||||
|
- return size;
|
||||||
|
+ return head;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sgx_epc_reset(void *opaque)
|
||||||
|
@@ -168,13 +173,35 @@ SGXInfo *qmp_query_sgx_capabilities(Error **errp)
|
||||||
|
info->sgx1 = eax & (1U << 0) ? true : false;
|
||||||
|
info->sgx2 = eax & (1U << 1) ? true : false;
|
||||||
|
|
||||||
|
- info->section_size = sgx_calc_host_epc_section_size();
|
||||||
|
+ info->sections = sgx_calc_host_epc_sections();
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static SGXEPCSectionList *sgx_get_epc_sections_list(void)
|
||||||
|
+{
|
||||||
|
+ GSList *device_list = sgx_epc_get_device_list();
|
||||||
|
+ SGXEPCSectionList *head = NULL, **tail = &head;
|
||||||
|
+ SGXEPCSection *section;
|
||||||
|
+
|
||||||
|
+ for (; device_list; device_list = device_list->next) {
|
||||||
|
+ DeviceState *dev = device_list->data;
|
||||||
|
+ Object *obj = OBJECT(dev);
|
||||||
|
+
|
||||||
|
+ section = g_new0(SGXEPCSection, 1);
|
||||||
|
+ section->node = object_property_get_uint(obj, SGX_EPC_NUMA_NODE_PROP,
|
||||||
|
+ &error_abort);
|
||||||
|
+ section->size = object_property_get_uint(obj, SGX_EPC_SIZE_PROP,
|
||||||
|
+ &error_abort);
|
||||||
|
+ QAPI_LIST_APPEND(tail, section);
|
||||||
|
+ }
|
||||||
|
+ g_slist_free(device_list);
|
||||||
|
+
|
||||||
|
+ return head;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
SGXInfo *qmp_query_sgx(Error **errp)
|
||||||
|
{
|
||||||
|
SGXInfo *info = NULL;
|
||||||
|
@@ -193,14 +220,13 @@ SGXInfo *qmp_query_sgx(Error **errp)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- SGXEPCState *sgx_epc = &pcms->sgx_epc;
|
||||||
|
info = g_new0(SGXInfo, 1);
|
||||||
|
|
||||||
|
info->sgx = true;
|
||||||
|
info->sgx1 = true;
|
||||||
|
info->sgx2 = true;
|
||||||
|
info->flc = true;
|
||||||
|
- info->section_size = sgx_epc->size;
|
||||||
|
+ info->sections = sgx_get_epc_sections_list();
|
||||||
|
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
@@ -208,6 +234,7 @@ SGXInfo *qmp_query_sgx(Error **errp)
|
||||||
|
void hmp_info_sgx(Monitor *mon, const QDict *qdict)
|
||||||
|
{
|
||||||
|
Error *err = NULL;
|
||||||
|
+ SGXEPCSectionList *section_list, *section;
|
||||||
|
g_autoptr(SGXInfo) info = qmp_query_sgx(&err);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
@@ -222,8 +249,14 @@ void hmp_info_sgx(Monitor *mon, const QDict *qdict)
|
||||||
|
info->sgx2 ? "enabled" : "disabled");
|
||||||
|
monitor_printf(mon, "FLC support: %s\n",
|
||||||
|
info->flc ? "enabled" : "disabled");
|
||||||
|
- monitor_printf(mon, "size: %" PRIu64 "\n",
|
||||||
|
- info->section_size);
|
||||||
|
+
|
||||||
|
+ section_list = info->sections;
|
||||||
|
+ for (section = section_list; section; section = section->next) {
|
||||||
|
+ monitor_printf(mon, "NUMA node #%" PRId64 ": ",
|
||||||
|
+ section->value->node);
|
||||||
|
+ monitor_printf(mon, "size=%" PRIu64 "\n",
|
||||||
|
+ section->value->size);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size)
|
||||||
|
diff --git a/qapi/misc-target.json b/qapi/misc-target.json
|
||||||
|
index 5aa2b95b7d..1022aa0184 100644
|
||||||
|
--- a/qapi/misc-target.json
|
||||||
|
+++ b/qapi/misc-target.json
|
||||||
|
@@ -337,6 +337,21 @@
|
||||||
|
'if': 'TARGET_ARM' }
|
||||||
|
|
||||||
|
|
||||||
|
+##
|
||||||
|
+# @SGXEPCSection:
|
||||||
|
+#
|
||||||
|
+# Information about intel SGX EPC section info
|
||||||
|
+#
|
||||||
|
+# @node: the numa node
|
||||||
|
+#
|
||||||
|
+# @size: the size of epc section
|
||||||
|
+#
|
||||||
|
+# Since: 6.2
|
||||||
|
+##
|
||||||
|
+{ 'struct': 'SGXEPCSection',
|
||||||
|
+ 'data': { 'node': 'int',
|
||||||
|
+ 'size': 'uint64'}}
|
||||||
|
+
|
||||||
|
##
|
||||||
|
# @SGXInfo:
|
||||||
|
#
|
||||||
|
@@ -350,7 +365,7 @@
|
||||||
|
#
|
||||||
|
# @flc: true if FLC is supported
|
||||||
|
#
|
||||||
|
-# @section-size: The EPC section size for guest
|
||||||
|
+# @sections: The EPC sections info for guest
|
||||||
|
#
|
||||||
|
# Since: 6.2
|
||||||
|
##
|
||||||
|
@@ -359,7 +374,7 @@
|
||||||
|
'sgx1': 'bool',
|
||||||
|
'sgx2': 'bool',
|
||||||
|
'flc': 'bool',
|
||||||
|
- 'section-size': 'uint64'},
|
||||||
|
+ 'sections': ['SGXEPCSection']},
|
||||||
|
'if': 'TARGET_I386' }
|
||||||
|
|
||||||
|
##
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
219
qapi-Cleanup-SGX-related-comments-and-restore-sectio.patch
Normal file
219
qapi-Cleanup-SGX-related-comments-and-restore-sectio.patch
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
From 646cfa4209dde2258891668576d32759e1479dfa Mon Sep 17 00:00:00 2001
|
||||||
|
From: Yang Zhong <yang.zhong@intel.com>
|
||||||
|
Date: Thu, 20 Jan 2022 17:31:04 -0500
|
||||||
|
Subject: [PATCH 4/9] qapi: Cleanup SGX related comments and restore
|
||||||
|
@section-size
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
mainline inclusion
|
||||||
|
from mainline-v7.0.0-rc0
|
||||||
|
commit a66bd91f030827742778a9e0da19fe55716b4a60
|
||||||
|
category: feature
|
||||||
|
feature: NUMA support for SGX EPC sections
|
||||||
|
bugzilla: https://gitee.com/openeuler/intel-qemu/issues/I5K27A
|
||||||
|
|
||||||
|
Intel-SIG: commit a66bd91f0308 ("qapi: Cleanup SGX related comments
|
||||||
|
and restore @section-size")
|
||||||
|
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
qapi: Cleanup SGX related comments and restore @section-size
|
||||||
|
|
||||||
|
The SGX NUMA patches were merged into Qemu 7.0 release, we need
|
||||||
|
clarify detailed version history information and also change
|
||||||
|
some related comments, which make SGX related comments clearer.
|
||||||
|
|
||||||
|
The QMP command schema promises backwards compatibility as standard.
|
||||||
|
We temporarily restore "@section-size", which can avoid incompatible
|
||||||
|
API breakage. The "@section-size" will be deprecated in 7.2 version.
|
||||||
|
|
||||||
|
Suggested-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||||
|
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
|
||||||
|
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||||
|
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||||
|
Message-Id: <20220120223104.437161-1-yang.zhong@intel.com>
|
||||||
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||||
|
Signed-off-by: Jason Zeng <jason.zeng@intel.com>
|
||||||
|
---
|
||||||
|
docs/about/deprecated.rst | 13 +++++++++++++
|
||||||
|
hw/i386/sgx.c | 11 +++++++++--
|
||||||
|
qapi/machine.json | 4 ++--
|
||||||
|
qapi/misc-target.json | 22 +++++++++++++++++-----
|
||||||
|
4 files changed, 41 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
|
||||||
|
index ff7488cb63..33925edf45 100644
|
||||||
|
--- a/docs/about/deprecated.rst
|
||||||
|
+++ b/docs/about/deprecated.rst
|
||||||
|
@@ -270,6 +270,19 @@ accepted incorrect commands will return an error. Users should make sure that
|
||||||
|
all arguments passed to ``device_add`` are consistent with the documented
|
||||||
|
property types.
|
||||||
|
|
||||||
|
+``query-sgx`` return value member ``section-size`` (since 7.0)
|
||||||
|
+''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||||
|
+
|
||||||
|
+Member ``section-size`` in return value elements with meta-type ``uint64`` is
|
||||||
|
+deprecated. Use ``sections`` instead.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+``query-sgx-capabilities`` return value member ``section-size`` (since 7.0)
|
||||||
|
+'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||||
|
+
|
||||||
|
+Member ``section-size`` in return value elements with meta-type ``uint64`` is
|
||||||
|
+deprecated. Use ``sections`` instead.
|
||||||
|
+
|
||||||
|
System accelerators
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
|
||||||
|
index 5de5dd0893..a2b318dd93 100644
|
||||||
|
--- a/hw/i386/sgx.c
|
||||||
|
+++ b/hw/i386/sgx.c
|
||||||
|
@@ -83,7 +83,7 @@ static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high)
|
||||||
|
((high & MAKE_64BIT_MASK(0, 20)) << 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static SGXEPCSectionList *sgx_calc_host_epc_sections(void)
|
||||||
|
+static SGXEPCSectionList *sgx_calc_host_epc_sections(uint64_t *size)
|
||||||
|
{
|
||||||
|
SGXEPCSectionList *head = NULL, **tail = &head;
|
||||||
|
SGXEPCSection *section;
|
||||||
|
@@ -106,6 +106,7 @@ static SGXEPCSectionList *sgx_calc_host_epc_sections(void)
|
||||||
|
section = g_new0(SGXEPCSection, 1);
|
||||||
|
section->node = j++;
|
||||||
|
section->size = sgx_calc_section_metric(ecx, edx);
|
||||||
|
+ *size += section->size;
|
||||||
|
QAPI_LIST_APPEND(tail, section);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -156,6 +157,7 @@ SGXInfo *qmp_query_sgx_capabilities(Error **errp)
|
||||||
|
{
|
||||||
|
SGXInfo *info = NULL;
|
||||||
|
uint32_t eax, ebx, ecx, edx;
|
||||||
|
+ uint64_t size = 0;
|
||||||
|
|
||||||
|
int fd = qemu_open_old("/dev/sgx_vepc", O_RDWR);
|
||||||
|
if (fd < 0) {
|
||||||
|
@@ -173,7 +175,8 @@ SGXInfo *qmp_query_sgx_capabilities(Error **errp)
|
||||||
|
info->sgx1 = eax & (1U << 0) ? true : false;
|
||||||
|
info->sgx2 = eax & (1U << 1) ? true : false;
|
||||||
|
|
||||||
|
- info->sections = sgx_calc_host_epc_sections();
|
||||||
|
+ info->sections = sgx_calc_host_epc_sections(&size);
|
||||||
|
+ info->section_size = size;
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
@@ -220,12 +223,14 @@ SGXInfo *qmp_query_sgx(Error **errp)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ SGXEPCState *sgx_epc = &pcms->sgx_epc;
|
||||||
|
info = g_new0(SGXInfo, 1);
|
||||||
|
|
||||||
|
info->sgx = true;
|
||||||
|
info->sgx1 = true;
|
||||||
|
info->sgx2 = true;
|
||||||
|
info->flc = true;
|
||||||
|
+ info->section_size = sgx_epc->size;
|
||||||
|
info->sections = sgx_get_epc_sections_list();
|
||||||
|
|
||||||
|
return info;
|
||||||
|
@@ -249,6 +254,8 @@ void hmp_info_sgx(Monitor *mon, const QDict *qdict)
|
||||||
|
info->sgx2 ? "enabled" : "disabled");
|
||||||
|
monitor_printf(mon, "FLC support: %s\n",
|
||||||
|
info->flc ? "enabled" : "disabled");
|
||||||
|
+ monitor_printf(mon, "size: %" PRIu64 "\n",
|
||||||
|
+ info->section_size);
|
||||||
|
|
||||||
|
section_list = info->sections;
|
||||||
|
for (section = section_list; section; section = section->next) {
|
||||||
|
diff --git a/qapi/machine.json b/qapi/machine.json
|
||||||
|
index 85c35e7fc5..03cfb268a4 100644
|
||||||
|
--- a/qapi/machine.json
|
||||||
|
+++ b/qapi/machine.json
|
||||||
|
@@ -1209,7 +1209,7 @@
|
||||||
|
#
|
||||||
|
# @memdev: memory backend linked with device
|
||||||
|
#
|
||||||
|
-# @node: the numa node
|
||||||
|
+# @node: the numa node (Since: 7.0)
|
||||||
|
#
|
||||||
|
# Since: 6.2
|
||||||
|
##
|
||||||
|
@@ -1290,7 +1290,7 @@
|
||||||
|
#
|
||||||
|
# @memdev: memory backend linked with device
|
||||||
|
#
|
||||||
|
-# @node: the numa node
|
||||||
|
+# @node: the numa node (Since: 7.0)
|
||||||
|
#
|
||||||
|
# Since: 6.2
|
||||||
|
##
|
||||||
|
diff --git a/qapi/misc-target.json b/qapi/misc-target.json
|
||||||
|
index 1022aa0184..4bc45d2474 100644
|
||||||
|
--- a/qapi/misc-target.json
|
||||||
|
+++ b/qapi/misc-target.json
|
||||||
|
@@ -344,9 +344,9 @@
|
||||||
|
#
|
||||||
|
# @node: the numa node
|
||||||
|
#
|
||||||
|
-# @size: the size of epc section
|
||||||
|
+# @size: the size of EPC section
|
||||||
|
#
|
||||||
|
-# Since: 6.2
|
||||||
|
+# Since: 7.0
|
||||||
|
##
|
||||||
|
{ 'struct': 'SGXEPCSection',
|
||||||
|
'data': { 'node': 'int',
|
||||||
|
@@ -365,7 +365,13 @@
|
||||||
|
#
|
||||||
|
# @flc: true if FLC is supported
|
||||||
|
#
|
||||||
|
-# @sections: The EPC sections info for guest
|
||||||
|
+# @section-size: The EPC section size for guest
|
||||||
|
+# Redundant with @sections. Just for backward compatibility.
|
||||||
|
+#
|
||||||
|
+# @sections: The EPC sections info for guest (Since: 7.0)
|
||||||
|
+#
|
||||||
|
+# Features:
|
||||||
|
+# @deprecated: Member @section-size is deprecated. Use @sections instead.
|
||||||
|
#
|
||||||
|
# Since: 6.2
|
||||||
|
##
|
||||||
|
@@ -374,6 +380,8 @@
|
||||||
|
'sgx1': 'bool',
|
||||||
|
'sgx2': 'bool',
|
||||||
|
'flc': 'bool',
|
||||||
|
+ 'section-size': { 'type': 'uint64',
|
||||||
|
+ 'features': [ 'deprecated' ] },
|
||||||
|
'sections': ['SGXEPCSection']},
|
||||||
|
'if': 'TARGET_I386' }
|
||||||
|
|
||||||
|
@@ -390,7 +398,9 @@
|
||||||
|
#
|
||||||
|
# -> { "execute": "query-sgx" }
|
||||||
|
# <- { "return": { "sgx": true, "sgx1" : true, "sgx2" : true,
|
||||||
|
-# "flc": true, "section-size" : 0 } }
|
||||||
|
+# "flc": true, "section-size" : 96468992,
|
||||||
|
+# "sections": [{"node": 0, "size": 67108864},
|
||||||
|
+# {"node": 1, "size": 29360128}]} }
|
||||||
|
#
|
||||||
|
##
|
||||||
|
{ 'command': 'query-sgx', 'returns': 'SGXInfo', 'if': 'TARGET_I386' }
|
||||||
|
@@ -408,7 +418,9 @@
|
||||||
|
#
|
||||||
|
# -> { "execute": "query-sgx-capabilities" }
|
||||||
|
# <- { "return": { "sgx": true, "sgx1" : true, "sgx2" : true,
|
||||||
|
-# "flc": true, "section-size" : 0 } }
|
||||||
|
+# "flc": true, "section-size" : 96468992,
|
||||||
|
+# "section" : [{"node": 0, "size": 67108864},
|
||||||
|
+# {"node": 1, "size": 29360128}]} }
|
||||||
|
#
|
||||||
|
##
|
||||||
|
{ 'command': 'query-sgx-capabilities', 'returns': 'SGXInfo', 'if': 'TARGET_I386' }
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
16
qemu.spec
16
qemu.spec
@ -1,6 +1,6 @@
|
|||||||
Name: qemu
|
Name: qemu
|
||||||
Version: 6.2.0
|
Version: 6.2.0
|
||||||
Release: 44
|
Release: 45
|
||||||
Epoch: 2
|
Epoch: 2
|
||||||
Summary: QEMU is a generic and open source machine emulator and virtualizer
|
Summary: QEMU is a generic and open source machine emulator and virtualizer
|
||||||
License: GPLv2 and BSD and MIT and CC-BY-SA-4.0
|
License: GPLv2 and BSD and MIT and CC-BY-SA-4.0
|
||||||
@ -283,6 +283,15 @@ Patch0269: hw-nvme-fix-CVE-2021-3929.patch
|
|||||||
Patch0270: acpi-validate-hotplug-selector-on-access.patch
|
Patch0270: acpi-validate-hotplug-selector-on-access.patch
|
||||||
Patch0271: virtiofsd-Drop-membership-of-all-supplementary-group.patch
|
Patch0271: virtiofsd-Drop-membership-of-all-supplementary-group.patch
|
||||||
Patch0272: softmmu-Always-initialize-xlat-in-address_space_tran.patch
|
Patch0272: softmmu-Always-initialize-xlat-in-address_space_tran.patch
|
||||||
|
Patch0273: numa-Enable-numa-for-SGX-EPC-sections.patch
|
||||||
|
Patch0274: numa-Support-SGX-numa-in-the-monitor-and-Libvirt-int.patch
|
||||||
|
Patch0275: doc-Add-the-SGX-numa-description.patch
|
||||||
|
Patch0276: qapi-Cleanup-SGX-related-comments-and-restore-sectio.patch
|
||||||
|
Patch0277: target-ppc-add-error-report-when-fopen-fails-in-kvmp.patch
|
||||||
|
Patch0278: target-ppc-enhance-error-report-in-kvmppc_read_int_c.patch
|
||||||
|
Patch0279: target-ppc-use-g_autofree-in-kvmppc_read_int_cpu_dt.patch
|
||||||
|
Patch0280: target-ppc-exit-1-on-failure-in-kvmppc_get_clockfreq.patch
|
||||||
|
Patch0281: bugfix-pointer-double-free-in-func-qemu_savevm_state.patch
|
||||||
|
|
||||||
BuildRequires: flex
|
BuildRequires: flex
|
||||||
BuildRequires: gcc
|
BuildRequires: gcc
|
||||||
@ -786,6 +795,11 @@ getent passwd qemu >/dev/null || \
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Aug 11 2022 yezengruan <yezengruan@huawei.com> - 2:6.2.0-45
|
||||||
|
- numa: Enable numa for SGX EPC sections
|
||||||
|
- target/ppc: enhance error handling in kvmppc_read_int*
|
||||||
|
- fix pointer double free in func qemu_savevm_state_complete_precopy_non_iterable
|
||||||
|
|
||||||
* Mon Jul 25 2022 yezengruan <yezengruan@huawei.com> - 2:6.2.0-44
|
* Mon Jul 25 2022 yezengruan <yezengruan@huawei.com> - 2:6.2.0-44
|
||||||
- add Requires libgcc
|
- add Requires libgcc
|
||||||
|
|
||||||
|
|||||||
50
target-ppc-add-error-report-when-fopen-fails-in-kvmp.patch
Normal file
50
target-ppc-add-error-report-when-fopen-fails-in-kvmp.patch
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
From 67a8e57c784ccbce4989c39dd44c70ae7f5aeda4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: jianchunfu <jianchunfu_yewu@cmss.chinamobile.com>
|
||||||
|
Date: Thu, 4 Aug 2022 15:37:47 +0800
|
||||||
|
Subject: [PATCH 5/9] target/ppc: add error report when fopen fails in
|
||||||
|
kvmppc_read_int_dt()
|
||||||
|
|
||||||
|
Use an Error pointer to report the error back to the caller.
|
||||||
|
While we're at it, return '0' instead of '-1' on error since the
|
||||||
|
function is supposed to return an uint64_t.
|
||||||
|
|
||||||
|
Signed-off-by: jianchunfu <jianchunfu_yewu@cmss.chinamobile.com>
|
||||||
|
---
|
||||||
|
target/ppc/kvm.c | 7 ++++---
|
||||||
|
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
|
||||||
|
index dc93b99189..63382256c3 100644
|
||||||
|
--- a/target/ppc/kvm.c
|
||||||
|
+++ b/target/ppc/kvm.c
|
||||||
|
@@ -1895,7 +1895,7 @@ static int kvmppc_find_cpu_dt(char *buf, int buf_len)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static uint64_t kvmppc_read_int_dt(const char *filename)
|
||||||
|
+static uint64_t kvmppc_read_int_dt(const char *filename, Error **errp)
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
uint32_t v32;
|
||||||
|
@@ -1906,7 +1906,8 @@ static uint64_t kvmppc_read_int_dt(const char *filename)
|
||||||
|
|
||||||
|
f = fopen(filename, "rb");
|
||||||
|
if (!f) {
|
||||||
|
- return -1;
|
||||||
|
+ error_setg_errno(errp, errno, "error opening %s", filename);
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = fread(&u, 1, sizeof(u), f);
|
||||||
|
@@ -1937,7 +1938,7 @@ static uint64_t kvmppc_read_int_cpu_dt(const char *propname)
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = g_strdup_printf("%s/%s", buf, propname);
|
||||||
|
- val = kvmppc_read_int_dt(tmp);
|
||||||
|
+ val = kvmppc_read_int_dt(tmp, NULL);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
|
return val;
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
81
target-ppc-enhance-error-report-in-kvmppc_read_int_c.patch
Normal file
81
target-ppc-enhance-error-report-in-kvmppc_read_int_c.patch
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
From b167d664414e7d4a5a7a7058bc4c7699f6e66d48 Mon Sep 17 00:00:00 2001
|
||||||
|
From: jianchunfu <jianchunfu_yewu@cmss.chinamobile.com>
|
||||||
|
Date: Thu, 4 Aug 2022 15:57:46 +0800
|
||||||
|
Subject: [PATCH 6/9] target/ppc: enhance error report in
|
||||||
|
kvmppc_read_int_cpu_dt()
|
||||||
|
|
||||||
|
First and foremost, the function can't return '-1' when an error occurs
|
||||||
|
because the return type is set to uint64_t. Let's fix that.
|
||||||
|
After that, the function can't simply return 0 whether an error happened
|
||||||
|
and call it a day. We must provide a way of letting callers know if the
|
||||||
|
zero return is legitimate or due to an error.
|
||||||
|
Add an Error pointer to kvmppc_read_int_cpu_dt() that will be filled
|
||||||
|
with an appropriate error, if one occurs. Callers are then free to pass
|
||||||
|
an Error pointer and handle it.
|
||||||
|
|
||||||
|
Signed-off-by: jianchunfu <jianchunfu_yewu@cmss.chinamobile.com>
|
||||||
|
---
|
||||||
|
target/ppc/kvm.c | 20 +++++++++++---------
|
||||||
|
1 file changed, 11 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
|
||||||
|
index 63382256c3..d64d7c5b4a 100644
|
||||||
|
--- a/target/ppc/kvm.c
|
||||||
|
+++ b/target/ppc/kvm.c
|
||||||
|
@@ -1925,20 +1925,22 @@ static uint64_t kvmppc_read_int_dt(const char *filename, Error **errp)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read a CPU node property from the host device tree that's a single
|
||||||
|
- * integer (32-bit or 64-bit). Returns 0 if anything goes wrong
|
||||||
|
- * (can't find or open the property, or doesn't understand the format)
|
||||||
|
+ * integer (32-bit or 64-bit). Returns 0 and set errp if anything goes
|
||||||
|
+ * wrong (can't find or open the property, or doesn't understand the
|
||||||
|
+ * format)
|
||||||
|
*/
|
||||||
|
-static uint64_t kvmppc_read_int_cpu_dt(const char *propname)
|
||||||
|
+static uint64_t kvmppc_read_int_cpu_dt(const char *propname, Error **errp)
|
||||||
|
{
|
||||||
|
char buf[PATH_MAX], *tmp;
|
||||||
|
uint64_t val;
|
||||||
|
|
||||||
|
if (kvmppc_find_cpu_dt(buf, sizeof(buf))) {
|
||||||
|
- return -1;
|
||||||
|
+ error_setg(errp, "Failed to read CPU property %s", propname);
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = g_strdup_printf("%s/%s", buf, propname);
|
||||||
|
- val = kvmppc_read_int_dt(tmp, NULL);
|
||||||
|
+ val = kvmppc_read_int_dt(tmp, errp);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
|
return val;
|
||||||
|
@@ -1946,12 +1948,12 @@ static uint64_t kvmppc_read_int_cpu_dt(const char *propname)
|
||||||
|
|
||||||
|
uint64_t kvmppc_get_clockfreq(void)
|
||||||
|
{
|
||||||
|
- return kvmppc_read_int_cpu_dt("clock-frequency");
|
||||||
|
+ return kvmppc_read_int_cpu_dt("clock-frequency", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int kvmppc_get_dec_bits(void)
|
||||||
|
{
|
||||||
|
- int nr_bits = kvmppc_read_int_cpu_dt("ibm,dec-bits");
|
||||||
|
+ int nr_bits = kvmppc_read_int_cpu_dt("ibm,dec-bits", NULL);
|
||||||
|
|
||||||
|
if (nr_bits > 0) {
|
||||||
|
return nr_bits;
|
||||||
|
@@ -2336,8 +2338,8 @@ static void alter_insns(uint64_t *word, uint64_t flags, bool on)
|
||||||
|
static void kvmppc_host_cpu_class_init(ObjectClass *oc, void *data)
|
||||||
|
{
|
||||||
|
PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
|
||||||
|
- uint32_t dcache_size = kvmppc_read_int_cpu_dt("d-cache-size");
|
||||||
|
- uint32_t icache_size = kvmppc_read_int_cpu_dt("i-cache-size");
|
||||||
|
+ uint32_t dcache_size = kvmppc_read_int_cpu_dt("d-cache-size", NULL);
|
||||||
|
+ uint32_t icache_size = kvmppc_read_int_cpu_dt("i-cache-size", NULL);
|
||||||
|
|
||||||
|
/* Now fix up the class with information we can query from the host */
|
||||||
|
pcc->pvr = mfpvr();
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
51
target-ppc-exit-1-on-failure-in-kvmppc_get_clockfreq.patch
Normal file
51
target-ppc-exit-1-on-failure-in-kvmppc_get_clockfreq.patch
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
From 584a648e0de0b0bda49e87349f2db3b2f0f87c33 Mon Sep 17 00:00:00 2001
|
||||||
|
From: jianchunfu <jianchunfu_yewu@cmss.chinamobile.com>
|
||||||
|
Date: Thu, 4 Aug 2022 16:47:26 +0800
|
||||||
|
Subject: [PATCH 8/9] target/ppc: exit(1) on failure in kvmppc_get_clockfreq()
|
||||||
|
|
||||||
|
When running under KVM accel it is expected to have 'clock-frequency' in
|
||||||
|
the DT. Not having this attribute is too risky for both the machine
|
||||||
|
emulation and userspace.
|
||||||
|
We have a way of telling whether this error scenario might happen or not
|
||||||
|
via kvmppc_read_int_cpu_dt() now being able to report errors. From now
|
||||||
|
on, when running KVM, we will assume that 'clock-frequency' will always
|
||||||
|
be present in the DT.
|
||||||
|
|
||||||
|
Signed-off-by: jianchunfu <jianchunfu_yewu@cmss.chinamobile.com>
|
||||||
|
---
|
||||||
|
target/ppc/kvm.c | 17 ++++++++++++++++-
|
||||||
|
1 file changed, 16 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
|
||||||
|
index 1a6c6b6fa0..d73563045b 100644
|
||||||
|
--- a/target/ppc/kvm.c
|
||||||
|
+++ b/target/ppc/kvm.c
|
||||||
|
@@ -1944,9 +1944,24 @@ static uint64_t kvmppc_read_int_cpu_dt(const char *propname, Error **errp)
|
||||||
|
return kvmppc_read_int_dt(tmp, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Read the clock-frequency from the DT. On error (e.g.
|
||||||
|
+ * 'clock-frequency' is not present in the DT) will
|
||||||
|
+ * report an error and exit(1).
|
||||||
|
+ */
|
||||||
|
uint64_t kvmppc_get_clockfreq(void)
|
||||||
|
{
|
||||||
|
- return kvmppc_read_int_cpu_dt("clock-frequency", NULL);
|
||||||
|
+ Error *local_err = NULL;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = kvmppc_read_int_cpu_dt("clock-frequency", &local_err);
|
||||||
|
+
|
||||||
|
+ if (local_err) {
|
||||||
|
+ error_report_err(local_err);
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int kvmppc_get_dec_bits(void)
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
43
target-ppc-use-g_autofree-in-kvmppc_read_int_cpu_dt.patch
Normal file
43
target-ppc-use-g_autofree-in-kvmppc_read_int_cpu_dt.patch
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
From 02a15861235d29dcf89b61bf88fed2ec4ccee9dc Mon Sep 17 00:00:00 2001
|
||||||
|
From: jianchunfu <jianchunfu_yewu@cmss.chinamobile.com>
|
||||||
|
Date: Thu, 4 Aug 2022 16:41:35 +0800
|
||||||
|
Subject: [PATCH 7/9] target/ppc: use g_autofree in kvmppc_read_int_cpu_dt()
|
||||||
|
|
||||||
|
This spares us a g_free() call. Let's also not use 'val' and return the
|
||||||
|
value of kvmppc_read_int_dt() directly.
|
||||||
|
|
||||||
|
Signed-off-by: jianchunfu <jianchunfu_yewu@cmss.chinamobile.com>
|
||||||
|
---
|
||||||
|
target/ppc/kvm.c | 8 +++-----
|
||||||
|
1 file changed, 3 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
|
||||||
|
index d64d7c5b4a..1a6c6b6fa0 100644
|
||||||
|
--- a/target/ppc/kvm.c
|
||||||
|
+++ b/target/ppc/kvm.c
|
||||||
|
@@ -1931,8 +1931,8 @@ static uint64_t kvmppc_read_int_dt(const char *filename, Error **errp)
|
||||||
|
*/
|
||||||
|
static uint64_t kvmppc_read_int_cpu_dt(const char *propname, Error **errp)
|
||||||
|
{
|
||||||
|
- char buf[PATH_MAX], *tmp;
|
||||||
|
- uint64_t val;
|
||||||
|
+ g_autofree char *tmp = NULL;
|
||||||
|
+ char buf[PATH_MAX];
|
||||||
|
|
||||||
|
if (kvmppc_find_cpu_dt(buf, sizeof(buf))) {
|
||||||
|
error_setg(errp, "Failed to read CPU property %s", propname);
|
||||||
|
@@ -1940,10 +1940,8 @@ static uint64_t kvmppc_read_int_cpu_dt(const char *propname, Error **errp)
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = g_strdup_printf("%s/%s", buf, propname);
|
||||||
|
- val = kvmppc_read_int_dt(tmp, errp);
|
||||||
|
- g_free(tmp);
|
||||||
|
|
||||||
|
- return val;
|
||||||
|
+ return kvmppc_read_int_dt(tmp, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t kvmppc_get_clockfreq(void)
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user