From nobody Sun Sep 28 15:28:15 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1756304585; cv=none; d=zohomail.com; s=zohoarc; b=MvZh63cC3HOJ+4Eo0hifG/o0M282rdo0DbxkEhR/TfRmWibvyQRI8YGR2M61oOvkkuJTMf2n6R6UbekLwtFmuZli8aXzqzJa12UJ7rZeSreA1K0H/5H+7sA6zGSKxYIKco80cJmPXnove7rutX8dfY1hkDBaoInJBoZDq+4/zwg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756304585; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=U+h1yk01u8WszKDPhG3QU7Av/fiUJXYwVSOZST5YkDQ=; b=hTdhuerfbSNLgDCcjCoYNUJ1AWIhTxG0UY6dT8a0TUOXnsEcasKKt35LvUcHs87eFDEHWI2EiRpszREndAAsvPCAXwAUA7NyGlWME19BsfzxXHZVCAGsrISIgZHaRnX7YrUykpsPXWZNJKaj3DMuLgiC1Wue8PMDX1DQqmCjFQg= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756304585747273.2877891893979; Wed, 27 Aug 2025 07:23:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1urH2o-0001CL-N4; Wed, 27 Aug 2025 10:22:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH2m-0001Aq-Km; Wed, 27 Aug 2025 10:22:32 -0400 Received: from [185.176.79.56] (helo=frasgout.his.huawei.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH2k-0006P6-Ev; Wed, 27 Aug 2025 10:22:32 -0400 Received: from mail.maildlp.com (unknown [172.18.186.216]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4cBmqT6bwbz6J73j; Wed, 27 Aug 2025 22:19:01 +0800 (CST) Received: from frapeml500003.china.huawei.com (unknown [7.182.85.28]) by mail.maildlp.com (Postfix) with ESMTPS id 4B923140278; Wed, 27 Aug 2025 22:22:27 +0800 (CST) Received: from a2303103017.china.huawei.com (10.126.171.221) by frapeml500003.china.huawei.com (7.182.85.28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Wed, 27 Aug 2025 16:22:25 +0200 To: CC: , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v16 1/8] target/arm/tcg: increase cache level for cpu=max Date: Wed, 27 Aug 2025 15:21:45 +0100 Message-ID: <20250827142152.206-2-alireza.sanaee@huawei.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250827142152.206-1-alireza.sanaee@huawei.com> References: <20250827142152.206-1-alireza.sanaee@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.126.171.221] X-ClientProxiedBy: lhrpeml100006.china.huawei.com (7.191.160.224) To frapeml500003.china.huawei.com (7.182.85.28) X-Host-Lookup-Failed: Reverse DNS lookup failed for 185.176.79.56 (deferred) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=185.176.79.56; envelope-from=alireza.sanaee@huawei.com; helo=frasgout.his.huawei.com X-Spam_score_int: -33 X-Spam_score: -3.4 X-Spam_bar: --- X-Spam_report: (-3.4 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Alireza Sanaee From: Alireza Sanaee via Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1756304588395116600 Content-Type: text/plain; charset="utf-8" This patch addresses cache description in the `aarch64_max_tcg_initfn` function for cpu=3Dmax. It introduces three layers of caches and modifies the cache description registers accordingly. Reviewed-by: Jonathan Cameron Signed-off-by: Alireza Sanaee --- target/arm/tcg/cpu64.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/target/arm/tcg/cpu64.c b/target/arm/tcg/cpu64.c index 35cddbafa4..bf1372ecdf 100644 --- a/target/arm/tcg/cpu64.c +++ b/target/arm/tcg/cpu64.c @@ -1093,6 +1093,19 @@ void aarch64_max_tcg_initfn(Object *obj) uint64_t t; uint32_t u; =20 + /* + * Expanded cache set + */ + SET_IDREG(isar, CLIDR, 0x8200123); /* 4 4 3 in 3 bit fields */ + /* 64KB L1 dcache */ + cpu->ccsidr[0] =3D make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 64 * KiB, = 7); + /* 64KB L1 icache */ + cpu->ccsidr[1] =3D make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 64 * KiB, = 2); + /* 1MB L2 unified cache */ + cpu->ccsidr[2] =3D make_ccsidr(CCSIDR_FORMAT_LEGACY, 8, 64, 1 * MiB, 7= ); + /* 2MB L3 unified cache */ + cpu->ccsidr[4] =3D make_ccsidr(CCSIDR_FORMAT_LEGACY, 8, 64, 2 * MiB, 7= ); + /* * Unset ARM_FEATURE_BACKCOMPAT_CNTFRQ, which we would otherwise defau= lt * to because we started with aarch64_a57_initfn(). A 'max' CPU might --=20 2.43.0 From nobody Sun Sep 28 15:28:15 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1756304609; cv=none; d=zohomail.com; s=zohoarc; b=VCzpd3jZLf4zk+0G/FXC3TGh2cYE188s7WoxM69r7dcT/zOOnN2QWfkoeXo/j2U5T4LsHDBVfd0hlrAwxBy39C3LUw/qjghDkwZN67Oy65S9fdsPCMUfhGxpsP33q9R81v3qqpOrFrSIrQRVInE/7/jen9dYQ2iA6xTXzkoxndI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756304609; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=MufPVaoK/Yqf3RDLsIshhQHvskhMVysjAB9cfs9xv98=; b=XdjAYt1ITxKRnI5cQufxi0NJ9DLAn4vpd62V0HcoeychvPoUSgBbDHuHQEg/pQb1KHT3qrErShXYQPSg203qGMtx1CQw8lDC3x0dhZzySphiq9hCAdPkXxzylAU9zIanApfrQ2zhH0Q0ULPrSDqGaRhhoMMOm9qmhhD2B2Q10uY= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756304608940248.26629471166495; Wed, 27 Aug 2025 07:23:28 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1urH3M-0001ll-Jh; Wed, 27 Aug 2025 10:23:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH3L-0001hj-Ef; Wed, 27 Aug 2025 10:23:07 -0400 Received: from [185.176.79.56] (helo=frasgout.his.huawei.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH3J-0006Ti-IH; Wed, 27 Aug 2025 10:23:07 -0400 Received: from mail.maildlp.com (unknown [172.18.186.231]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4cBmr56fl3z6J6sV; Wed, 27 Aug 2025 22:19:33 +0800 (CST) Received: from frapeml500003.china.huawei.com (unknown [7.182.85.28]) by mail.maildlp.com (Postfix) with ESMTPS id 5435D140276; Wed, 27 Aug 2025 22:22:59 +0800 (CST) Received: from a2303103017.china.huawei.com (10.126.171.221) by frapeml500003.china.huawei.com (7.182.85.28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Wed, 27 Aug 2025 16:22:58 +0200 To: CC: , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v16 2/8] hw/core/machine: topology functions capabilities added Date: Wed, 27 Aug 2025 15:21:46 +0100 Message-ID: <20250827142152.206-3-alireza.sanaee@huawei.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250827142152.206-1-alireza.sanaee@huawei.com> References: <20250827142152.206-1-alireza.sanaee@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.126.171.221] X-ClientProxiedBy: lhrpeml100006.china.huawei.com (7.191.160.224) To frapeml500003.china.huawei.com (7.182.85.28) X-Host-Lookup-Failed: Reverse DNS lookup failed for 185.176.79.56 (deferred) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=185.176.79.56; envelope-from=alireza.sanaee@huawei.com; helo=frasgout.his.huawei.com X-Spam_score_int: -33 X-Spam_score: -3.4 X-Spam_bar: --- X-Spam_report: (-3.4 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Alireza Sanaee From: Alireza Sanaee via Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1756304612276124100 Content-Type: text/plain; charset="utf-8" Add two functions one of which finds the lowest level cache defined in the cache description input, and the other checks if caches are defined at a particular level. Signed-off-by: Alireza Sanaee --- hw/core/machine-smp.c | 56 +++++++++++++++++++++++++++++++++++++++++++ include/hw/boards.h | 5 ++++ 2 files changed, 61 insertions(+) diff --git a/hw/core/machine-smp.c b/hw/core/machine-smp.c index 0be0ac044c..32f3e7d6c9 100644 --- a/hw/core/machine-smp.c +++ b/hw/core/machine-smp.c @@ -406,3 +406,59 @@ bool machine_check_smp_cache(const MachineState *ms, E= rror **errp) =20 return true; } + +/* + * This function assumes l3 and l2 have unified cache and l1 is split l1d = and + * l1i. + */ +bool machine_find_lowest_level_cache_at_topo_level(const MachineState *ms, + int *level_found, + CpuTopologyLevel topo_l= evel) +{ + + CpuTopologyLevel level; + + level =3D machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1I); + if (level =3D=3D topo_level) { + *level_found =3D 1; + return true; + } + + level =3D machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1D); + if (level =3D=3D topo_level) { + *level_found =3D 1; + return true; + } + + level =3D machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L2); + if (level =3D=3D topo_level) { + *level_found =3D 2; + return true; + } + + level =3D machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L3); + if (level =3D=3D topo_level) { + *level_found =3D 3; + return true; + } + + return false; +} + +/* + * Check if there are caches defined at a particular level. It supports on= ly + * L1, L2 and L3 caches, but this can be extended to more levels as needed. + * + * Return True on success, False otherwise. + */ +bool machine_defines_cache_at_topo_level(const MachineState *ms, + CpuTopologyLevel level) +{ + if (machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L3) =3D=3D l= evel || + machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L2) =3D=3D l= evel || + machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1I) =3D=3D = level || + machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1D) =3D=3D = level) { + return true; + } + return false; +} diff --git a/include/hw/boards.h b/include/hw/boards.h index f94713e6e2..3c1a999791 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -55,6 +55,11 @@ void machine_set_cache_topo_level(MachineState *ms, Cach= eLevelAndType cache, CpuTopologyLevel level); bool machine_check_smp_cache(const MachineState *ms, Error **errp); void machine_memory_devices_init(MachineState *ms, hwaddr base, uint64_t s= ize); +bool machine_defines_cache_at_topo_level(const MachineState *ms, + CpuTopologyLevel level); +bool machine_find_lowest_level_cache_at_topo_level(const MachineState *ms, + int *level_found, + CpuTopologyLevel topo_l= evel); =20 /** * machine_class_allow_dynamic_sysbus_dev: Add type to list of valid devic= es --=20 2.43.0 From nobody Sun Sep 28 15:28:15 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1756304650; cv=none; d=zohomail.com; s=zohoarc; b=GdM2FdxQfpfFwn1DZWAdY+6Dm4/6MiDzo+acuvsW4O1IHesZ+d+lrIrOzfdO+ZUOco+Vgjc7j91ZsATqpPueooAm+o/NkUfLyHgSHSI/IaKWC912BkGpK1o7SjwsU2fQJsV/07a+Aljv8eqGzhvKC5kRb0jAnML1A6eQnfHrFlk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756304650; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=KdyrsYFxVWR9X1b2xBUlYwzikABfMKN3GfZ4drLVTIY=; b=KjmV4Y8FxziiQ7U4TPFuL7kG47P/N40zZKrx8XujLpvCfri/njlUcymfxhfWqsARMofrTKhhLOVbbUJBUCU4ctTeNjrplE9X6PNH8Hs9lLzDxnh+SkDejOIMvIxJweWMPwRjBVxNW0NXr4gjSD5f7keeXANXKqxMoamSXNUdC7o= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756304650365466.5005261661297; Wed, 27 Aug 2025 07:24:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1urH3v-0003FZ-Vc; Wed, 27 Aug 2025 10:23:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH3r-0002zh-4K; Wed, 27 Aug 2025 10:23:39 -0400 Received: from [185.176.79.56] (helo=frasgout.his.huawei.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH3o-0006XS-6C; Wed, 27 Aug 2025 10:23:38 -0400 Received: from mail.maildlp.com (unknown [172.18.186.216]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4cBmt20FgGz6K91n; Wed, 27 Aug 2025 22:21:14 +0800 (CST) Received: from frapeml500003.china.huawei.com (unknown [7.182.85.28]) by mail.maildlp.com (Postfix) with ESMTPS id 9406D140393; Wed, 27 Aug 2025 22:23:31 +0800 (CST) Received: from a2303103017.china.huawei.com (10.126.171.221) by frapeml500003.china.huawei.com (7.182.85.28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Wed, 27 Aug 2025 16:23:30 +0200 To: CC: , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v16 3/8] hw/arm/virt: add cache hierarchy to device tree Date: Wed, 27 Aug 2025 15:21:47 +0100 Message-ID: <20250827142152.206-4-alireza.sanaee@huawei.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250827142152.206-1-alireza.sanaee@huawei.com> References: <20250827142152.206-1-alireza.sanaee@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.126.171.221] X-ClientProxiedBy: lhrpeml100006.china.huawei.com (7.191.160.224) To frapeml500003.china.huawei.com (7.182.85.28) X-Host-Lookup-Failed: Reverse DNS lookup failed for 185.176.79.56 (deferred) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=185.176.79.56; envelope-from=alireza.sanaee@huawei.com; helo=frasgout.his.huawei.com X-Spam_score_int: -33 X-Spam_score: -3.4 X-Spam_bar: --- X-Spam_report: (-3.4 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Alireza Sanaee From: Alireza Sanaee via Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1756304652722124100 Content-Type: text/plain; charset="utf-8" Specify which layer (core/cluster/socket) caches found at in the CPU topology. Updating cache topology to device tree (spec v0.4). Example: For example, 2 sockets (packages), and 2 clusters, 4 cores and 2 threads created, in aggregate 2*2*4*2 logical cores. In the smp-cache object, cores will have l1d and l1i. However, extending this is not difficult. The clusters will share a unified l2 level cache, and finally sockets will share l3. In this patch, threads will share l1 caches by default, but this can be adjusted if case required. Only three levels of caches are supported. The patch does not allow partial declaration of caches. In other words, the topology level of every cache must be specified if that of any level is. ./qemu-system-aarch64 \ -machine virt,\ smp-cache.0.cache=3Dl1i,smp-cache.0.topology=3Dcore,\ smp-cache.1.cache=3Dl1d,smp-cache.1.topology=3Dcore,\ smp-cache.2.cache=3Dl2,smp-cache.2.topology=3Dcluster,\ smp-cache.3.cache=3Dl3,smp-cache.3.topology=3Dsocket\ -cpu max \ -m 2048 \ -smp sockets=3D2,clusters=3D2,cores=3D4,threads=3D1 \ -kernel ./Image.gz \ -append "console=3DttyAMA0 root=3D/dev/ram rdinit=3D/init acpi=3Dforce"= \ -initrd rootfs.cpio.gz \ -bios ./edk2-aarch64-code.fd \ -nographic For instance, following device tree will be generated for a scenario where we have 2 sockets, 2 clusters, 2 cores and 2 threads, in total 16 PEs. L1i and L1d are private to each thread, and l2 and l3 are shared at socket level as an example. Limitation: SMT cores cannot share L1 cache for now. This problem does not exist in PPTT tables. Co-developed-by: Jonathan Cameron Signed-off-by: Jonathan Cameron Signed-off-by: Alireza Sanaee --- hw/arm/virt.c | 412 +++++++++++++++++++++++++++++++++++++++++- include/hw/arm/virt.h | 7 +- include/hw/core/cpu.h | 12 ++ 3 files changed, 429 insertions(+), 2 deletions(-) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index ef6be3660f..9094d8bef8 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -88,6 +88,7 @@ #include "hw/virtio/virtio-md-pci.h" #include "hw/virtio/virtio-iommu.h" #include "hw/char/pl011.h" +#include "hw/core/cpu.h" #include "hw/cxl/cxl.h" #include "hw/cxl/cxl_host.h" #include "qemu/guest-random.h" @@ -273,6 +274,134 @@ static bool ns_el2_virt_timer_present(void) arm_feature(env, ARM_FEATURE_EL2) && cpu_isar_feature(aa64_vh, cpu= ); } =20 +unsigned int virt_get_caches(const VirtMachineState *vms, + CPUCoreCaches *caches) +{ + ARMCPU *armcpu =3D ARM_CPU(qemu_get_cpu(0)); /* assume homogeneous CPU= s */ + bool ccidx =3D cpu_isar_feature(any_ccidx, armcpu); + ARMISARegisters *isar =3D &armcpu->isar; + unsigned int num_cache, i; + int level_instr =3D 1, level_data =3D 1; + + for (i =3D 0, num_cache =3D 0; i < CPU_MAX_CACHES; i++, num_cache++) { + uint32_t clidr =3D GET_IDREG(isar, CLIDR); + int type =3D (clidr >> (3 * i)) & 7; + int bank_index; + int level; + enum CacheType cache_type; + + if (type =3D=3D 0) { + break; + } + + switch (type) { + case 1: + cache_type =3D INSTRUCTION_CACHE; + level =3D level_instr; + break; + case 2: + cache_type =3D DATA_CACHE; + level =3D level_data; + break; + case 4: + cache_type =3D UNIFIED_CACHE; + level =3D level_instr > level_data ? level_instr : level_data; + break; + case 3: /* Split - Do data first */ + cache_type =3D DATA_CACHE; + level =3D level_data; + break; + default: + error_setg(&error_abort, "Unrecognized cache type"); + return 0; + } + /* + * ccsidr is indexed using both the level and whether it is + * an instruction cache. Unified caches use the same storage + * as data caches. + */ + bank_index =3D (i * 2) | ((type =3D=3D 1) ? 1 : 0); + if (ccidx) { + caches[num_cache] =3D (CPUCoreCaches) { + .type =3D cache_type, + .level =3D level, + .linesize =3D 1 << (FIELD_EX64(armcpu->ccsidr[bank_index], + CCSIDR_EL1, + CCIDX_LINESIZE) + 4), + .associativity =3D FIELD_EX64(armcpu->ccsidr[bank_index], + CCSIDR_EL1, + CCIDX_ASSOCIATIVITY) + 1, + .sets =3D FIELD_EX64(armcpu->ccsidr[bank_index], CCSIDR_EL= 1, + CCIDX_NUMSETS) + 1, + }; + } else { + caches[num_cache] =3D (CPUCoreCaches) { + .type =3D cache_type, + .level =3D level, + .linesize =3D 1 << (FIELD_EX64(armcpu->ccsidr[bank_index], + CCSIDR_EL1, LINESIZE) + 4), + .associativity =3D FIELD_EX64(armcpu->ccsidr[bank_index], + CCSIDR_EL1, + ASSOCIATIVITY) + 1, + .sets =3D FIELD_EX64(armcpu->ccsidr[bank_index], CCSIDR_EL= 1, + NUMSETS) + 1, + }; + } + caches[num_cache].size =3D caches[num_cache].associativity * + caches[num_cache].sets * caches[num_cache].linesize; + + /* Break one 'split' entry up into two records */ + if (type =3D=3D 3) { + num_cache++; + bank_index =3D (i * 2) | 1; + if (ccidx) { + /* Instruction cache: bottom bit set when reading banked r= eg */ + caches[num_cache] =3D (CPUCoreCaches) { + .type =3D INSTRUCTION_CACHE, + .level =3D level_instr, + .linesize =3D 1 << (FIELD_EX64(armcpu->ccsidr[bank_ind= ex], + CCSIDR_EL1, + CCIDX_LINESIZE) + 4), + .associativity =3D FIELD_EX64(armcpu->ccsidr[bank_inde= x], + CCSIDR_EL1, + CCIDX_ASSOCIATIVITY) + 1, + .sets =3D FIELD_EX64(armcpu->ccsidr[bank_index], CCSID= R_EL1, + CCIDX_NUMSETS) + 1, + }; + } else { + caches[num_cache] =3D (CPUCoreCaches) { + .type =3D INSTRUCTION_CACHE, + .level =3D level_instr, + .linesize =3D 1 << (FIELD_EX64(armcpu->ccsidr[bank_ind= ex], + CCSIDR_EL1, LINESIZE) + 4= ), + .associativity =3D FIELD_EX64(armcpu->ccsidr[bank_inde= x], + CCSIDR_EL1, + ASSOCIATIVITY) + 1, + .sets =3D FIELD_EX64(armcpu->ccsidr[bank_index], CCSID= R_EL1, + NUMSETS) + 1, + }; + } + caches[num_cache].size =3D caches[num_cache].associativity * + caches[num_cache].sets * caches[num_cache].linesize; + } + switch (type) { + case 1: + level_instr++; + break; + case 2: + level_data++; + break; + case 3: + case 4: + level_instr++; + level_data++; + break; + } + } + + return num_cache; +} + static void create_fdt(VirtMachineState *vms) { MachineState *ms =3D MACHINE(vms); @@ -423,13 +552,150 @@ static void fdt_add_timer_nodes(const VirtMachineSta= te *vms) } } =20 +static void add_cache_node(void *fdt, char *nodepath, CPUCoreCaches cache, + uint32_t *next_level) +{ + /* Assume L2/3 are unified caches. */ + + uint32_t phandle; + + qemu_fdt_add_path(fdt, nodepath); + phandle =3D qemu_fdt_alloc_phandle(fdt); + qemu_fdt_setprop_cell(fdt, nodepath, "phandle", phandle); + qemu_fdt_setprop_cell(fdt, nodepath, "cache-level", cache.level); + qemu_fdt_setprop_cell(fdt, nodepath, "cache-size", cache.size); + qemu_fdt_setprop_cell(fdt, nodepath, "cache-block-size", cache.linesiz= e); + qemu_fdt_setprop_cell(fdt, nodepath, "cache-sets", cache.sets); + qemu_fdt_setprop(fdt, nodepath, "cache-unified", NULL, 0); + qemu_fdt_setprop_string(fdt, nodepath, "compatible", "cache"); + if (cache.level !=3D 3) { + /* top level cache doesn't have next-level-cache property */ + qemu_fdt_setprop_cell(fdt, nodepath, "next-level-cache", *next_lev= el); + } + + *next_level =3D phandle; +} + +static bool add_cpu_cache_hierarchy(void *fdt, CPUCoreCaches* cache, + uint32_t cache_cnt, + uint32_t top_level, + uint32_t bottom_level, + uint32_t cpu_id, + uint32_t *next_level) { + bool found_cache =3D false; + + for (int level =3D top_level; level >=3D bottom_level; level--) { + for (int i =3D 0; i < cache_cnt; i++) { + char *nodepath; + + if (i !=3D level) { + continue; + } + + nodepath =3D g_strdup_printf("/cpus/cpu@%d/l%d-cache", + cpu_id, level); + add_cache_node(fdt, nodepath, cache[i], next_level); + found_cache =3D true; + g_free(nodepath); + + } + } + + return found_cache; +} + +static void set_cache_properties(void *fdt, const char *nodename, + const char *prefix, CPUCoreCaches cache) +{ + char prop_name[64]; + + snprintf(prop_name, sizeof(prop_name), "%s-block-size", prefix); + qemu_fdt_setprop_cell(fdt, nodename, prop_name, cache.linesize); + + snprintf(prop_name, sizeof(prop_name), "%s-size", prefix); + qemu_fdt_setprop_cell(fdt, nodename, prop_name, cache.size); + + snprintf(prop_name, sizeof(prop_name), "%s-sets", prefix); + qemu_fdt_setprop_cell(fdt, nodename, prop_name, cache.sets); +} + +static int partial_cache_description(const MachineState *ms, + CPUCoreCaches *caches, int num_caches) +{ + int level, c; + + for (level =3D 1; level < num_caches; level++) { + for (c =3D 0; c < num_caches; c++) { + if (caches[c].level !=3D level) { + continue; + } + + switch (level) { + case 1: + /* + * L1 cache is assumed to have both L1I and L1D available. + * Technically both need to be checked. + */ + if (machine_get_cache_topo_level(ms, + CACHE_LEVEL_AND_TYPE_L1I)= =3D=3D + CPU_TOPOLOGY_LEVEL_DEFAULT) { + return level; + } + break; + case 2: + if (machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_= L2) =3D=3D + CPU_TOPOLOGY_LEVEL_DEFAULT) { + return level; + } + break; + case 3: + if (machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_= L3) =3D=3D + CPU_TOPOLOGY_LEVEL_DEFAULT) { + return level; + } + break; + } + } + } + + return 0; +} + static void fdt_add_cpu_nodes(const VirtMachineState *vms) { int cpu; int addr_cells =3D 1; const MachineState *ms =3D MACHINE(vms); + const MachineClass *mc =3D MACHINE_GET_CLASS(ms); const VirtMachineClass *vmc =3D VIRT_MACHINE_GET_CLASS(vms); int smp_cpus =3D ms->smp.cpus; + int socket_id, cluster_id, core_id; + uint32_t next_level =3D 0; + uint32_t socket_offset =3D 0; + uint32_t cluster_offset =3D 0; + uint32_t core_offset =3D 0; + int last_socket =3D -1; + int last_cluster =3D -1; + int last_core =3D -1; + int top_node =3D 3; + int top_cluster =3D 3; + int top_core =3D 3; + int bottom_node =3D 3; + int bottom_cluster =3D 3; + int bottom_core =3D 3; + unsigned int num_cache; + CPUCoreCaches caches[16]; + bool cache_created =3D false; + bool cache_available; + bool llevel; + + num_cache =3D virt_get_caches(vms, caches); + + if (mc->smp_props.has_caches && + partial_cache_description(ms, caches, num_cache)) { + error_setg(&error_fatal, "Missing cache description"); + return; + } =20 /* * See Linux Documentation/devicetree/bindings/arm/cpus.yaml @@ -458,9 +724,14 @@ static void fdt_add_cpu_nodes(const VirtMachineState *= vms) qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#size-cells", 0x0); =20 for (cpu =3D smp_cpus - 1; cpu >=3D 0; cpu--) { + socket_id =3D cpu / (ms->smp.clusters * ms->smp.cores * ms->smp.th= reads); + cluster_id =3D cpu / (ms->smp.cores * ms->smp.threads) % ms->smp.c= lusters; + core_id =3D cpu / ms->smp.threads % ms->smp.cores; + char *nodename =3D g_strdup_printf("/cpus/cpu@%d", cpu); ARMCPU *armcpu =3D ARM_CPU(qemu_get_cpu(cpu)); CPUState *cs =3D CPU(armcpu); + const char *prefix =3D NULL; =20 qemu_fdt_add_subnode(ms->fdt, nodename); qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "cpu"); @@ -490,6 +761,139 @@ static void fdt_add_cpu_nodes(const VirtMachineState = *vms) qemu_fdt_alloc_phandle(ms->fdt)); } =20 + if (!vmc->no_cpu_topology && num_cache) { + for (uint8_t i =3D 0; i < num_cache; i++) { + /* only level 1 in the CPU entry */ + if (caches[i].level > 1) { + continue; + } + + if (caches[i].type =3D=3D INSTRUCTION_CACHE) { + prefix =3D "i-cache"; + } else if (caches[i].type =3D=3D DATA_CACHE) { + prefix =3D "d-cache"; + } else if (caches[i].type =3D=3D UNIFIED_CACHE) { + error_setg(&error_fatal, + "Unified type is not implemented at level %= d", + caches[i].level); + return; + } else { + error_setg(&error_fatal, "Undefined cache type"); + return; + } + + set_cache_properties(ms->fdt, nodename, prefix, caches[i]); + } + } + + if (socket_id !=3D last_socket) { + bottom_node =3D top_node; + /* this assumes socket as the highest topological level */ + socket_offset =3D 0; + cluster_offset =3D 0; + cache_available =3D machine_defines_cache_at_topo_level(ms, + CPU_TOPOLOGY_LEVEL_SOCKET); + llevel =3D machine_find_lowest_level_cache_at_topo_level(ms, + &bottom_node, + CPU_TOPOLOGY_LEVEL_SOCKET); + if (cache_available && llevel) { + if (bottom_node =3D=3D 1 && !virt_is_acpi_enabled(vms)) + error_setg( + &error_fatal, + "Cannot share L1 at socket_id %d." + "DT limiation on sharing at cache level =3D 1", + socket_id); + + cache_created =3D add_cpu_cache_hierarchy(ms->fdt, caches, + num_cache, + top_node, + bottom_node, cpu, + &socket_offset); + + if (!cache_created) { + error_setg(&error_fatal, + "Socket: No caches at levels %d-%d", + top_node, bottom_node); + return; + } + + top_cluster =3D bottom_node - 1; + } + + last_socket =3D socket_id; + } + + if (cluster_id !=3D last_cluster) { + bottom_cluster =3D top_cluster; + cluster_offset =3D socket_offset; + core_offset =3D 0; + cache_available =3D machine_defines_cache_at_topo_level(ms, + CPU_TOPOLOGY_LEVEL_CLUSTER); + llevel =3D machine_find_lowest_level_cache_at_topo_level(ms, + &bottom_cluster, + CPU_TOPOLOGY_LEVEL_CLUSTER); + if (cache_available && llevel) { + cache_created =3D add_cpu_cache_hierarchy(ms->fdt, caches, + num_cache, + top_cluster, + bottom_cluster, cp= u, + &cluster_offset); + if (bottom_cluster =3D=3D 1 && !virt_is_acpi_enabled(vms))= { + error_setg(&error_fatal, + "Cannot share L1 at socket_id %d, cluster_id %d. " + "DT limitation on sharing at cache level =3D 1.", + socket_id, cluster_id); + } + + if (!cache_created) { + error_setg(&error_fatal, + "Cluster: No caches at levels %d-%d.", + top_cluster, bottom_cluster); + return; + } + + top_core =3D bottom_cluster - 1; + } else if (top_cluster =3D=3D bottom_node - 1) { + top_core =3D bottom_node - 1; + } + + last_cluster =3D cluster_id; + } + + if (core_id !=3D last_core) { + bottom_core =3D top_core; + core_offset =3D cluster_offset; + cache_available =3D machine_defines_cache_at_topo_level(ms, + CPU_TOPOLOGY_LEVEL_CORE); + llevel =3D machine_find_lowest_level_cache_at_topo_level(ms, + &bottom_core, + CPU_TOPOLOGY_LEVEL_CORE); + if (cache_available && llevel) { + if (bottom_core =3D=3D 1 && top_core > 1) { + bottom_core++; + cache_created =3D add_cpu_cache_hierarchy(ms->fdt, + caches, + num_cache, + top_core, + bottom_core, c= pu, + &core_offset); + + if (!cache_created) { + error_setg(&error_fatal, + "Core: No caches at levels %d-%d", + top_core, bottom_core); + return; + } + } + } + + last_core =3D core_id; + } + + next_level =3D core_offset; + qemu_fdt_setprop_cell(ms->fdt, nodename, "next-level-cache", + next_level); + g_free(nodename); } =20 @@ -2721,7 +3125,7 @@ static void virt_set_oem_table_id(Object *obj, const = char *value, } =20 =20 -bool virt_is_acpi_enabled(VirtMachineState *vms) +bool virt_is_acpi_enabled(const VirtMachineState *vms) { if (vms->acpi =3D=3D ON_OFF_AUTO_OFF) { return false; @@ -3247,6 +3651,12 @@ static void virt_machine_class_init(ObjectClass *oc,= const void *data) hc->unplug =3D virt_machine_device_unplug_cb; mc->nvdimm_supported =3D true; mc->smp_props.clusters_supported =3D true; + + /* Supported caches */ + mc->smp_props.cache_supported[CACHE_LEVEL_AND_TYPE_L1D] =3D true; + mc->smp_props.cache_supported[CACHE_LEVEL_AND_TYPE_L1I] =3D true; + mc->smp_props.cache_supported[CACHE_LEVEL_AND_TYPE_L2] =3D true; + mc->smp_props.cache_supported[CACHE_LEVEL_AND_TYPE_L3] =3D true; mc->auto_enable_numa_with_memhp =3D true; mc->auto_enable_numa_with_memdev =3D true; /* platform instead of architectural choice */ diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h index 365a28b082..0099ea7fa1 100644 --- a/include/hw/arm/virt.h +++ b/include/hw/arm/virt.h @@ -40,6 +40,7 @@ #include "system/kvm.h" #include "hw/intc/arm_gicv3_common.h" #include "qom/object.h" +#include "hw/core/cpu.h" =20 #define NUM_GICV2M_SPIS 64 #define NUM_VIRTIO_TRANSPORTS 32 @@ -51,6 +52,8 @@ /* GPIO pins */ #define GPIO_PIN_POWER_BUTTON 3 =20 +#define CPU_MAX_CACHES 16 + enum { VIRT_FLASH, VIRT_MEM, @@ -187,7 +190,9 @@ struct VirtMachineState { OBJECT_DECLARE_TYPE(VirtMachineState, VirtMachineClass, VIRT_MACHINE) =20 void virt_acpi_setup(VirtMachineState *vms); -bool virt_is_acpi_enabled(VirtMachineState *vms); +bool virt_is_acpi_enabled(const VirtMachineState *vms); +unsigned int virt_get_caches(const VirtMachineState *vms, + CPUCoreCaches *caches); =20 /* Return number of redistributors that fit in the specified region */ static uint32_t virt_redist_capacity(VirtMachineState *vms, int region) diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h index 5eaf41a566..045219a68b 100644 --- a/include/hw/core/cpu.h +++ b/include/hw/core/cpu.h @@ -1134,4 +1134,16 @@ enum CacheType { UNIFIED_CACHE }; =20 +struct CPUCoreCaches { + enum CacheType type; + uint32_t sets; + uint32_t size; + uint32_t level; + uint16_t linesize; + uint8_t attributes; /* write policy: 0x0 write back, 0x1 write through= */ + uint8_t associativity; +}; + +typedef struct CPUCoreCaches CPUCoreCaches; + #endif --=20 2.43.0 From nobody Sun Sep 28 15:28:15 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1756304665; cv=none; d=zohomail.com; s=zohoarc; b=c3TwSeif8IJATda3lJgsn0NYw33+pAxyHbAvmUyQVPb6bJMf38922YLXRGJjmVcKuhrrG6O5KNjAAlOYuV9cKz2LK7kTlKpkexk3+/ervXtDtJVmwzyJVKpjmy4wVIBN8DDdJtd/xpPl+PQD3Mw78jlO7Cyp55iyaR4uRny+Wvw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756304665; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=kKJIdsToLdqTWx60d1CzdnDVKWuN3Eb7R7XojAstinU=; b=d3kEqoLqNqNtG/sPLb5X9Yo2hjhd0n8gg7d0oX8dT0RZo8dsAcT/PCx48gCk8pYhgAT943mK1ah3eiuwtWiid3JnRbB9Gpk4jOOOPaogl8b4U7fqqo7BbTKh7SD4snWyuEQD8VVdZ+EQ3I8jbuVvEbXwA/7zZYhVskCKUeXHtpA= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756304665227909.8706739954033; Wed, 27 Aug 2025 07:24:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1urH4Q-00040r-MJ; Wed, 27 Aug 2025 10:24:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH4L-0003oE-7V; Wed, 27 Aug 2025 10:24:10 -0400 Received: from [185.176.79.56] (helo=frasgout.his.huawei.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH4I-0006b5-GB; Wed, 27 Aug 2025 10:24:08 -0400 Received: from mail.maildlp.com (unknown [172.18.186.216]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4cBmwf4Xgkz6JB1R; Wed, 27 Aug 2025 22:23:30 +0800 (CST) Received: from frapeml500003.china.huawei.com (unknown [7.182.85.28]) by mail.maildlp.com (Postfix) with ESMTPS id 979B2140278; Wed, 27 Aug 2025 22:24:03 +0800 (CST) Received: from a2303103017.china.huawei.com (10.126.171.221) by frapeml500003.china.huawei.com (7.182.85.28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Wed, 27 Aug 2025 16:24:02 +0200 To: CC: , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v16 4/8] bios-tables-test: prepare to change ARM ACPI virt PPTT Date: Wed, 27 Aug 2025 15:21:48 +0100 Message-ID: <20250827142152.206-5-alireza.sanaee@huawei.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250827142152.206-1-alireza.sanaee@huawei.com> References: <20250827142152.206-1-alireza.sanaee@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.126.171.221] X-ClientProxiedBy: lhrpeml100006.china.huawei.com (7.191.160.224) To frapeml500003.china.huawei.com (7.182.85.28) X-Host-Lookup-Failed: Reverse DNS lookup failed for 185.176.79.56 (deferred) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=185.176.79.56; envelope-from=alireza.sanaee@huawei.com; helo=frasgout.his.huawei.com X-Spam_score_int: -33 X-Spam_score: -3.4 X-Spam_bar: --- X-Spam_report: (-3.4 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Alireza Sanaee From: Alireza Sanaee via Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1756304666263116600 Content-Type: text/plain; charset="utf-8" Prepare to update `build_pptt` function to add cache description functionalities, thus add binaries in this patch. Reviewed-by: Zhao Liu Signed-off-by: Alireza Sanaee --- tests/qtest/bios-tables-test-allowed-diff.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios= -tables-test-allowed-diff.h index dfb8523c8b..e84d6c6955 100644 --- a/tests/qtest/bios-tables-test-allowed-diff.h +++ b/tests/qtest/bios-tables-test-allowed-diff.h @@ -1 +1,4 @@ /* List of comma-separated changed AML files to ignore */ +"tests/data/acpi/aarch64/virt/PPTT", +"tests/data/acpi/aarch64/virt/PPTT.acpihmatvirt", +"tests/data/acpi/aarch64/virt/PPTT.topology", --=20 2.43.0 From nobody Sun Sep 28 15:28:15 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1756304718; cv=none; d=zohomail.com; s=zohoarc; b=K/zQtUREs9CbeFMVP5108b61UrZUDzP2A+eBaaAfBSSCkWeF//mxscnbvvLmHvpJ2ukkHeIGCg0qgV6dkWG+yNb65YDoBMAL6IYz2pun2nEjT/1uhOwwmckKu6JOtOIYvwEvi7JaJaToJ51csH37Udk9BJHoMhlaAddVW25Mzmo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756304718; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=PCZhlBLj1PFO/U4cep4ABRGD180ZJjJeNyzTzjp98dY=; b=JVNg5dqVcLTpBSDdMiIJXteGcLvn39smlSu8/TbWJ18KBExpeLQg2t7deNNGDYkJ5y7q6ULvnJzhwFr9YUhShMyF2NGMr4IRTDWaFYjl8Anz/uQQbU0Ht8RufPxW5ffRLIDZsgUR9xpzSNDwKG8ifNcUn/+tGinuh4qH3NKoCdM= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756304718691427.05481999076676; Wed, 27 Aug 2025 07:25:18 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1urH4v-00050J-B6; Wed, 27 Aug 2025 10:24:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH4t-0004x6-UG; Wed, 27 Aug 2025 10:24:43 -0400 Received: from [185.176.79.56] (helo=frasgout.his.huawei.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH4r-0006ez-Mk; Wed, 27 Aug 2025 10:24:43 -0400 Received: from mail.maildlp.com (unknown [172.18.186.216]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4cBmsy2KrCz6J72r; Wed, 27 Aug 2025 22:21:10 +0800 (CST) Received: from frapeml500003.china.huawei.com (unknown [7.182.85.28]) by mail.maildlp.com (Postfix) with ESMTPS id A4377140278; Wed, 27 Aug 2025 22:24:35 +0800 (CST) Received: from a2303103017.china.huawei.com (10.126.171.221) by frapeml500003.china.huawei.com (7.182.85.28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Wed, 27 Aug 2025 16:24:34 +0200 To: CC: , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v16 5/8] acpi: add caches to ACPI build_pptt table function Date: Wed, 27 Aug 2025 15:21:49 +0100 Message-ID: <20250827142152.206-6-alireza.sanaee@huawei.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250827142152.206-1-alireza.sanaee@huawei.com> References: <20250827142152.206-1-alireza.sanaee@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.126.171.221] X-ClientProxiedBy: lhrpeml100006.china.huawei.com (7.191.160.224) To frapeml500003.china.huawei.com (7.182.85.28) X-Host-Lookup-Failed: Reverse DNS lookup failed for 185.176.79.56 (deferred) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=185.176.79.56; envelope-from=alireza.sanaee@huawei.com; helo=frasgout.his.huawei.com X-Spam_score_int: -33 X-Spam_score: -3.4 X-Spam_bar: --- X-Spam_report: (-3.4 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Alireza Sanaee From: Alireza Sanaee via Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1756304720905116601 Content-Type: text/plain; charset="utf-8" Add caches to build_pptt table function in ACPI for both ARM and Loongarch. Signed-off-by: Alireza Sanaee --- hw/acpi/aml-build.c | 3 ++- hw/arm/virt-acpi-build.c | 2 +- hw/loongarch/virt-acpi-build.c | 4 ++-- include/hw/acpi/aml-build.h | 4 +++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c index 1e685f982f..e854f14565 100644 --- a/hw/acpi/aml-build.c +++ b/hw/acpi/aml-build.c @@ -2145,7 +2145,8 @@ void build_spcr(GArray *table_data, BIOSLinker *linke= r, * 5.2.29 Processor Properties Topology Table (PPTT) */ void build_pptt(GArray *table_data, BIOSLinker *linker, MachineState *ms, - const char *oem_id, const char *oem_table_id) + const char *oem_id, const char *oem_table_id, + int num_caches, CPUCoreCaches *caches) { MachineClass *mc =3D MACHINE_GET_CLASS(ms); CPUArchIdList *cpus =3D ms->possible_cpus; diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index b01fc4f8ef..a6115f2f80 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -1044,7 +1044,7 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuild= Tables *tables) if (!vmc->no_cpu_topology) { acpi_add_table(table_offsets, tables_blob); build_pptt(tables_blob, tables->linker, ms, - vms->oem_id, vms->oem_table_id); + vms->oem_id, vms->oem_table_id, 0, NULL); } =20 acpi_add_table(table_offsets, tables_blob); diff --git a/hw/loongarch/virt-acpi-build.c b/hw/loongarch/virt-acpi-build.c index 8c2228a772..e7bbc40e27 100644 --- a/hw/loongarch/virt-acpi-build.c +++ b/hw/loongarch/virt-acpi-build.c @@ -551,8 +551,8 @@ static void acpi_build(AcpiBuildTables *tables, Machine= State *machine) build_madt(tables_blob, tables->linker, lvms); =20 acpi_add_table(table_offsets, tables_blob); - build_pptt(tables_blob, tables->linker, machine, - lvms->oem_id, lvms->oem_table_id); + build_pptt(tables_blob, tables->linker, machine, lvms->oem_id, + lvms->oem_table_id, 0, NULL); =20 acpi_add_table(table_offsets, tables_blob); build_srat(tables_blob, tables->linker, machine); diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h index c18f681342..01e11c093e 100644 --- a/include/hw/acpi/aml-build.h +++ b/include/hw/acpi/aml-build.h @@ -3,6 +3,7 @@ =20 #include "hw/acpi/acpi-defs.h" #include "hw/acpi/bios-linker-loader.h" +#include "hw/core/cpu.h" =20 #define ACPI_BUILD_APPNAME6 "BOCHS " #define ACPI_BUILD_APPNAME8 "BXPC " @@ -497,7 +498,8 @@ void build_slit(GArray *table_data, BIOSLinker *linker,= MachineState *ms, const char *oem_id, const char *oem_table_id); =20 void build_pptt(GArray *table_data, BIOSLinker *linker, MachineState *ms, - const char *oem_id, const char *oem_table_id); + const char *oem_id, const char *oem_table_id, + int num_caches, CPUCoreCaches *caches); =20 void build_fadt(GArray *tbl, BIOSLinker *linker, const AcpiFadtData *f, const char *oem_id, const char *oem_table_id); --=20 2.43.0 From nobody Sun Sep 28 15:28:15 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1756304727; cv=none; d=zohomail.com; s=zohoarc; b=CutUHpteTMe/fyMao6BtRc2QAhdU0jA5QvZA//BgIMYJbgSFJjacXFINXBcY8PZiY0uLj1oXTjJ2Kd267xUcpEzKjJJFBSKF+GCj2TkrwkQw9SLhgiNw4HovKZ9H1N1ngqm3rKs2iFFvhbwePAhMaUspBLOSAfZKmGt5z8PHuqo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756304727; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=gjSsAOqLo6ENJM9go9+Vb0NmwOpunRfwaztP6F48Bfg=; b=YgVhVotQ/wA8joWuv7TUu72IfUO42si5cme4k9ddrYtw5SXJR+Hslc2PQso/wl0k0En5NTExQhCZrxSOTcpXFFwR/RPW+n9IPZmlyYXvJ7lDKJcLCIEFIYsgSS4ms477dIQC9ldtaJnDlpNWugdXv9W2B7VrHC/K1At7JSmfo7w= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756304727266967.9672159824794; Wed, 27 Aug 2025 07:25:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1urH5U-0005x5-0V; Wed, 27 Aug 2025 10:25:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH5O-0005iW-8r; Wed, 27 Aug 2025 10:25:15 -0400 Received: from [185.176.79.56] (helo=frasgout.his.huawei.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH5L-00074U-CL; Wed, 27 Aug 2025 10:25:13 -0400 Received: from mail.maildlp.com (unknown [172.18.186.231]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4cBmvs6wj9z6K92V; Wed, 27 Aug 2025 22:22:49 +0800 (CST) Received: from frapeml500003.china.huawei.com (unknown [7.182.85.28]) by mail.maildlp.com (Postfix) with ESMTPS id 86F44140276; Wed, 27 Aug 2025 22:25:07 +0800 (CST) Received: from a2303103017.china.huawei.com (10.126.171.221) by frapeml500003.china.huawei.com (7.182.85.28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Wed, 27 Aug 2025 16:25:06 +0200 To: CC: , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v16 6/8] hw/acpi: add cache hierarchy to pptt table Date: Wed, 27 Aug 2025 15:21:50 +0100 Message-ID: <20250827142152.206-7-alireza.sanaee@huawei.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250827142152.206-1-alireza.sanaee@huawei.com> References: <20250827142152.206-1-alireza.sanaee@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.126.171.221] X-ClientProxiedBy: lhrpeml100006.china.huawei.com (7.191.160.224) To frapeml500003.china.huawei.com (7.182.85.28) X-Host-Lookup-Failed: Reverse DNS lookup failed for 185.176.79.56 (deferred) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=185.176.79.56; envelope-from=alireza.sanaee@huawei.com; helo=frasgout.his.huawei.com X-Spam_score_int: -33 X-Spam_score: -3.4 X-Spam_bar: --- X-Spam_report: (-3.4 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Alireza Sanaee From: Alireza Sanaee via Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1756304729124124100 Content-Type: text/plain; charset="utf-8" Add cache topology to PPTT table. With this patch, both ACPI PPTT table and device tree will represent the same cache topology given users input. Signed-off-by: Alireza Sanaee --- hw/acpi/aml-build.c | 200 +++++++++++++++++++++++++++++++++++++-- hw/arm/virt-acpi-build.c | 8 +- include/hw/acpi/cpu.h | 10 ++ 3 files changed, 209 insertions(+), 9 deletions(-) diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c index e854f14565..72b6bfdbe9 100644 --- a/hw/acpi/aml-build.c +++ b/hw/acpi/aml-build.c @@ -31,6 +31,7 @@ #include "hw/pci/pci_bus.h" #include "hw/pci/pci_bridge.h" #include "qemu/cutils.h" +#include "hw/core/cpu.h" =20 static GArray *build_alloc_array(void) { @@ -2140,6 +2141,104 @@ void build_spcr(GArray *table_data, BIOSLinker *lin= ker, } acpi_table_end(linker, &table); } + +static void build_cache_nodes(GArray *tbl, CPUCoreCaches *cache, + uint32_t next_offset) +{ + int val; + + /* Type 1 - cache */ + build_append_byte(tbl, 1); + /* Length */ + build_append_byte(tbl, 24); + /* Reserved */ + build_append_int_noprefix(tbl, 0, 2); + /* Flags */ + build_append_int_noprefix(tbl, 0x7f, 4); + /* Offset of next cache up */ + build_append_int_noprefix(tbl, next_offset, 4); + build_append_int_noprefix(tbl, cache->size, 4); + build_append_int_noprefix(tbl, cache->sets, 4); + build_append_byte(tbl, cache->associativity); + val =3D 0x3; + switch (cache->type) { + case INSTRUCTION_CACHE: + val |=3D (1 << 2); + break; + case DATA_CACHE: + val |=3D (0 << 2); /* Data */ + break; + case UNIFIED_CACHE: + val |=3D (3 << 2); /* Unified */ + break; + } + build_append_byte(tbl, val); + build_append_int_noprefix(tbl, cache->linesize, 2); +} + +/* + * builds caches from the top level (`level_high` parameter) to the bottom + * level (`level_low` parameter). It searches for caches found in + * systems' registers, and fills up the table. Then it updates the + * `data_offset` and `instr_offset` parameters with the offset of the data + * and instruction caches of the lowest level, respectively. + */ +static bool build_caches(GArray *table_data, uint32_t pptt_start, + int num_caches, CPUCoreCaches *caches, + uint8_t level_high, /* Inclusive */ + uint8_t level_low, /* Inclusive */ + uint32_t *data_offset, + uint32_t *instr_offset) +{ + uint32_t next_level_offset_data =3D 0, next_level_offset_instruction = =3D 0; + uint32_t this_offset, next_offset =3D 0; + int c, level; + bool found_cache =3D false; + + /* Walk caches from top to bottom */ + for (level =3D level_high; level >=3D level_low; level--) { + for (c =3D 0; c < num_caches; c++) { + if (caches[c].level !=3D level) { + continue; + } + + /* Assume only unified above l1 for now */ + this_offset =3D table_data->len - pptt_start; + switch (caches[c].type) { + case INSTRUCTION_CACHE: + next_offset =3D next_level_offset_instruction; + break; + case DATA_CACHE: + next_offset =3D next_level_offset_data; + break; + case UNIFIED_CACHE: + /* Either is fine here */ + next_offset =3D next_level_offset_instruction; + break; + } + build_cache_nodes(table_data, &caches[c], next_offset); + switch (caches[c].type) { + case INSTRUCTION_CACHE: + next_level_offset_instruction =3D this_offset; + break; + case DATA_CACHE: + next_level_offset_data =3D this_offset; + break; + case UNIFIED_CACHE: + next_level_offset_instruction =3D this_offset; + next_level_offset_data =3D this_offset; + break; + } + *data_offset =3D next_level_offset_data; + *instr_offset =3D next_level_offset_instruction; + + found_cache =3D true; + } + } + + return found_cache; +} + /* * ACPI spec, Revision 6.3 * 5.2.29 Processor Properties Topology Table (PPTT) @@ -2150,11 +2249,32 @@ void build_pptt(GArray *table_data, BIOSLinker *lin= ker, MachineState *ms, { MachineClass *mc =3D MACHINE_GET_CLASS(ms); CPUArchIdList *cpus =3D ms->possible_cpus; - int64_t socket_id =3D -1, cluster_id =3D -1, core_id =3D -1; - uint32_t socket_offset =3D 0, cluster_offset =3D 0, core_offset =3D 0; + uint32_t core_data_offset =3D 0; + uint32_t core_instr_offset =3D 0; + uint32_t cluster_instr_offset =3D 0; + uint32_t cluster_data_offset =3D 0; + uint32_t node_data_offset =3D 0; + uint32_t node_instr_offset =3D 0; + int top_node =3D 3; + int top_cluster =3D 3; + int top_core =3D 3; + int bottom_node =3D 3; + int bottom_cluster =3D 3; + int bottom_core =3D 3; + int64_t socket_id =3D -1; + int64_t cluster_id =3D -1; + int64_t core_id =3D -1; + uint32_t socket_offset =3D 0; + uint32_t cluster_offset =3D 0; + uint32_t core_offset =3D 0; uint32_t pptt_start =3D table_data->len; uint32_t root_offset; int n; + uint32_t priv_rsrc[2]; + uint32_t num_priv =3D 0; + bool cache_available; + bool llevel; + AcpiTable table =3D { .sig =3D "PPTT", .rev =3D 2, .oem_id =3D oem_id, .oem_table_id =3D oem_table_id= }; =20 @@ -2184,11 +2304,30 @@ void build_pptt(GArray *table_data, BIOSLinker *lin= ker, MachineState *ms, socket_id =3D cpus->cpus[n].props.socket_id; cluster_id =3D -1; core_id =3D -1; + bottom_node =3D top_node; + num_priv =3D 0; + cache_available =3D machine_defines_cache_at_topo_level( + ms, CPU_TOPOLOGY_LEVEL_SOCKET); + llevel =3D machine_find_lowest_level_cache_at_topo_level( + ms, &bottom_node, CPU_TOPOLOGY_LEVEL_SOCKET); + if (cache_available && llevel) { + build_caches(table_data, pptt_start, num_caches, caches, + top_node, bottom_node, &node_data_offset, + &node_instr_offset); + priv_rsrc[0] =3D node_instr_offset; + priv_rsrc[1] =3D node_data_offset; + if (node_instr_offset || node_data_offset) { + num_priv =3D node_instr_offset =3D=3D node_data_offset= ? 1 : 2; + } + + top_cluster =3D bottom_node - 1; + } + socket_offset =3D table_data->len - pptt_start; build_processor_hierarchy_node(table_data, (1 << 0) | /* Physical package */ (1 << 4), /* Identical Implementation */ - root_offset, socket_id, NULL, 0); + root_offset, socket_id, priv_rsrc, num_priv); } =20 if (mc->smp_props.clusters_supported && mc->smp_props.has_clusters= ) { @@ -2196,21 +2335,68 @@ void build_pptt(GArray *table_data, BIOSLinker *lin= ker, MachineState *ms, assert(cpus->cpus[n].props.cluster_id > cluster_id); cluster_id =3D cpus->cpus[n].props.cluster_id; core_id =3D -1; + bottom_cluster =3D top_cluster; + num_priv =3D 0; + cache_available =3D machine_defines_cache_at_topo_level( + ms, CPU_TOPOLOGY_LEVEL_CLUSTER); + llevel =3D machine_find_lowest_level_cache_at_topo_level( + ms, &bottom_cluster, CPU_TOPOLOGY_LEVEL_CLUSTER); + + if (cache_available && llevel) { + build_caches(table_data, pptt_start, num_caches, cache= s, + top_cluster, bottom_cluster, + &cluster_data_offset, &cluster_instr_offs= et); + priv_rsrc[0] =3D cluster_instr_offset; + priv_rsrc[1] =3D cluster_data_offset; + if (cluster_instr_offset || cluster_data_offset) { + num_priv =3D + cluster_instr_offset =3D=3D cluster_data_offse= t ? 1 : 2; + } + top_core =3D bottom_cluster - 1; + } else if (top_cluster =3D=3D bottom_node - 1) { + /* socket cache but no cluster cache */ + top_core =3D bottom_node - 1; + } + cluster_offset =3D table_data->len - pptt_start; build_processor_hierarchy_node(table_data, (0 << 0) | /* Not a physical package */ (1 << 4), /* Identical Implementation */ - socket_offset, cluster_id, NULL, 0); + socket_offset, cluster_id, priv_rsrc, num_priv); } } else { + if (machine_defines_cache_at_topo_level( + ms, CPU_TOPOLOGY_LEVEL_CLUSTER)) { + error_setg(&error_fatal, "Not clusters found for the cache= "); + return; + } + cluster_offset =3D socket_offset; + top_core =3D bottom_node - 1; /* there is no cluster */ + } + + if (cpus->cpus[n].props.core_id !=3D core_id) { + bottom_core =3D top_core; + num_priv =3D 0; + cache_available =3D machine_defines_cache_at_topo_level( + ms, CPU_TOPOLOGY_LEVEL_CORE); + llevel =3D machine_find_lowest_level_cache_at_topo_level( + ms, &bottom_core, CPU_TOPOLOGY_LEVEL_CORE); + if (cache_available && llevel) { + build_caches(table_data, pptt_start, num_caches, caches, + top_core, bottom_core, &core_data_offset, + &core_instr_offset); + priv_rsrc[0] =3D core_instr_offset; + priv_rsrc[1] =3D core_data_offset; + num_priv =3D core_instr_offset =3D=3D core_data_offset ? 1= : 2; + } } =20 if (ms->smp.threads =3D=3D 1) { build_processor_hierarchy_node(table_data, (1 << 1) | /* ACPI Processor ID valid */ - (1 << 3), /* Node is a Leaf */ - cluster_offset, n, NULL, 0); + (1 << 3), /* Node is a Leaf */ + cluster_offset, n, priv_rsrc, num_priv); } else { if (cpus->cpus[n].props.core_id !=3D core_id) { assert(cpus->cpus[n].props.core_id > core_id); @@ -2219,7 +2405,7 @@ void build_pptt(GArray *table_data, BIOSLinker *linke= r, MachineState *ms, build_processor_hierarchy_node(table_data, (0 << 0) | /* Not a physical package */ (1 << 4), /* Identical Implementation */ - cluster_offset, core_id, NULL, 0); + cluster_offset, core_id, priv_rsrc, num_priv); } =20 build_processor_hierarchy_node(table_data, diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index a6115f2f80..5fca69fcb2 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -1022,6 +1022,10 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuil= dTables *tables) unsigned dsdt, xsdt; GArray *tables_blob =3D tables->table_data; MachineState *ms =3D MACHINE(vms); + CPUCoreCaches caches[CPU_MAX_CACHES]; + unsigned int num_caches; + + num_caches =3D virt_get_caches(vms, caches); =20 table_offsets =3D g_array_new(false, true /* clear */, sizeof(uint32_t)); @@ -1043,8 +1047,8 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuild= Tables *tables) =20 if (!vmc->no_cpu_topology) { acpi_add_table(table_offsets, tables_blob); - build_pptt(tables_blob, tables->linker, ms, - vms->oem_id, vms->oem_table_id, 0, NULL); + build_pptt(tables_blob, tables->linker, ms, vms->oem_id, + vms->oem_table_id, num_caches, caches); } =20 acpi_add_table(table_offsets, tables_blob); diff --git a/include/hw/acpi/cpu.h b/include/hw/acpi/cpu.h index 32654dc274..a4027a2a76 100644 --- a/include/hw/acpi/cpu.h +++ b/include/hw/acpi/cpu.h @@ -70,6 +70,16 @@ void build_cpus_aml(Aml *table, MachineState *machine, C= PUHotplugFeatures opts, =20 void acpi_cpu_ospm_status(CPUHotplugState *cpu_st, ACPIOSTInfoList ***list= ); =20 +struct CPUPPTTCaches { + enum CacheType type; + uint32_t sets; + uint32_t size; + uint32_t level; + uint16_t linesize; + uint8_t attributes; /* write policy: 0x0 write back, 0x1 write through= */ + uint8_t associativity; +}; + extern const VMStateDescription vmstate_cpu_hotplug; #define VMSTATE_CPU_HOTPLUG(cpuhp, state) \ VMSTATE_STRUCT(cpuhp, state, 1, \ --=20 2.43.0 From nobody Sun Sep 28 15:28:15 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1756304768; cv=none; d=zohomail.com; s=zohoarc; b=D4mQd5xp0IYovSxUQ4UsoxRlMM6hMQOL8zCsV0DaRLIzSRRdHAjpd0yGMItvkI5jZAE/i49lLAk/eF2LLLmJezm3wN0uAG4PNJXRTyuNti7f1UPYuRX/Mu21bKdmVg8niLbYPziYY1mhkte/b76wQV6TUTHYSTnROtO9y0QJPPY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756304768; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=3lqe6yyMoHkyuw3SP3zfRtRmLgLmVJ3v0RLeQu7R+Fs=; b=IorFhreI1AL6W8tRBhmMVWRmKvHodcdn0L1gYNEIUKqwmK7efKOyr3KxwmsqzJWc25B0QLK18fqq1ZQpor/EILducK2khG+1oTIzvRijS+hVsU0ZQ7JCCgwOhUCqJJhll8WblfCNFh8sNxqKz2xm+e0mz0fkDoc28jzPvo2HiZ0= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756304768217147.59600658854993; Wed, 27 Aug 2025 07:26:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1urH5z-00072c-7Y; Wed, 27 Aug 2025 10:25:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH5r-0006tz-Rn; Wed, 27 Aug 2025 10:25:45 -0400 Received: from [185.176.79.56] (helo=frasgout.his.huawei.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH5p-0007Aq-Ol; Wed, 27 Aug 2025 10:25:43 -0400 Received: from mail.maildlp.com (unknown [172.18.186.31]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4cBmwT64qBz6K92n; Wed, 27 Aug 2025 22:23:21 +0800 (CST) Received: from frapeml500003.china.huawei.com (unknown [7.182.85.28]) by mail.maildlp.com (Postfix) with ESMTPS id 91EE51402DA; Wed, 27 Aug 2025 22:25:39 +0800 (CST) Received: from a2303103017.china.huawei.com (10.126.171.221) by frapeml500003.china.huawei.com (7.182.85.28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Wed, 27 Aug 2025 16:25:38 +0200 To: CC: , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v16 7/8] tests/qtest/bios-table-test: testing new ARM ACPI PPTT topology Date: Wed, 27 Aug 2025 15:21:51 +0100 Message-ID: <20250827142152.206-8-alireza.sanaee@huawei.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250827142152.206-1-alireza.sanaee@huawei.com> References: <20250827142152.206-1-alireza.sanaee@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.126.171.221] X-ClientProxiedBy: lhrpeml100006.china.huawei.com (7.191.160.224) To frapeml500003.china.huawei.com (7.182.85.28) X-Host-Lookup-Failed: Reverse DNS lookup failed for 185.176.79.56 (deferred) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=185.176.79.56; envelope-from=alireza.sanaee@huawei.com; helo=frasgout.his.huawei.com X-Spam_score_int: -33 X-Spam_score: -3.4 X-Spam_bar: --- X-Spam_report: (-3.4 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Alireza Sanaee From: Alireza Sanaee via Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1756304769372124100 Content-Type: text/plain; charset="utf-8" Test new PPTT topolopy with cache representation. Reviewed-by: Jonathan Cameron Reviewed-by: Zhao Liu Signed-off-by: Alireza Sanaee --- tests/qtest/bios-tables-test.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c index e7e6926c81..f3f870d34c 100644 --- a/tests/qtest/bios-tables-test.c +++ b/tests/qtest/bios-tables-test.c @@ -2228,6 +2228,10 @@ static void test_acpi_aarch64_virt_tcg_topology(void) }; =20 test_acpi_one("-cpu cortex-a57 " + "-M virt,smp-cache.0.cache=3Dl1i,smp-cache.0.topology=3D= cluster," + "smp-cache.1.cache=3Dl1d,smp-cache.1.topology=3Dcluster," + "smp-cache.2.cache=3Dl2,smp-cache.2.topology=3Dcluster," + "smp-cache.3.cache=3Dl3,smp-cache.3.topology=3Dcluster " "-smp sockets=3D1,clusters=3D2,cores=3D2,threads=3D2", &= data); free_test_data(&data); } --=20 2.43.0 From nobody Sun Sep 28 15:28:15 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1756304799; cv=none; d=zohomail.com; s=zohoarc; b=Fby2JXrhFqYA8WCQv+YQD13WP7VszheriaU4Gc2Ub4IRwm9yXC3oVW6EOfocGPUpBpTB6zxpQfV9nzgbWCMEmn6gSs0T8HrvVm161CNJtUHfPnVr2l81tUwkdIIHE26Jnc5GKqRRw4Fuz4ClBbWBLCFNJxQRnX9aANNvh2EHa9s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756304799; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=3UWjky08ZNl5iwnd8XAMGyAJ5kHTKXYTFYbrtmFypak=; b=Uqz4sdTf3U71goLmiIuegyeYwQlSdNPZnV8yiIWUUwIiJVobPM30pgUXz7cQLxvyDHs1fY172jrqbsxMaWvL+B4KpyrcUmD6Lry0BmdxBDQAlQm90NLjxGTjMK1U3pt4J9YsC3T7blUU7pxn0wJoavp7ytXMrvPfumA5c70f68M= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756304799869108.50718901246853; Wed, 27 Aug 2025 07:26:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1urH6a-0008TG-7N; Wed, 27 Aug 2025 10:26:30 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH6U-0008Ok-7Y; Wed, 27 Aug 2025 10:26:22 -0400 Received: from [185.176.79.56] (helo=frasgout.his.huawei.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1urH6P-0007E9-Hj; Wed, 27 Aug 2025 10:26:21 -0400 Received: from mail.maildlp.com (unknown [172.18.186.216]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4cBmvp2JdXz6J764; Wed, 27 Aug 2025 22:22:46 +0800 (CST) Received: from frapeml500003.china.huawei.com (unknown [7.182.85.28]) by mail.maildlp.com (Postfix) with ESMTPS id A04B9140278; Wed, 27 Aug 2025 22:26:11 +0800 (CST) Received: from a2303103017.china.huawei.com (10.126.171.221) by frapeml500003.china.huawei.com (7.182.85.28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Wed, 27 Aug 2025 16:26:10 +0200 To: CC: , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v16 8/8] Update the ACPI tables based on new aml-build.c Date: Wed, 27 Aug 2025 15:21:52 +0100 Message-ID: <20250827142152.206-9-alireza.sanaee@huawei.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250827142152.206-1-alireza.sanaee@huawei.com> References: <20250827142152.206-1-alireza.sanaee@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.126.171.221] X-ClientProxiedBy: lhrpeml100006.china.huawei.com (7.191.160.224) To frapeml500003.china.huawei.com (7.182.85.28) X-Host-Lookup-Failed: Reverse DNS lookup failed for 185.176.79.56 (deferred) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=185.176.79.56; envelope-from=alireza.sanaee@huawei.com; helo=frasgout.his.huawei.com X-Spam_score_int: -33 X-Spam_score: -3.4 X-Spam_bar: --- X-Spam_report: (-3.4 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Alireza Sanaee From: Alireza Sanaee via Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1756304801921124100 Content-Type: text/plain; charset="utf-8" The disassembled differences between actual and expected PPTT based on the following cache topology representation: - l1d and l1i shared at cluster level - l2 shared at cluster level - l3 shared at cluster level /* * Intel ACPI Component Architecture * AML/ASL+ Disassembler version 20230628 (64-bit version) * Copyright (c) 2000 - 2023 Intel Corporation * - * Disassembly of tests/data/acpi/aarch64/virt/PPTT.topology, Fri Aug 8 1= 6:50:38 2025 + * Disassembly of /tmp/aml-JGBZA3, Fri Aug 8 16:50:38 2025 * * ACPI Data Table [PPTT] * * Format: [HexOffset DecimalOffset ByteLength] FieldName : FieldValue (i= n hex) */ [000h 0000 004h] Signature : "PPTT" [Processor Proper= ties Topology Table] -[004h 0004 004h] Table Length : 00000164 +[004h 0004 004h] Table Length : 00000204 [008h 0008 001h] Revision : 02 -[009h 0009 001h] Checksum : 97 +[009h 0009 001h] Checksum : B8 [00Ah 0010 006h] Oem ID : "BOCHS " [010h 0016 008h] Oem Table ID : "BXPC " [018h 0024 004h] Oem Revision : 00000001 [01Ch 0028 004h] Asl Compiler ID : "BXPC" [020h 0032 004h] Asl Compiler Revision : 00000001 [024h 0036 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] [025h 0037 001h] Length : 14 [026h 0038 002h] Reserved : 0000 [028h 0040 004h] Flags (decoded below) : 00000011 Physical package : 1 ACPI Processor ID valid : 0 Processor is a thread : 0 Node is a leaf : 0 Identical Implementation : 1 @@ -34,223 +34,369 @@ [030h 0048 004h] ACPI Processor ID : 00000000 [034h 0052 004h] Private Resource Number : 00000000 [038h 0056 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] [039h 0057 001h] Length : 14 [03Ah 0058 002h] Reserved : 0000 [03Ch 0060 004h] Flags (decoded below) : 00000011 Physical package : 1 ACPI Processor ID valid : 0 Processor is a thread : 0 Node is a leaf : 0 Identical Implementation : 1 [040h 0064 004h] Parent : 00000024 [044h 0068 004h] ACPI Processor ID : 00000000 [048h 0072 004h] Private Resource Number : 00000000 -[04Ch 0076 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] -[04Dh 0077 001h] Length : 14 +[04Ch 0076 001h] Subtable Type : 01 [Cache Type] +[04Dh 0077 001h] Length : 18 [04Eh 0078 002h] Reserved : 0000 -[050h 0080 004h] Flags (decoded below) : 00000010 +[050h 0080 004h] Flags (decoded below) : 0000007F + Size valid : 1 + Number of Sets valid : 1 + Associativity valid : 1 + Allocation Type valid : 1 + Cache Type valid : 1 + Write Policy valid : 1 + Line Size valid : 1 + Cache ID valid : 0 +[054h 0084 004h] Next Level of Cache : 00000000 +[058h 0088 004h] Size : 00200000 +[05Ch 0092 004h] Number of Sets : 00000800 +[060h 0096 001h] Associativity : 10 +[061h 0097 001h] Attributes : 0F + Allocation Type : 3 + Cache Type : 3 + Write Policy : 0 +[062h 0098 002h] Line Size : 0040 + +[064h 0100 001h] Subtable Type : 01 [Cache Type] +[065h 0101 001h] Length : 18 +[066h 0102 002h] Reserved : 0000 +[068h 0104 004h] Flags (decoded below) : 0000007F + Size valid : 1 + Number of Sets valid : 1 + Associativity valid : 1 + Allocation Type valid : 1 + Cache Type valid : 1 + Write Policy valid : 1 + Line Size valid : 1 + Cache ID valid : 0 +[06Ch 0108 004h] Next Level of Cache : 0000004C +[070h 0112 004h] Size : 00008000 +[074h 0116 004h] Number of Sets : 00000080 +[078h 0120 001h] Associativity : 04 +[079h 0121 001h] Attributes : 03 + Allocation Type : 3 + Cache Type : 0 + Write Policy : 0 +[07Ah 0122 002h] Line Size : 0040 + +[07Ch 0124 001h] Subtable Type : 01 [Cache Type] +[07Dh 0125 001h] Length : 18 +[07Eh 0126 002h] Reserved : 0000 +[080h 0128 004h] Flags (decoded below) : 0000007F + Size valid : 1 + Number of Sets valid : 1 + Associativity valid : 1 + Allocation Type valid : 1 + Cache Type valid : 1 + Write Policy valid : 1 + Line Size valid : 1 + Cache ID valid : 0 +[084h 0132 004h] Next Level of Cache : 0000004C +[088h 0136 004h] Size : 0000C000 +[08Ch 0140 004h] Number of Sets : 00000100 +[090h 0144 001h] Associativity : 03 +[091h 0145 001h] Attributes : 07 + Allocation Type : 3 + Cache Type : 1 + Write Policy : 0 +[092h 0146 002h] Line Size : 0040 + +[094h 0148 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] +[095h 0149 001h] Length : 1C +[096h 0150 002h] Reserved : 0000 +[098h 0152 004h] Flags (decoded below) : 00000010 Physical package : 0 ACPI Processor ID valid : 0 Processor is a thread : 0 Node is a leaf : 0 Identical Implementation : 1 -[054h 0084 004h] Parent : 00000038 -[058h 0088 004h] ACPI Processor ID : 00000000 -[05Ch 0092 004h] Private Resource Number : 00000000 - -[060h 0096 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] -[061h 0097 001h] Length : 14 -[062h 0098 002h] Reserved : 0000 -[064h 0100 004h] Flags (decoded below) : 00000010 - Physical package : 0 - ACPI Processor ID valid : 0 - Processor is a thread : 0 - Node is a leaf : 0 - Identical Implementation : 1 -[068h 0104 004h] Parent : 0000004C -[06Ch 0108 004h] ACPI Processor ID : 00000000 -[070h 0112 004h] Private Resource Number : 00000000 - -[074h 0116 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] -[075h 0117 001h] Length : 14 -[076h 0118 002h] Reserved : 0000 -[078h 0120 004h] Flags (decoded below) : 0000000E - Physical package : 0 - ACPI Processor ID valid : 1 - Processor is a thread : 1 - Node is a leaf : 1 - Identical Implementation : 0 -[07Ch 0124 004h] Parent : 00000060 -[080h 0128 004h] ACPI Processor ID : 00000000 -[084h 0132 004h] Private Resource Number : 00000000 - -[088h 0136 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] -[089h 0137 001h] Length : 14 -[08Ah 0138 002h] Reserved : 0000 -[08Ch 0140 004h] Flags (decoded below) : 0000000E - Physical package : 0 - ACPI Processor ID valid : 1 - Processor is a thread : 1 - Node is a leaf : 1 - Identical Implementation : 0 -[090h 0144 004h] Parent : 00000060 -[094h 0148 004h] ACPI Processor ID : 00000001 -[098h 0152 004h] Private Resource Number : 00000000 - -[09Ch 0156 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] -[09Dh 0157 001h] Length : 14 -[09Eh 0158 002h] Reserved : 0000 -[0A0h 0160 004h] Flags (decoded below) : 00000010 - Physical package : 0 - ACPI Processor ID valid : 0 - Processor is a thread : 0 - Node is a leaf : 0 - Identical Implementation : 1 -[0A4h 0164 004h] Parent : 0000004C -[0A8h 0168 004h] ACPI Processor ID : 00000001 -[0ACh 0172 004h] Private Resource Number : 00000000 +[09Ch 0156 004h] Parent : 00000038 +[0A0h 0160 004h] ACPI Processor ID : 00000000 +[0A4h 0164 004h] Private Resource Number : 00000002 +[0A8h 0168 004h] Private Resource : 0000007C +[0ACh 0172 004h] Private Resource : 00000064 [0B0h 0176 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] [0B1h 0177 001h] Length : 14 [0B2h 0178 002h] Reserved : 0000 -[0B4h 0180 004h] Flags (decoded below) : 0000000E +[0B4h 0180 004h] Flags (decoded below) : 00000010 Physical package : 0 - ACPI Processor ID valid : 1 - Processor is a thread : 1 - Node is a leaf : 1 - Identical Implementation : 0 -[0B8h 0184 004h] Parent : 0000009C -[0BCh 0188 004h] ACPI Processor ID : 00000002 + ACPI Processor ID valid : 0 + Processor is a thread : 0 + Node is a leaf : 0 + Identical Implementation : 1 +[0B8h 0184 004h] Parent : 00000094 +[0BCh 0188 004h] ACPI Processor ID : 00000000 [0C0h 0192 004h] Private Resource Number : 00000000 [0C4h 0196 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] [0C5h 0197 001h] Length : 14 [0C6h 0198 002h] Reserved : 0000 [0C8h 0200 004h] Flags (decoded below) : 0000000E Physical package : 0 ACPI Processor ID valid : 1 Processor is a thread : 1 Node is a leaf : 1 Identical Implementation : 0 -[0CCh 0204 004h] Parent : 0000009C -[0D0h 0208 004h] ACPI Processor ID : 00000003 +[0CCh 0204 004h] Parent : 000000B0 +[0D0h 0208 004h] ACPI Processor ID : 00000000 [0D4h 0212 004h] Private Resource Number : 00000000 [0D8h 0216 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] [0D9h 0217 001h] Length : 14 [0DAh 0218 002h] Reserved : 0000 -[0DCh 0220 004h] Flags (decoded below) : 00000010 +[0DCh 0220 004h] Flags (decoded below) : 0000000E Physical package : 0 - ACPI Processor ID valid : 0 - Processor is a thread : 0 - Node is a leaf : 0 - Identical Implementation : 1 -[0E0h 0224 004h] Parent : 00000038 + ACPI Processor ID valid : 1 + Processor is a thread : 1 + Node is a leaf : 1 + Identical Implementation : 0 +[0E0h 0224 004h] Parent : 000000B0 [0E4h 0228 004h] ACPI Processor ID : 00000001 [0E8h 0232 004h] Private Resource Number : 00000000 [0ECh 0236 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] [0EDh 0237 001h] Length : 14 [0EEh 0238 002h] Reserved : 0000 [0F0h 0240 004h] Flags (decoded below) : 00000010 Physical package : 0 ACPI Processor ID valid : 0 Processor is a thread : 0 Node is a leaf : 0 Identical Implementation : 1 -[0F4h 0244 004h] Parent : 000000D8 -[0F8h 0248 004h] ACPI Processor ID : 00000000 +[0F4h 0244 004h] Parent : 00000094 +[0F8h 0248 004h] ACPI Processor ID : 00000001 [0FCh 0252 004h] Private Resource Number : 00000000 [100h 0256 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] [101h 0257 001h] Length : 14 [102h 0258 002h] Reserved : 0000 [104h 0260 004h] Flags (decoded below) : 0000000E Physical package : 0 ACPI Processor ID valid : 1 Processor is a thread : 1 Node is a leaf : 1 Identical Implementation : 0 [108h 0264 004h] Parent : 000000EC -[10Ch 0268 004h] ACPI Processor ID : 00000004 +[10Ch 0268 004h] ACPI Processor ID : 00000002 [110h 0272 004h] Private Resource Number : 00000000 [114h 0276 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] [115h 0277 001h] Length : 14 [116h 0278 002h] Reserved : 0000 [118h 0280 004h] Flags (decoded below) : 0000000E Physical package : 0 ACPI Processor ID valid : 1 Processor is a thread : 1 Node is a leaf : 1 Identical Implementation : 0 [11Ch 0284 004h] Parent : 000000EC -[120h 0288 004h] ACPI Processor ID : 00000005 +[120h 0288 004h] ACPI Processor ID : 00000003 [124h 0292 004h] Private Resource Number : 00000000 -[128h 0296 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] -[129h 0297 001h] Length : 14 +[128h 0296 001h] Subtable Type : 01 [Cache Type] +[129h 0297 001h] Length : 18 [12Ah 0298 002h] Reserved : 0000 -[12Ch 0300 004h] Flags (decoded below) : 00000010 +[12Ch 0300 004h] Flags (decoded below) : 0000007F + Size valid : 1 + Number of Sets valid : 1 + Associativity valid : 1 + Allocation Type valid : 1 + Cache Type valid : 1 + Write Policy valid : 1 + Line Size valid : 1 + Cache ID valid : 0 +[130h 0304 004h] Next Level of Cache : 00000000 +[134h 0308 004h] Size : 00200000 +[138h 0312 004h] Number of Sets : 00000800 +[13Ch 0316 001h] Associativity : 10 +[13Dh 0317 001h] Attributes : 0F + Allocation Type : 3 + Cache Type : 3 + Write Policy : 0 +[13Eh 0318 002h] Line Size : 0040 + +[140h 0320 001h] Subtable Type : 01 [Cache Type] +[141h 0321 001h] Length : 18 +[142h 0322 002h] Reserved : 0000 +[144h 0324 004h] Flags (decoded below) : 0000007F + Size valid : 1 + Number of Sets valid : 1 + Associativity valid : 1 + Allocation Type valid : 1 + Cache Type valid : 1 + Write Policy valid : 1 + Line Size valid : 1 + Cache ID valid : 0 +[148h 0328 004h] Next Level of Cache : 00000128 +[14Ch 0332 004h] Size : 00008000 +[150h 0336 004h] Number of Sets : 00000080 +[154h 0340 001h] Associativity : 04 +[155h 0341 001h] Attributes : 03 + Allocation Type : 3 + Cache Type : 0 + Write Policy : 0 +[156h 0342 002h] Line Size : 0040 + +[158h 0344 001h] Subtable Type : 01 [Cache Type] +[159h 0345 001h] Length : 18 +[15Ah 0346 002h] Reserved : 0000 +[15Ch 0348 004h] Flags (decoded below) : 0000007F + Size valid : 1 + Number of Sets valid : 1 + Associativity valid : 1 + Allocation Type valid : 1 + Cache Type valid : 1 + Write Policy valid : 1 + Line Size valid : 1 + Cache ID valid : 0 +[160h 0352 004h] Next Level of Cache : 00000128 +[164h 0356 004h] Size : 0000C000 +[168h 0360 004h] Number of Sets : 00000100 +[16Ch 0364 001h] Associativity : 03 +[16Dh 0365 001h] Attributes : 07 + Allocation Type : 3 + Cache Type : 1 + Write Policy : 0 +[16Eh 0366 002h] Line Size : 0040 + +[170h 0368 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] +[171h 0369 001h] Length : 1C +[172h 0370 002h] Reserved : 0000 +[174h 0372 004h] Flags (decoded below) : 00000010 + Physical package : 0 + ACPI Processor ID valid : 0 + Processor is a thread : 0 + Node is a leaf : 0 + Identical Implementation : 1 +[178h 0376 004h] Parent : 00000038 +[17Ch 0380 004h] ACPI Processor ID : 00000001 +[180h 0384 004h] Private Resource Number : 00000002 +[184h 0388 004h] Private Resource : 00000158 +[188h 0392 004h] Private Resource : 00000140 + +[18Ch 0396 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] +[18Dh 0397 001h] Length : 14 +[18Eh 0398 002h] Reserved : 0000 +[190h 0400 004h] Flags (decoded below) : 00000010 + Physical package : 0 + ACPI Processor ID valid : 0 + Processor is a thread : 0 + Node is a leaf : 0 + Identical Implementation : 1 +[194h 0404 004h] Parent : 00000170 +[198h 0408 004h] ACPI Processor ID : 00000000 +[19Ch 0412 004h] Private Resource Number : 00000000 + +[1A0h 0416 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] +[1A1h 0417 001h] Length : 14 +[1A2h 0418 002h] Reserved : 0000 +[1A4h 0420 004h] Flags (decoded below) : 0000000E + Physical package : 0 + ACPI Processor ID valid : 1 + Processor is a thread : 1 + Node is a leaf : 1 + Identical Implementation : 0 +[1A8h 0424 004h] Parent : 0000018C +[1ACh 0428 004h] ACPI Processor ID : 00000004 +[1B0h 0432 004h] Private Resource Number : 00000000 + +[1B4h 0436 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] +[1B5h 0437 001h] Length : 14 +[1B6h 0438 002h] Reserved : 0000 +[1B8h 0440 004h] Flags (decoded below) : 0000000E + Physical package : 0 + ACPI Processor ID valid : 1 + Processor is a thread : 1 + Node is a leaf : 1 + Identical Implementation : 0 +[1BCh 0444 004h] Parent : 0000018C +[1C0h 0448 004h] ACPI Processor ID : 00000005 +[1C4h 0452 004h] Private Resource Number : 00000000 + +[1C8h 0456 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] +[1C9h 0457 001h] Length : 14 +[1CAh 0458 002h] Reserved : 0000 +[1CCh 0460 004h] Flags (decoded below) : 00000010 Physical package : 0 ACPI Processor ID valid : 0 Processor is a thread : 0 Node is a leaf : 0 Identical Implementation : 1 -[130h 0304 004h] Parent : 000000D8 -[134h 0308 004h] ACPI Processor ID : 00000001 -[138h 0312 004h] Private Resource Number : 00000000 - -[13Ch 0316 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] -[13Dh 0317 001h] Length : 14 -[13Eh 0318 002h] Reserved : 0000 -[140h 0320 004h] Flags (decoded below) : 0000000E +[1D0h 0464 004h] Parent : 00000170 +[1D4h 0468 004h] ACPI Processor ID : 00000001 +[1D8h 0472 004h] Private Resource Number : 00000000 + +[1DCh 0476 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] +[1DDh 0477 001h] Length : 14 +[1DEh 0478 002h] Reserved : 0000 +[1E0h 0480 004h] Flags (decoded below) : 0000000E Physical package : 0 ACPI Processor ID valid : 1 Processor is a thread : 1 Node is a leaf : 1 Identical Implementation : 0 -[144h 0324 004h] Parent : 00000128 -[148h 0328 004h] ACPI Processor ID : 00000006 -[14Ch 0332 004h] Private Resource Number : 00000000 - -[150h 0336 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] -[151h 0337 001h] Length : 14 -[152h 0338 002h] Reserved : 0000 -[154h 0340 004h] Flags (decoded below) : 0000000E +[1E4h 0484 004h] Parent : 000001C8 +[1E8h 0488 004h] ACPI Processor ID : 00000006 +[1ECh 0492 004h] Private Resource Number : 00000000 + +[1F0h 0496 001h] Subtable Type : 00 [Processor Hierarchy Nod= e] +[1F1h 0497 001h] Length : 14 +[1F2h 0498 002h] Reserved : 0000 +[1F4h 0500 004h] Flags (decoded below) : 0000000E Physical package : 0 ACPI Processor ID valid : 1 Processor is a thread : 1 Node is a leaf : 1 Identical Implementation : 0 -[158h 0344 004h] Parent : 00000128 -[15Ch 0348 004h] ACPI Processor ID : 00000007 -[160h 0352 004h] Private Resource Number : 00000000 +[1F8h 0504 004h] Parent : 000001C8 +[1FCh 0508 004h] ACPI Processor ID : 00000007 +[200h 0512 004h] Private Resource Number : 00000000 -Raw Table Data: Length 356 (0x164) +Raw Table Data: Length 516 (0x204) - 0000: 50 50 54 54 64 01 00 00 02 97 42 4F 43 48 53 20 // PPTTd.....BO= CHS + 0000: 50 50 54 54 04 02 00 00 02 B8 42 4F 43 48 53 20 // PPTT......BO= CHS 0010: 42 58 50 43 20 20 20 20 01 00 00 00 42 58 50 43 // BXPC ....= BXPC 0020: 01 00 00 00 00 14 00 00 11 00 00 00 00 00 00 00 // ............= .... 0030: 00 00 00 00 00 00 00 00 00 14 00 00 11 00 00 00 // ............= .... - 0040: 24 00 00 00 00 00 00 00 00 00 00 00 00 14 00 00 // $...........= .... - 0050: 10 00 00 00 38 00 00 00 00 00 00 00 00 00 00 00 // ....8.......= .... - 0060: 00 14 00 00 10 00 00 00 4C 00 00 00 00 00 00 00 // ........L...= .... - 0070: 00 00 00 00 00 14 00 00 0E 00 00 00 60 00 00 00 // ............= `... - 0080: 00 00 00 00 00 00 00 00 00 14 00 00 0E 00 00 00 // ............= .... - 0090: 60 00 00 00 01 00 00 00 00 00 00 00 00 14 00 00 // `...........= .... - 00A0: 10 00 00 00 4C 00 00 00 01 00 00 00 00 00 00 00 // ....L.......= .... - 00B0: 00 14 00 00 0E 00 00 00 9C 00 00 00 02 00 00 00 // ............= .... - 00C0: 00 00 00 00 00 14 00 00 0E 00 00 00 9C 00 00 00 // ............= .... - 00D0: 03 00 00 00 00 00 00 00 00 14 00 00 10 00 00 00 // ............= .... - 00E0: 38 00 00 00 01 00 00 00 00 00 00 00 00 14 00 00 // 8...........= .... - 00F0: 10 00 00 00 D8 00 00 00 00 00 00 00 00 00 00 00 // ............= .... - 0100: 00 14 00 00 0E 00 00 00 EC 00 00 00 04 00 00 00 // ............= .... + 0040: 24 00 00 00 00 00 00 00 00 00 00 00 01 18 00 00 // $...........= .... + 0050: 7F 00 00 00 00 00 00 00 00 00 20 00 00 08 00 00 // .......... .= .... + 0060: 10 0F 40 00 01 18 00 00 7F 00 00 00 4C 00 00 00 // ..@.........= L... + 0070: 00 80 00 00 80 00 00 00 04 03 40 00 01 18 00 00 // ..........@.= .... + 0080: 7F 00 00 00 4C 00 00 00 00 C0 00 00 00 01 00 00 // ....L.......= .... + 0090: 03 07 40 00 00 1C 00 00 10 00 00 00 38 00 00 00 // ..@.........= 8... + 00A0: 00 00 00 00 02 00 00 00 7C 00 00 00 64 00 00 00 // ........|...= d... + 00B0: 00 14 00 00 10 00 00 00 94 00 00 00 00 00 00 00 // ............= .... + 00C0: 00 00 00 00 00 14 00 00 0E 00 00 00 B0 00 00 00 // ............= .... + 00D0: 00 00 00 00 00 00 00 00 00 14 00 00 0E 00 00 00 // ............= .... + 00E0: B0 00 00 00 01 00 00 00 00 00 00 00 00 14 00 00 // ............= .... + 00F0: 10 00 00 00 94 00 00 00 01 00 00 00 00 00 00 00 // ............= .... + 0100: 00 14 00 00 0E 00 00 00 EC 00 00 00 02 00 00 00 // ............= .... 0110: 00 00 00 00 00 14 00 00 0E 00 00 00 EC 00 00 00 // ............= .... - 0120: 05 00 00 00 00 00 00 00 00 14 00 00 10 00 00 00 // ............= .... - 0130: D8 00 00 00 01 00 00 00 00 00 00 00 00 14 00 00 // ............= .... - 0140: 0E 00 00 00 28 01 00 00 06 00 00 00 00 00 00 00 // ....(.......= .... - 0150: 00 14 00 00 0E 00 00 00 28 01 00 00 07 00 00 00 // ........(...= .... - 0160: 00 00 00 00 // .... + 0120: 03 00 00 00 00 00 00 00 01 18 00 00 7F 00 00 00 // ............= .... + 0130: 00 00 00 00 00 00 20 00 00 08 00 00 10 0F 40 00 // ...... .....= ..@. + 0140: 01 18 00 00 7F 00 00 00 28 01 00 00 00 80 00 00 // ........(...= .... + 0150: 80 00 00 00 04 03 40 00 01 18 00 00 7F 00 00 00 // ......@.....= .... + 0160: 28 01 00 00 00 C0 00 00 00 01 00 00 03 07 40 00 // (...........= ..@. + 0170: 00 1C 00 00 10 00 00 00 38 00 00 00 01 00 00 00 // ........8...= .... + 0180: 02 00 00 00 58 01 00 00 40 01 00 00 00 14 00 00 // ....X...@...= .... + 0190: 10 00 00 00 70 01 00 00 00 00 00 00 00 00 00 00 // ....p.......= .... + 01A0: 00 14 00 00 0E 00 00 00 8C 01 00 00 04 00 00 00 // ............= .... + 01B0: 00 00 00 00 00 14 00 00 0E 00 00 00 8C 01 00 00 // ............= .... + 01C0: 05 00 00 00 00 00 00 00 00 14 00 00 10 00 00 00 // ............= .... + 01D0: 70 01 00 00 01 00 00 00 00 00 00 00 00 14 00 00 // p...........= .... + 01E0: 0E 00 00 00 C8 01 00 00 06 00 00 00 00 00 00 00 // ............= .... + 01F0: 00 14 00 00 0E 00 00 00 C8 01 00 00 07 00 00 00 // ............= .... + 0200: 00 00 00 00 // .... Reviewed-by: Jonathan Cameron Reviewed-by: Zhao Liu Signed-off-by: Alireza Sanaee --- tests/data/acpi/aarch64/virt/PPTT.topology | Bin 356 -> 516 bytes tests/qtest/bios-tables-test-allowed-diff.h | 3 --- 2 files changed, 3 deletions(-) diff --git a/tests/data/acpi/aarch64/virt/PPTT.topology b/tests/data/acpi/a= arch64/virt/PPTT.topology index 6b864f035c9f48845e9a3beb482c5171074864a5..4f9472c5f728f3068d1054d5042= b85190bdb88da 100644 GIT binary patch literal 516 zcmZvXy$!-Z4255QAXNNF6ciL!P%r{zlr$7bL?T57U;qX{A_Gt|2qk4ohG7Wa3wP0p z#END6^S#(Ein5GDAbe%Ve19@oRpf>i08p-oC9qKR&9aThf)#MVcoy2Sc7o)9c7V(S=3D|vU;>74__Oh60