From nobody Fri Oct 24 21:54:37 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520233440813317.5479937752867; Sun, 4 Mar 2018 23:04:00 -0800 (PST) Received: from localhost ([::1]:47515 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eskAC-0001mb-3Z for importer@patchew.org; Mon, 05 Mar 2018 02:04:00 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47746) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1esk46-0004v3-3o for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:57:43 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1esk42-0004h7-6C for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:57:42 -0500 Received: from mga03.intel.com ([134.134.136.65]:48550) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1esk41-0004gN-PI; Mon, 05 Mar 2018 01:57:38 -0500 Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Mar 2018 22:57:36 -0800 Received: from hz-desktop.sh.intel.com (HELO localhost) ([10.239.13.35]) by fmsmga004.fm.intel.com with ESMTP; 04 Mar 2018 22:57:33 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,426,1515484800"; d="scan'208";a="34645599" From: Haozhong Zhang To: qemu-devel@nongnu.org Date: Mon, 5 Mar 2018 14:57:06 +0800 Message-Id: <20180305065710.25876-2-haozhong.zhang@intel.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180305065710.25876-1-haozhong.zhang@intel.com> References: <20180305065710.25876-1-haozhong.zhang@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 134.134.136.65 Subject: [Qemu-devel] [PATCH v3 1/5] pc-dimm: refactor qmp_pc_dimm_device_list X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Haozhong Zhang , Xiao Guangrong , mst@redhat.com, Bharata B Rao , Alexander Graf , Eduardo Habkost , Markus Armbruster , qemu-ppc@nongnu.org, Stefan Hajnoczi , Paolo Bonzini , Marcel Apfelbaum , Igor Mammedov , Dan Williams , David Gibson , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Use pc_dimm_built_list to hide recursive callbacks from callers. Signed-off-by: Haozhong Zhang --- hw/mem/pc-dimm.c | 83 +++++++++++++++++++++++++-------------------= ---- hw/ppc/spapr.c | 3 +- include/hw/mem/pc-dimm.h | 2 +- numa.c | 4 +-- qmp.c | 7 +--- stubs/qmp_pc_dimm.c | 4 +-- 6 files changed, 50 insertions(+), 53 deletions(-) diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c index 6e74b61cb6..4d050fe2cd 100644 --- a/hw/mem/pc-dimm.c +++ b/hw/mem/pc-dimm.c @@ -162,45 +162,6 @@ uint64_t get_plugged_memory_size(void) return pc_existing_dimms_capacity(&error_abort); } =20 -int qmp_pc_dimm_device_list(Object *obj, void *opaque) -{ - MemoryDeviceInfoList ***prev =3D opaque; - - if (object_dynamic_cast(obj, TYPE_PC_DIMM)) { - DeviceState *dev =3D DEVICE(obj); - - if (dev->realized) { - MemoryDeviceInfoList *elem =3D g_new0(MemoryDeviceInfoList, 1); - MemoryDeviceInfo *info =3D g_new0(MemoryDeviceInfo, 1); - PCDIMMDeviceInfo *di =3D g_new0(PCDIMMDeviceInfo, 1); - DeviceClass *dc =3D DEVICE_GET_CLASS(obj); - PCDIMMDevice *dimm =3D PC_DIMM(obj); - - if (dev->id) { - di->has_id =3D true; - di->id =3D g_strdup(dev->id); - } - di->hotplugged =3D dev->hotplugged; - di->hotpluggable =3D dc->hotpluggable; - di->addr =3D dimm->addr; - di->slot =3D dimm->slot; - di->node =3D dimm->node; - di->size =3D object_property_get_uint(OBJECT(dimm), PC_DIMM_SI= ZE_PROP, - NULL); - di->memdev =3D object_get_canonical_path(OBJECT(dimm->hostmem)= ); - - info->u.dimm.data =3D di; - elem->value =3D info; - elem->next =3D NULL; - **prev =3D elem; - *prev =3D &elem->next; - } - } - - object_child_foreach(obj, qmp_pc_dimm_device_list, opaque); - return 0; -} - static int pc_dimm_slot2bitmap(Object *obj, void *opaque) { unsigned long *bitmap =3D opaque; @@ -276,6 +237,50 @@ static int pc_dimm_built_list(Object *obj, void *opaqu= e) return 0; } =20 +MemoryDeviceInfoList *qmp_pc_dimm_device_list(void) +{ + GSList *dimms =3D NULL, *item; + MemoryDeviceInfoList *list =3D NULL, *prev =3D NULL; + + object_child_foreach(qdev_get_machine(), pc_dimm_built_list, &dimms); + + for (item =3D dimms; item; item =3D g_slist_next(item)) { + PCDIMMDevice *dimm =3D PC_DIMM(item->data); + Object *obj =3D OBJECT(dimm); + MemoryDeviceInfoList *elem =3D g_new0(MemoryDeviceInfoList, 1); + MemoryDeviceInfo *info =3D g_new0(MemoryDeviceInfo, 1); + PCDIMMDeviceInfo *di =3D g_new0(PCDIMMDeviceInfo, 1); + DeviceClass *dc =3D DEVICE_GET_CLASS(obj); + DeviceState *dev =3D DEVICE(obj); + + if (dev->id) { + di->has_id =3D true; + di->id =3D g_strdup(dev->id); + } + di->hotplugged =3D dev->hotplugged; + di->hotpluggable =3D dc->hotpluggable; + di->addr =3D dimm->addr; + di->slot =3D dimm->slot; + di->node =3D dimm->node; + di->size =3D object_property_get_uint(obj, PC_DIMM_SIZE_PROP, NULL= ); + di->memdev =3D object_get_canonical_path(OBJECT(dimm->hostmem)); + + info->u.dimm.data =3D di; + elem->value =3D info; + elem->next =3D NULL; + if (prev) { + prev->next =3D elem; + } else { + list =3D elem; + } + prev =3D elem; + } + + g_slist_free(dimms); + + return list; +} + uint64_t pc_dimm_get_free_addr(uint64_t address_space_start, uint64_t address_space_size, uint64_t *hint, uint64_t align, uint64_t si= ze, diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 83c9d66dd5..68a81e47d2 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -731,8 +731,7 @@ static int spapr_populate_drconf_memory(sPAPRMachineSta= te *spapr, void *fdt) } =20 if (hotplug_lmb_start) { - MemoryDeviceInfoList **prev =3D &dimms; - qmp_pc_dimm_device_list(qdev_get_machine(), &prev); + dimms =3D qmp_pc_dimm_device_list(); } =20 /* ibm,dynamic-memory */ diff --git a/include/hw/mem/pc-dimm.h b/include/hw/mem/pc-dimm.h index d83b957829..1fc479281c 100644 --- a/include/hw/mem/pc-dimm.h +++ b/include/hw/mem/pc-dimm.h @@ -93,7 +93,7 @@ uint64_t pc_dimm_get_free_addr(uint64_t address_space_sta= rt, =20 int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp); =20 -int qmp_pc_dimm_device_list(Object *obj, void *opaque); +MemoryDeviceInfoList *qmp_pc_dimm_device_list(void); uint64_t pc_existing_dimms_capacity(Error **errp); uint64_t get_plugged_memory_size(void); void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms, diff --git a/numa.c b/numa.c index 7e0e789b02..c6734ceb8c 100644 --- a/numa.c +++ b/numa.c @@ -520,12 +520,10 @@ void memory_region_allocate_system_memory(MemoryRegio= n *mr, Object *owner, =20 static void numa_stat_memory_devices(NumaNodeMem node_mem[]) { - MemoryDeviceInfoList *info_list =3D NULL; - MemoryDeviceInfoList **prev =3D &info_list; + MemoryDeviceInfoList *info_list =3D qmp_pc_dimm_device_list(); MemoryDeviceInfoList *info; PCDIMMDeviceInfo *pcdimm_info; =20 - qmp_pc_dimm_device_list(qdev_get_machine(), &prev); for (info =3D info_list; info; info =3D info->next) { MemoryDeviceInfo *value =3D info->value; =20 diff --git a/qmp.c b/qmp.c index 793f6f3323..c6ac7b05b4 100644 --- a/qmp.c +++ b/qmp.c @@ -680,12 +680,7 @@ void qmp_object_del(const char *id, Error **errp) =20 MemoryDeviceInfoList *qmp_query_memory_devices(Error **errp) { - MemoryDeviceInfoList *head =3D NULL; - MemoryDeviceInfoList **prev =3D &head; - - qmp_pc_dimm_device_list(qdev_get_machine(), &prev); - - return head; + return qmp_pc_dimm_device_list(); } =20 ACPIOSTInfoList *qmp_query_acpi_ospm_status(Error **errp) diff --git a/stubs/qmp_pc_dimm.c b/stubs/qmp_pc_dimm.c index 9ddc4f619a..b6b2cca89e 100644 --- a/stubs/qmp_pc_dimm.c +++ b/stubs/qmp_pc_dimm.c @@ -2,9 +2,9 @@ #include "qom/object.h" #include "hw/mem/pc-dimm.h" =20 -int qmp_pc_dimm_device_list(Object *obj, void *opaque) +MemoryDeviceInfoList *qmp_pc_dimm_device_list(void) { - return 0; + return NULL; } =20 uint64_t get_plugged_memory_size(void) --=20 2.14.1 From nobody Fri Oct 24 21:54:37 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520233181337384.62845085802644; Sun, 4 Mar 2018 22:59:41 -0800 (PST) Received: from localhost ([::1]:47478 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1esk5y-0006OD-AK for importer@patchew.org; Mon, 05 Mar 2018 01:59:38 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47826) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1esk4B-0004z9-GY for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:57:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1esk47-0004lD-JW for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:57:47 -0500 Received: from mga01.intel.com ([192.55.52.88]:22624) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1esk46-0004iW-Su for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:57:43 -0500 Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Mar 2018 22:57:41 -0800 Received: from hz-desktop.sh.intel.com (HELO localhost) ([10.239.13.35]) by fmsmga004.fm.intel.com with ESMTP; 04 Mar 2018 22:57:39 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,426,1515484800"; d="scan'208";a="34645634" From: Haozhong Zhang To: qemu-devel@nongnu.org Date: Mon, 5 Mar 2018 14:57:07 +0800 Message-Id: <20180305065710.25876-3-haozhong.zhang@intel.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180305065710.25876-1-haozhong.zhang@intel.com> References: <20180305065710.25876-1-haozhong.zhang@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 192.55.52.88 Subject: [Qemu-devel] [PATCH v3 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Haozhong Zhang , Xiao Guangrong , mst@redhat.com, Markus Armbruster , Eduardo Habkost , dgilbert@redhat.com, Stefan Hajnoczi , Paolo Bonzini , Marcel Apfelbaum , Igor Mammedov , Dan Williams , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" It may need to treat PC-DIMM and NVDIMM differently, e.g., when deciding the necessity of non-volatile flag bit in SRAT memory affinity structures. NVDIMMDeviceInfo, which inherits from PCDIMMDeviceInfo, is added to union type MemoryDeviceInfo to record information of NVDIMM devices. The NVDIMM-specific data is currently left empty and will be filled when necessary in the future. Signed-off-by: Haozhong Zhang --- hmp.c | 14 +++++++++++--- hw/mem/pc-dimm.c | 20 ++++++++++++++++++-- numa.c | 19 +++++++++++++------ qapi-schema.json | 18 +++++++++++++++++- 4 files changed, 59 insertions(+), 12 deletions(-) diff --git a/hmp.c b/hmp.c index ae86bfbade..3f06407c5e 100644 --- a/hmp.c +++ b/hmp.c @@ -2413,7 +2413,18 @@ void hmp_info_memory_devices(Monitor *mon, const QDi= ct *qdict) switch (value->type) { case MEMORY_DEVICE_INFO_KIND_DIMM: di =3D value->u.dimm.data; + break; + + case MEMORY_DEVICE_INFO_KIND_NVDIMM: + di =3D qapi_NVDIMMDeviceInfo_base(value->u.nvdimm.data); + break; + + default: + di =3D NULL; + break; + } =20 + if (di) { monitor_printf(mon, "Memory device [%s]: \"%s\"\n", MemoryDeviceInfoKind_str(value->type), di->id ? di->id : ""); @@ -2426,9 +2437,6 @@ void hmp_info_memory_devices(Monitor *mon, const QDic= t *qdict) di->hotplugged ? "true" : "false"); monitor_printf(mon, " hotpluggable: %s\n", di->hotpluggable ? "true" : "false"); - break; - default: - break; } } } diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c index 4d050fe2cd..866ecc699a 100644 --- a/hw/mem/pc-dimm.c +++ b/hw/mem/pc-dimm.c @@ -20,6 +20,7 @@ =20 #include "qemu/osdep.h" #include "hw/mem/pc-dimm.h" +#include "hw/mem/nvdimm.h" #include "qapi/error.h" #include "qemu/config-file.h" #include "qapi/visitor.h" @@ -249,10 +250,19 @@ MemoryDeviceInfoList *qmp_pc_dimm_device_list(void) Object *obj =3D OBJECT(dimm); MemoryDeviceInfoList *elem =3D g_new0(MemoryDeviceInfoList, 1); MemoryDeviceInfo *info =3D g_new0(MemoryDeviceInfo, 1); - PCDIMMDeviceInfo *di =3D g_new0(PCDIMMDeviceInfo, 1); + PCDIMMDeviceInfo *di; + NVDIMMDeviceInfo *ndi; + bool is_nvdimm =3D object_dynamic_cast(obj, TYPE_NVDIMM); DeviceClass *dc =3D DEVICE_GET_CLASS(obj); DeviceState *dev =3D DEVICE(obj); =20 + if (!is_nvdimm) { + di =3D g_new0(PCDIMMDeviceInfo, 1); + } else { + ndi =3D g_new0(NVDIMMDeviceInfo, 1); + di =3D qapi_NVDIMMDeviceInfo_base(ndi); + } + if (dev->id) { di->has_id =3D true; di->id =3D g_strdup(dev->id); @@ -265,7 +275,13 @@ MemoryDeviceInfoList *qmp_pc_dimm_device_list(void) di->size =3D object_property_get_uint(obj, PC_DIMM_SIZE_PROP, NULL= ); di->memdev =3D object_get_canonical_path(OBJECT(dimm->hostmem)); =20 - info->u.dimm.data =3D di; + if (!is_nvdimm) { + info->u.dimm.data =3D di; + info->type =3D MEMORY_DEVICE_INFO_KIND_DIMM; + } else { + info->u.nvdimm.data =3D ndi; + info->type =3D MEMORY_DEVICE_INFO_KIND_NVDIMM; + } elem->value =3D info; elem->next =3D NULL; if (prev) { diff --git a/numa.c b/numa.c index c6734ceb8c..23c4371e51 100644 --- a/numa.c +++ b/numa.c @@ -529,18 +529,25 @@ static void numa_stat_memory_devices(NumaNodeMem node= _mem[]) =20 if (value) { switch (value->type) { - case MEMORY_DEVICE_INFO_KIND_DIMM: { + case MEMORY_DEVICE_INFO_KIND_DIMM: pcdimm_info =3D value->u.dimm.data; + break; + + case MEMORY_DEVICE_INFO_KIND_NVDIMM: + pcdimm_info =3D qapi_NVDIMMDeviceInfo_base(value->u.nvdimm= .data); + break; + + default: + pcdimm_info =3D NULL; + break; + } + + if (pcdimm_info) { node_mem[pcdimm_info->node].node_mem +=3D pcdimm_info->siz= e; if (pcdimm_info->hotpluggable && pcdimm_info->hotplugged) { node_mem[pcdimm_info->node].node_plugged_mem +=3D pcdimm_info->size; } - break; - } - - default: - break; } } } diff --git a/qapi-schema.json b/qapi-schema.json index cd98a94388..1c2d281749 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -2920,6 +2920,18 @@ } } =20 +## +# @NVDIMMDeviceInfo: +# +# NVDIMMDevice state information +# +# Since: 2.12 +## +{ 'struct': 'NVDIMMDeviceInfo', + 'base': 'PCDIMMDeviceInfo', + 'data': {} +} + ## # @MemoryDeviceInfo: # @@ -2927,7 +2939,11 @@ # # Since: 2.1 ## -{ 'union': 'MemoryDeviceInfo', 'data': {'dimm': 'PCDIMMDeviceInfo'} } +{ 'union': 'MemoryDeviceInfo', + 'data': { 'dimm': 'PCDIMMDeviceInfo', + 'nvdimm': 'NVDIMMDeviceInfo' + } +} =20 ## # @query-memory-devices: --=20 2.14.1 From nobody Fri Oct 24 21:54:37 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520233332665278.356267981448; Sun, 4 Mar 2018 23:02:12 -0800 (PST) Received: from localhost ([::1]:47501 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1esk8S-0000AU-04 for importer@patchew.org; Mon, 05 Mar 2018 02:02:12 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47867) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1esk4G-000535-Hd for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:57:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1esk4C-0004oQ-Jd for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:57:52 -0500 Received: from mga12.intel.com ([192.55.52.136]:5361) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1esk4C-0004nb-A6 for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:57:48 -0500 Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Mar 2018 22:57:47 -0800 Received: from hz-desktop.sh.intel.com (HELO localhost) ([10.239.13.35]) by fmsmga004.fm.intel.com with ESMTP; 04 Mar 2018 22:57:45 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,426,1515484800"; d="scan'208";a="34645641" From: Haozhong Zhang To: qemu-devel@nongnu.org Date: Mon, 5 Mar 2018 14:57:08 +0800 Message-Id: <20180305065710.25876-4-haozhong.zhang@intel.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180305065710.25876-1-haozhong.zhang@intel.com> References: <20180305065710.25876-1-haozhong.zhang@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 192.55.52.136 Subject: [Qemu-devel] [PATCH v3 3/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Haozhong Zhang , Xiao Guangrong , mst@redhat.com, Eduardo Habkost , Stefan Hajnoczi , Paolo Bonzini , Marcel Apfelbaum , Igor Mammedov , Dan Williams , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" ACPI 6.2A Table 5-129 "SPA Range Structure" requires the proximity domain of a NVDIMM SPA range must match with corresponding entry in SRAT table. The address ranges of vNVDIMM in QEMU are allocated from the hot-pluggable address space, which is entirely covered by one SRAT memory affinity structure. However, users can set the vNVDIMM proximity domain in NFIT SPA range structure by the 'node' property of '-device nvdimm' to a value different than the one in the above SRAT memory affinity structure. In order to solve such proximity domain mismatch, this patch builds one SRAT memory affinity structure for each DIMM device present at boot time, including both PC-DIMM and NVDIMM, with the proximity domain specified in '-device pc-dimm' or '-device nvdimm'. The remaining hot-pluggable address space is covered by one or multiple SRAT memory affinity structures with the proximity domain of the last node as before. Signed-off-by: Haozhong Zhang --- hw/i386/acpi-build.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++= ---- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index deb440f286..2ca0317386 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -2323,6 +2323,59 @@ build_tpm2(GArray *table_data, BIOSLinker *linker, G= Array *tcpalog) #define HOLE_640K_START (640 * 1024) #define HOLE_640K_END (1024 * 1024) =20 +static void build_srat_hotpluggable_memory(GArray *table_data, uint64_t ba= se, + uint64_t len, int default_node) +{ + MemoryDeviceInfoList *info_list =3D qmp_pc_dimm_device_list(); + MemoryDeviceInfoList *info; + MemoryDeviceInfo *mi; + PCDIMMDeviceInfo *di; + uint64_t end =3D base + len, cur, addr, size; + int node; + bool is_nvdimm; + AcpiSratMemoryAffinity *numamem; + MemoryAffinityFlags flags; + + for (cur =3D base, info =3D info_list; + cur < end; + cur +=3D size, info =3D info->next) { + numamem =3D acpi_data_push(table_data, sizeof *numamem); + + if (!info) { + build_srat_memory(numamem, cur, end - cur, default_node, + MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENA= BLED); + break; + } + + mi =3D info->value; + is_nvdimm =3D (mi->type =3D=3D MEMORY_DEVICE_INFO_KIND_NVDIMM); + di =3D !is_nvdimm ? mi->u.dimm.data : + qapi_NVDIMMDeviceInfo_base(mi->u.nvdimm.data); + + addr =3D di->addr; + if (cur < addr) { + build_srat_memory(numamem, cur, addr - cur, default_node, + MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENA= BLED); + numamem =3D acpi_data_push(table_data, sizeof *numamem); + } + + size =3D di->size; + node =3D di->node; + + flags =3D MEM_AFFINITY_ENABLED; + if (di->hotpluggable) { + flags |=3D MEM_AFFINITY_HOTPLUGGABLE; + } + if (is_nvdimm) { + flags |=3D MEM_AFFINITY_NON_VOLATILE; + } + + build_srat_memory(numamem, addr, size, node, flags); + } + + qapi_free_MemoryDeviceInfoList(info_list); +} + static void build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) { @@ -2434,10 +2487,9 @@ build_srat(GArray *table_data, BIOSLinker *linker, M= achineState *machine) * providing _PXM method if necessary. */ if (hotplugabble_address_space_size) { - numamem =3D acpi_data_push(table_data, sizeof *numamem); - build_srat_memory(numamem, pcms->hotplug_memory.base, - hotplugabble_address_space_size, pcms->numa_node= s - 1, - MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED= ); + build_srat_hotpluggable_memory(table_data, pcms->hotplug_memory.ba= se, + hotplugabble_address_space_size, + pcms->numa_nodes - 1); } =20 build_header(linker, table_data, --=20 2.14.1 From nobody Fri Oct 24 21:54:37 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520233194481206.77326639766193; Sun, 4 Mar 2018 22:59:54 -0800 (PST) Received: from localhost ([::1]:47480 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1esk6D-0006b1-JX for importer@patchew.org; Mon, 05 Mar 2018 01:59:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47905) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1esk4P-0005Bl-58 for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:58:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1esk4L-0004rZ-7f for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:58:01 -0500 Received: from mga07.intel.com ([134.134.136.100]:36125) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1esk4K-0004rA-Qy for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:57:57 -0500 Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Mar 2018 22:57:55 -0800 Received: from hz-desktop.sh.intel.com (HELO localhost) ([10.239.13.35]) by fmsmga004.fm.intel.com with ESMTP; 04 Mar 2018 22:57:53 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,426,1515484800"; d="scan'208";a="34645661" From: Haozhong Zhang To: qemu-devel@nongnu.org Date: Mon, 5 Mar 2018 14:57:09 +0800 Message-Id: <20180305065710.25876-5-haozhong.zhang@intel.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180305065710.25876-1-haozhong.zhang@intel.com> References: <20180305065710.25876-1-haozhong.zhang@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 134.134.136.100 Subject: [Qemu-devel] [PATCH v3 4/5] tests/bios-tables-test: allow setting extra machine options X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Haozhong Zhang , Xiao Guangrong , mst@redhat.com, Eduardo Habkost , Stefan Hajnoczi , Paolo Bonzini , Marcel Apfelbaum , Igor Mammedov , Dan Williams , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Some test cases may require extra machine options than those used in the current test_acpi_ones(), e.g., nvdimm test cases require the machine option 'nvdimm=3Don'. Signed-off-by: Haozhong Zhang --- tests/bios-tables-test.c | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c index 65b271a173..d45181aa51 100644 --- a/tests/bios-tables-test.c +++ b/tests/bios-tables-test.c @@ -654,17 +654,22 @@ static void test_smbios_structs(test_data *data) } } =20 -static void test_acpi_one(const char *params, test_data *data) +static void test_acpi_one(const char *extra_machine_opts, + const char *params, test_data *data) { char *args; =20 /* Disable kernel irqchip to be able to override apic irq0. */ - args =3D g_strdup_printf("-machine %s,accel=3D%s,kernel-irqchip=3Doff " + args =3D g_strdup_printf("-machine %s,accel=3D%s,kernel-irqchip=3Doff", + data->machine, "kvm:tcg"); + if (extra_machine_opts) { + args =3D g_strdup_printf("%s,%s", args, extra_machine_opts); + } + args =3D g_strdup_printf("%s " "-net none -display none %s " "-drive id=3Dhd0,if=3Dnone,file=3D%s,format=3Dr= aw " "-device ide-hd,drive=3Dhd0 ", - data->machine, "kvm:tcg", - params ? params : "", disk); + args, params ? params : "", disk); =20 qtest_start(args); =20 @@ -711,7 +716,7 @@ static void test_acpi_piix4_tcg(void) data.machine =3D MACHINE_PC; data.required_struct_types =3D base_required_struct_types; data.required_struct_types_len =3D ARRAY_SIZE(base_required_struct_typ= es); - test_acpi_one(NULL, &data); + test_acpi_one(NULL, NULL, &data); free_test_data(&data); } =20 @@ -724,7 +729,7 @@ static void test_acpi_piix4_tcg_bridge(void) data.variant =3D ".bridge"; data.required_struct_types =3D base_required_struct_types; data.required_struct_types_len =3D ARRAY_SIZE(base_required_struct_typ= es); - test_acpi_one("-device pci-bridge,chassis_nr=3D1", &data); + test_acpi_one(NULL, "-device pci-bridge,chassis_nr=3D1", &data); free_test_data(&data); } =20 @@ -736,7 +741,7 @@ static void test_acpi_q35_tcg(void) data.machine =3D MACHINE_Q35; data.required_struct_types =3D base_required_struct_types; data.required_struct_types_len =3D ARRAY_SIZE(base_required_struct_typ= es); - test_acpi_one(NULL, &data); + test_acpi_one(NULL, NULL, &data); free_test_data(&data); } =20 @@ -749,7 +754,7 @@ static void test_acpi_q35_tcg_bridge(void) data.variant =3D ".bridge"; data.required_struct_types =3D base_required_struct_types; data.required_struct_types_len =3D ARRAY_SIZE(base_required_struct_typ= es); - test_acpi_one("-device pci-bridge,chassis_nr=3D1", + test_acpi_one(NULL, "-device pci-bridge,chassis_nr=3D1", &data); free_test_data(&data); } @@ -761,7 +766,8 @@ static void test_acpi_piix4_tcg_cphp(void) memset(&data, 0, sizeof(data)); data.machine =3D MACHINE_PC; data.variant =3D ".cphp"; - test_acpi_one("-smp 2,cores=3D3,sockets=3D2,maxcpus=3D6" + test_acpi_one(NULL, + "-smp 2,cores=3D3,sockets=3D2,maxcpus=3D6" " -numa node -numa node" " -numa dist,src=3D0,dst=3D1,val=3D21", &data); @@ -775,7 +781,8 @@ static void test_acpi_q35_tcg_cphp(void) memset(&data, 0, sizeof(data)); data.machine =3D MACHINE_Q35; data.variant =3D ".cphp"; - test_acpi_one(" -smp 2,cores=3D3,sockets=3D2,maxcpus=3D6" + test_acpi_one(NULL, + " -smp 2,cores=3D3,sockets=3D2,maxcpus=3D6" " -numa node -numa node" " -numa dist,src=3D0,dst=3D1,val=3D21", &data); @@ -795,7 +802,8 @@ static void test_acpi_q35_tcg_ipmi(void) data.variant =3D ".ipmibt"; data.required_struct_types =3D ipmi_required_struct_types; data.required_struct_types_len =3D ARRAY_SIZE(ipmi_required_struct_typ= es); - test_acpi_one("-device ipmi-bmc-sim,id=3Dbmc0" + test_acpi_one(NULL, + "-device ipmi-bmc-sim,id=3Dbmc0" " -device isa-ipmi-bt,bmc=3Dbmc0", &data); free_test_data(&data); @@ -813,7 +821,8 @@ static void test_acpi_piix4_tcg_ipmi(void) data.variant =3D ".ipmikcs"; data.required_struct_types =3D ipmi_required_struct_types; data.required_struct_types_len =3D ARRAY_SIZE(ipmi_required_struct_typ= es); - test_acpi_one("-device ipmi-bmc-sim,id=3Dbmc0" + test_acpi_one(NULL, + "-device ipmi-bmc-sim,id=3Dbmc0" " -device isa-ipmi-kcs,irq=3D0,bmc=3Dbmc0", &data); free_test_data(&data); @@ -826,7 +835,8 @@ static void test_acpi_q35_tcg_memhp(void) memset(&data, 0, sizeof(data)); data.machine =3D MACHINE_Q35; data.variant =3D ".memhp"; - test_acpi_one(" -m 128,slots=3D3,maxmem=3D1G" + test_acpi_one(NULL, + " -m 128,slots=3D3,maxmem=3D1G" " -numa node -numa node" " -numa dist,src=3D0,dst=3D1,val=3D21", &data); @@ -840,7 +850,8 @@ static void test_acpi_piix4_tcg_memhp(void) memset(&data, 0, sizeof(data)); data.machine =3D MACHINE_PC; data.variant =3D ".memhp"; - test_acpi_one(" -m 128,slots=3D3,maxmem=3D1G" + test_acpi_one(NULL, + " -m 128,slots=3D3,maxmem=3D1G" " -numa node -numa node" " -numa dist,src=3D0,dst=3D1,val=3D21", &data); @@ -854,7 +865,8 @@ static void test_acpi_q35_tcg_numamem(void) memset(&data, 0, sizeof(data)); data.machine =3D MACHINE_Q35; data.variant =3D ".numamem"; - test_acpi_one(" -numa node -numa node,mem=3D128", &data); + test_acpi_one(NULL, + " -numa node -numa node,mem=3D128", &data); free_test_data(&data); } =20 @@ -865,7 +877,8 @@ static void test_acpi_piix4_tcg_numamem(void) memset(&data, 0, sizeof(data)); data.machine =3D MACHINE_PC; data.variant =3D ".numamem"; - test_acpi_one(" -numa node -numa node,mem=3D128", &data); + test_acpi_one(NULL, + " -numa node -numa node,mem=3D128", &data); free_test_data(&data); } =20 --=20 2.14.1 From nobody Fri Oct 24 21:54:37 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520233351475182.66211305764296; Sun, 4 Mar 2018 23:02:31 -0800 (PST) Received: from localhost ([::1]:47502 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1esk8k-0000N8-Lv for importer@patchew.org; Mon, 05 Mar 2018 02:02:30 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47923) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1esk4Q-0005Ck-CE for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:58:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1esk4N-0004sh-TY for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:58:02 -0500 Received: from mga07.intel.com ([134.134.136.100]:36125) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1esk4N-0004rA-FW for qemu-devel@nongnu.org; Mon, 05 Mar 2018 01:57:59 -0500 Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Mar 2018 22:57:58 -0800 Received: from hz-desktop.sh.intel.com (HELO localhost) ([10.239.13.35]) by fmsmga004.fm.intel.com with ESMTP; 04 Mar 2018 22:57:56 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,426,1515484800"; d="scan'208";a="34645667" From: Haozhong Zhang To: qemu-devel@nongnu.org Date: Mon, 5 Mar 2018 14:57:10 +0800 Message-Id: <20180305065710.25876-6-haozhong.zhang@intel.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180305065710.25876-1-haozhong.zhang@intel.com> References: <20180305065710.25876-1-haozhong.zhang@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 134.134.136.100 Subject: [Qemu-devel] [PATCH v3 5/5] tests/bios-tables-test: add test cases for DIMM proximity X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Haozhong Zhang , Xiao Guangrong , mst@redhat.com, Eduardo Habkost , Stefan Hajnoczi , Paolo Bonzini , Marcel Apfelbaum , Igor Mammedov , Dan Williams , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" QEMU now builds one SRAT memory affinity structure for each static-plugged PC-DIMM and NVDIMM device with the proximity domain specified in the device option 'node', rather than only one SRAT memory affinity structure covering the entire hotpluggable address space with the proximity domain of the last node. Add test cases on PC and Q35 machines with 3 proximity domains, and one PC-DIMM and one NVDIMM attached to the second proximity domain. Check whether the QEMU-built SRAT tables match with the expected ones. Signed-off-by: Haozhong Zhang Suggested-by: Igor Mammedov --- tests/acpi-test-data/pc/APIC.dimmpxm | Bin 0 -> 136 bytes tests/acpi-test-data/pc/DSDT.dimmpxm | Bin 0 -> 6710 bytes tests/acpi-test-data/pc/NFIT.dimmpxm | Bin 0 -> 224 bytes tests/acpi-test-data/pc/SRAT.dimmpxm | Bin 0 -> 416 bytes tests/acpi-test-data/pc/SSDT.dimmpxm | Bin 0 -> 685 bytes tests/acpi-test-data/q35/APIC.dimmpxm | Bin 0 -> 136 bytes tests/acpi-test-data/q35/DSDT.dimmpxm | Bin 0 -> 9394 bytes tests/acpi-test-data/q35/NFIT.dimmpxm | Bin 0 -> 224 bytes tests/acpi-test-data/q35/SRAT.dimmpxm | Bin 0 -> 416 bytes tests/acpi-test-data/q35/SSDT.dimmpxm | Bin 0 -> 685 bytes tests/bios-tables-test.c | 33 ++++++++++++++++++++++++++++++= +++ 11 files changed, 33 insertions(+) create mode 100644 tests/acpi-test-data/pc/APIC.dimmpxm create mode 100644 tests/acpi-test-data/pc/DSDT.dimmpxm create mode 100644 tests/acpi-test-data/pc/NFIT.dimmpxm create mode 100644 tests/acpi-test-data/pc/SRAT.dimmpxm create mode 100644 tests/acpi-test-data/pc/SSDT.dimmpxm create mode 100644 tests/acpi-test-data/q35/APIC.dimmpxm create mode 100644 tests/acpi-test-data/q35/DSDT.dimmpxm create mode 100644 tests/acpi-test-data/q35/NFIT.dimmpxm create mode 100644 tests/acpi-test-data/q35/SRAT.dimmpxm create mode 100644 tests/acpi-test-data/q35/SSDT.dimmpxm diff --git a/tests/acpi-test-data/pc/APIC.dimmpxm b/tests/acpi-test-data/pc= /APIC.dimmpxm new file mode 100644 index 0000000000000000000000000000000000000000..658d7e748e37540ff85a02f4391= efc7eaae3c8b4 GIT binary patch literal 136 zcmZ<^@O18AU|?W8>g4b25v<@85#a0y6k`O6f!H9Lf#JbFFwFr}2jX%tGD2u3CJ@cY q0}?#&4@5F?0WpXHVzIIUXMv!Q`St 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 literal 0 HcmV?d00001 diff --git a/tests/acpi-test-data/pc/NFIT.dimmpxm b/tests/acpi-test-data/pc= /NFIT.dimmpxm new file mode 100644 index 0000000000000000000000000000000000000000..207328ed9357409e4098df64f95= 1a29527ab52de GIT binary patch literal 224 zcmeZs^9*^wz`(#5;Ny0aC=3D#03w0rG8iy0L6|`OtRNOx9x8-HL3Fb)1OQdFH828oB7<-f NAqGZ>^~k~m*#MLQ69E7K literal 0 HcmV?d00001 diff --git a/tests/acpi-test-data/pc/SRAT.dimmpxm b/tests/acpi-test-data/pc= /SRAT.dimmpxm new file mode 100644 index 0000000000000000000000000000000000000000..b308d09b94cb8547f611bf8eb3a= 956359a71576c GIT binary patch literal 416 zcmWFzatv9($iTp8?d0$55v<@85#SsQ6axw|fY=3D}!gyBE{ozKXKD$m4(%xBbq>x446 z-~!my0WAQ74{&KX11Qd@0p~G66~br~cQR_gg;}8LU^JRKs4M{r$zGU#4wx2Z7z0Qn ZspEjU6t0dPMIGFI0#J1?VA9Cu0RYf$3jqKC literal 0 HcmV?d00001 diff --git a/tests/acpi-test-data/pc/SSDT.dimmpxm b/tests/acpi-test-data/pc= /SSDT.dimmpxm new file mode 100644 index 0000000000000000000000000000000000000000..2d5b721bcf9c398feb6d005761f= 898015042e8a4 GIT binary patch literal 685 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 Ac>n+a literal 0 HcmV?d00001 diff --git a/tests/acpi-test-data/q35/NFIT.dimmpxm b/tests/acpi-test-data/q= 35/NFIT.dimmpxm new file mode 100644 index 0000000000000000000000000000000000000000..207328ed9357409e4098df64f95= 1a29527ab52de GIT binary patch literal 224 zcmeZs^9*^wz`(#5;Ny0aC=3D#03w0rG8iy0L6|`OtRNOx9x8-HL3Fb)1OQdFH828oB7<-f NAqGZ>^~k~m*#MLQ69E7K literal 0 HcmV?d00001 diff --git a/tests/acpi-test-data/q35/SRAT.dimmpxm b/tests/acpi-test-data/q= 35/SRAT.dimmpxm new file mode 100644 index 0000000000000000000000000000000000000000..b308d09b94cb8547f611bf8eb3a= 956359a71576c GIT binary patch literal 416 zcmWFzatv9($iTp8?d0$55v<@85#SsQ6axw|fY=3D}!gyBE{ozKXKD$m4(%xBbq>x446 z-~!my0WAQ74{&KX11Qd@0p~G66~br~cQR_gg;}8LU^JRKs4M{r$zGU#4wx2Z7z0Qn ZspEjU6t0dPMIGFI0#J1?VA9Cu0RYf$3jqKC literal 0 HcmV?d00001 diff --git a/tests/acpi-test-data/q35/SSDT.dimmpxm b/tests/acpi-test-data/q= 35/SSDT.dimmpxm new file mode 100644 index 0000000000000000000000000000000000000000..2d5b721bcf9c398feb6d005761f= 898015042e8a4 GIT binary patch literal 685 zcmZXSKZw(C6vtnha!u0~lD6O<%8~6xbDe}6G))>CXws6TMaV(^RC>L(!w>Hk5uvTa z=3D?OwFn~0>6QE?aCT%DZU4_w7Xa8Q3QhlA(x-Y@U_^4{nB+4FIjXeHF7{?dKi?# zbd~4x^lU38j7uPR%M#XE%he6ZTQ*Q&J6g9b+3let=3D>toZbj7~2_*w9l)l9X!ZAF4TR{A2%pu(_FR$MZ5GXAR$9KD)R1R8>#E7$4s? zKSaUiN>-QO6jiZuF0R)cNaYvfAi4G^9>ZBY2_PxPQ%FUY$pS;>NJb73jZBd(X*`Ud z&-i?NGNWsr%m5_N+y9WhLGi@}b}bZ{B~9Wfvna9C14i?d2f z*OHSUJPs*V!o?wVmjkaB@KVM|iS!gh{gzLcbA+l9fzfN3AxJX{@b5&7acT*ezxqZ< zws2T