This patch can enable numa support for 'info sgx' command in the monitor, which can show detailed SGX EPC sections info.
(qemu) info sgx SGX support: enabled SGX1 support: enabled SGX2 support: enabled FLC support: enabled SECTION #0: size=67108864 SECTION #1: size=29360128 The QMP interface show: (QEMU) query-sgx {"return": {"sgx": true, "sgx2": true, "sgx1": true, "sections": \ [{"index": 0, "size": 67108864}, {"index": 1, "size": 29360128}], "flc": true}} Signed-off-by: Yang Zhong <yang.zh...@intel.com> --- hw/i386/sgx.c | 25 +++++++++++++++++++++++-- target/i386/monitor.c | 11 +++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c index 906facb645..8af45925c6 100644 --- a/hw/i386/sgx.c +++ b/hw/i386/sgx.c @@ -126,6 +126,28 @@ SGXInfo *sgx_get_capabilities(Error **errp) 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; + uint64_t i = 0; + + for (; device_list; device_list = device_list->next) { + DeviceState *dev = device_list->data; + Object *obj = OBJECT(dev); + + section = g_new0(SGXEPCSection, 1); + section->index = i++; + 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 *sgx_get_info(Error **errp) { SGXInfo *info = NULL; @@ -144,14 +166,13 @@ SGXInfo *sgx_get_info(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; } diff --git a/target/i386/monitor.c b/target/i386/monitor.c index 196c1c9e77..08e7d4a425 100644 --- a/target/i386/monitor.c +++ b/target/i386/monitor.c @@ -773,6 +773,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) { @@ -787,8 +788,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, "SECTION #%" PRId64 ": ", + section->value->index); + monitor_printf(mon, "size=%" PRIu64 "\n", + section->value->size); + } } SGXInfo *qmp_query_sgx_capabilities(Error **errp)