From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from EUR04-DB3-obe.outbound.protection.outlook.com (EUR04-DB3-obe.outbound.protection.outlook.com [40.107.6.47]) by mx.groups.io with SMTP id smtpd.web11.17173.1597245811724916422 for ; Wed, 12 Aug 2020 08:23:32 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=bnXcW7qG; spf=pass (domain: arm.com, ip: 40.107.6.47, mailfrom: sami.mujawar@arm.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lgM06d5++WXsRBIacWXq6dkxI50dnmIgll9skX0vVEk=; b=bnXcW7qGzBV6T/CTnkQX8JTN98PSFoKR4J8kz3VOqlHLp6Ek8eLe7ZId78Y/UjZlpFvNsl0dPSEpxk0ZEzNfYSB5YUzqqsUwqEm9WSMoBNXrBVa7jjBMDiLKqQ2SMM0C/yl5GcZWZF7ZyUbiOxMTPVDLLSQEtxofRGDNMu91L0E= Received: from AM5PR0402CA0006.eurprd04.prod.outlook.com (2603:10a6:203:90::16) by DB6PR0801MB1814.eurprd08.prod.outlook.com (2603:10a6:4:37::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.16; Wed, 12 Aug 2020 15:23:27 +0000 Received: from AM5EUR03FT046.eop-EUR03.prod.protection.outlook.com (2603:10a6:203:90:cafe::3f) by AM5PR0402CA0006.outlook.office365.com (2603:10a6:203:90::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3283.15 via Frontend Transport; Wed, 12 Aug 2020 15:23:27 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; edk2.groups.io; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;edk2.groups.io; dmarc=bestguesspass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM5EUR03FT046.mail.protection.outlook.com (10.152.16.164) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3283.16 via Frontend Transport; Wed, 12 Aug 2020 15:23:27 +0000 Received: ("Tessian outbound 7fc8f57bdedc:v64"); Wed, 12 Aug 2020 15:23:27 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: d4c6dfcc73d5f20a X-CR-MTA-TID: 64aa7808 Received: from b2429d5f0b3b.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 59A822B1-62C7-4390-93BD-4EF69C996C06.1; Wed, 12 Aug 2020 15:23:21 +0000 Received: from EUR01-HE1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id b2429d5f0b3b.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Wed, 12 Aug 2020 15:23:21 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=J18t6Yrvoz4kgtYaIC0TAYeMwmrI5q2wZhbyXiJmnCVMIMK1nLof4571wECMrkRErZrXoM2pTK8pDJUyNUHkMpyEa5tn2FRFoTyRakdsPtEtCP0jN9xx54CFR8R+S1cwEyWK2oRjiV06uPCaNpp3DjMhVOIPjlNeY4bwrY+dWuP2sPu7r2zp3qQiY5AWvUCHJx33zqh7tpKQbO/AutxyavH4jatbJ94hEp2BbCYw0qrn10Di7vxk0aQ2dFLFW3e5TU9oQit/dsupWs+QhqecNW61isduNlVAbp6tZ1lUjd18eKRov6GDrwFHbFvX9KFvea6rIi2zZefJHsMCPH/pJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lgM06d5++WXsRBIacWXq6dkxI50dnmIgll9skX0vVEk=; b=Ff3fCWbf3k9uCr5K8+BEQVFtfElGr4+IqT0GY1qQHl74KuYvZJosY52PA1YRQaaeqKcInBTLj1fFQb3u6oPPIjWT6pKLbgBFVooPo8Jagc4y81ld42lL3zNk6Dlt6w/n4goz0rSqtz2ThFEI5kTadqFuYXkIEYnwKb/48rKT2Z6Z4IGbsteVFv97tVQO5QxVCWj1wVwqd6X+38TQ3o4Hs4ZWM/K8G0T+gjaJTo35mgHES9Ru8vYJasHkpJnW2wcF3w0j4QuoZAelCQqTV4M7KIkryWB/kxDuBL7siX0CH2bzeB3b8kp0IiK623rRDaWeiuu75VL0DWACnhoghmh7Zg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.67.248.234) smtp.rcpttodomain=edk2.groups.io smtp.mailfrom=arm.com; dmarc=bestguesspass action=none header.from=arm.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lgM06d5++WXsRBIacWXq6dkxI50dnmIgll9skX0vVEk=; b=bnXcW7qGzBV6T/CTnkQX8JTN98PSFoKR4J8kz3VOqlHLp6Ek8eLe7ZId78Y/UjZlpFvNsl0dPSEpxk0ZEzNfYSB5YUzqqsUwqEm9WSMoBNXrBVa7jjBMDiLKqQ2SMM0C/yl5GcZWZF7ZyUbiOxMTPVDLLSQEtxofRGDNMu91L0E= Received: from DB6P193CA0011.EURP193.PROD.OUTLOOK.COM (2603:10a6:6:29::21) by VE1PR08MB4877.eurprd08.prod.outlook.com (2603:10a6:802:a4::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.19; Wed, 12 Aug 2020 15:23:20 +0000 Received: from DB5EUR03FT018.eop-EUR03.prod.protection.outlook.com (2603:10a6:6:29:cafe::e5) by DB6P193CA0011.outlook.office365.com (2603:10a6:6:29::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3283.15 via Frontend Transport; Wed, 12 Aug 2020 15:23:20 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.67.248.234) smtp.mailfrom=arm.com; edk2.groups.io; dkim=none (message not signed) header.d=none;edk2.groups.io; dmarc=bestguesspass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 40.67.248.234 as permitted sender) receiver=protection.outlook.com; client-ip=40.67.248.234; helo=nebula.arm.com; Received: from nebula.arm.com (40.67.248.234) by DB5EUR03FT018.mail.protection.outlook.com (10.152.20.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.3283.16 via Frontend Transport; Wed, 12 Aug 2020 15:23:20 +0000 Received: from AZ-NEU-EX04.Arm.com (10.251.24.32) by AZ-NEU-EX04.Arm.com (10.251.24.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2044.4; Wed, 12 Aug 2020 15:23:15 +0000 Received: from E107187.Arm.com (10.57.41.222) by mail.arm.com (10.251.24.32) with Microsoft SMTP Server id 15.1.2044.4 via Frontend Transport; Wed, 12 Aug 2020 15:23:14 +0000 From: "Sami Mujawar" To: CC: Sami Mujawar , , , , , , Subject: [PATCH v1 09/30] DynamicTablesPkg: AML tree/node cloning Date: Wed, 12 Aug 2020 16:22:15 +0100 Message-ID: <20200812152236.31164-10-sami.mujawar@arm.com> X-Mailer: git-send-email 2.11.0.windows.3 In-Reply-To: <20200812152236.31164-1-sami.mujawar@arm.com> References: <20200812152236.31164-1-sami.mujawar@arm.com> MIME-Version: 1.0 X-EOPAttributedMessage: 1 X-MS-Office365-Filtering-HT: Tenant X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f02b1e68-cae1-48b2-41bb-08d83ed3a949 X-MS-TrafficTypeDiagnostic: VE1PR08MB4877:|DB6PR0801MB1814: X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true NoDisclaimer: true X-MS-Oob-TLC-OOBClassifiers: OLM:6108;OLM:6108; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: 5H1WQA6YmUDlblxbbdzWCYtyCkBUdQN7dFDWcPnw0rytMdYinXAM8SnWK3jcaZDFP0nYBylooejpC3N/4A2erJLowYTZ8NyA2xOaicn+RE+9deZK30wJZGgbId15Wa228djKrY02ST6NX5UJuB5ie/Nd+D2gu0bLarTNrWVChp5CPnmMlQVuN5UcjhQ8RtaLd3sFpk/D5WBGdUxAltRsxvzsy8oUdRYc9qPAsXQgVLHs3BpIx9QHK5QpPbbTC/YDxkL/P49JWFurGD1g5f6zpBywH6TO03UWyiSvn+UUbFatBfsewyFufvoZug1aF7aXG4dd12SI39ks0rxvstb0290ZWKi/NItg78c/Ue3bv9ej4Gi9wwoTO1KunkLZKtx4d8C8XmR2o8HY484I1ofjDQ== X-Forefront-Antispam-Report-Untrusted: CIP:40.67.248.234;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:nebula.arm.com;PTR:InfoDomainNonexistent;CAT:NONE;SFTY:;SFS:(4636009)(39860400002)(136003)(376002)(346002)(396003)(46966005)(4326008)(8676002)(2906002)(82740400003)(356005)(6916009)(81166007)(47076004)(316002)(478600001)(5660300002)(54906003)(186003)(26005)(44832011)(83380400001)(336012)(70206006)(7696005)(70586007)(8936002)(82310400002)(2616005)(426003)(86362001)(36756003)(1076003);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR08MB4877 Return-Path: Sami.Mujawar@arm.com X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM5EUR03FT046.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: cbe0c1d6-fcf8-47f9-84b3-08d83ed3a501 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: hx2WI2l0aXsqCHMXmnxDtflN8re0pz9u4h3SJ86tT5h85mSn1pAS9cGsQrRq1YgHdwit9kGjtzWm04eggeqPffi+oC36rAFN/Ed/hAbdmlVIRB0tp9hgochBDaGOBpipQ9h7mGc7TgtNHYBrw68ZhGNsQlyrrkJZjKtDj6HcM3dw+le1nqYtEOWR+zXiI68r0U7KqbStAnwnPP/PVCYxkVkJYp6oUgzs6qK/73IoV7C3GG1vk03CNDejbTVQR6sXnpDYOmytqVIk9oI7SQRlDKSZQnEBlmURNp4ASat91Cgj+GsAlxCUaLBW8uQfPYUQZw76Ma0Ffr3QjRf7yGwdgAgC2hcaFqM7DPYiteuoariFdRHp21BAY2fXlK1NA8gBWjWU6vG73XZROQBoQjps/A== X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFTY:;SFS:(4636009)(396003)(346002)(136003)(39860400002)(376002)(46966005)(54906003)(86362001)(8676002)(2906002)(26005)(6916009)(478600001)(8936002)(4326008)(7696005)(186003)(82310400002)(36906005)(44832011)(47076004)(2616005)(1076003)(81166007)(5660300002)(70206006)(70586007)(336012)(83380400001)(82740400003)(36756003)(426003)(316002);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Aug 2020 15:23:27.1527 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f02b1e68-cae1-48b2-41bb-08d83ed3a949 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: AM5EUR03FT046.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0801MB1814 Content-Type: text/plain From: Pierre Gondois It is often desirable to clone an AML branch/tree or an AML node. An example of could be to clone an AML template before fixup so that the original AML template remains unmodified. Another example would be replicating a device branch in the AML tree and fixing up the device information. To facilitate such scenarios the AmlLib library provides functions that can be used to clone an AML branch/tree or an AML node. Signed-off-by: Pierre Gondois Signed-off-by: Sami Mujawar --- DynamicTablesPkg/Library/Common/AmlLib/Tree/AmlClone.c | 205 ++++++++++++++++++++ 1 file changed, 205 insertions(+) diff --git a/DynamicTablesPkg/Library/Common/AmlLib/Tree/AmlClone.c b/DynamicTablesPkg/Library/Common/AmlLib/Tree/AmlClone.c new file mode 100644 index 0000000000000000000000000000000000000000..e09372b039f1f232de500effae7d403d56c989cd --- /dev/null +++ b/DynamicTablesPkg/Library/Common/AmlLib/Tree/AmlClone.c @@ -0,0 +1,205 @@ +/** @file + AML Clone. + + Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +#include +#include +#include + +/** Clone a node. + + This function does not clone the children nodes. + The cloned node returned is not attached to any tree. + + @param [in] Node Pointer to a node. + @param [out] ClonedNode Pointer holding the cloned node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +EFI_STATUS +EFIAPI +AmlCloneNode ( + IN AML_NODE_HEADER * Node, + OUT AML_NODE_HEADER ** ClonedNode + ) +{ + EFI_STATUS Status; + + AML_OBJECT_NODE * ObjectNode; + AML_DATA_NODE * DataNode; + AML_ROOT_NODE * RootNode; + + if (!IS_AML_NODE_VALID (Node) || + (ClonedNode == NULL)) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + *ClonedNode = NULL; + + if (IS_AML_DATA_NODE (Node)) { + DataNode = (AML_DATA_NODE*)Node; + Status = AmlCreateDataNode ( + DataNode->DataType, + DataNode->Buffer, + DataNode->Size, + (AML_DATA_NODE**)ClonedNode + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + } + } else if (IS_AML_OBJECT_NODE (Node)) { + ObjectNode = (AML_OBJECT_NODE*)Node; + + Status = AmlCreateObjectNode ( + ObjectNode->AmlByteEncoding, + ObjectNode->PkgLen, + (AML_OBJECT_NODE**)ClonedNode + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + } + } else if (IS_AML_ROOT_NODE (Node)) { + RootNode = (AML_ROOT_NODE*)Node; + + Status = AmlCreateRootNode ( + RootNode->SdtHeader, + (AML_ROOT_NODE**)ClonedNode + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + } + } else { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + return Status; +} + +/** Clone a node and its children (clone a tree branch). + + The cloned branch returned is not attached to any tree. + + @param [in] Node Pointer to a node. + Node is the head of the branch to clone. + @param [out] ClonedNode Pointer holding the head of the created cloned + branch. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +EFI_STATUS +EFIAPI +AmlCloneTree ( + IN AML_NODE_HEADER * Node, + OUT AML_NODE_HEADER ** ClonedNode + ) +{ + EFI_STATUS Status; + + AML_NODE_HEADER * HeadNode; + AML_NODE_HEADER * ClonedChildNode; + AML_NODE_HEADER * FixedArgNode; + + EAML_PARSE_INDEX Index; + EAML_PARSE_INDEX MaxIndex; + + LIST_ENTRY * StartLink; + LIST_ENTRY * CurrentLink; + + if (!IS_AML_NODE_VALID (Node) || + (ClonedNode == NULL)) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Status = AmlCloneNode (Node, &HeadNode); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + // Clone the fixed arguments and bind them to their parent. + MaxIndex = (EAML_PARSE_INDEX)AmlGetFixedArgumentCount ( + (AML_OBJECT_NODE*)Node + ); + for (Index = EAmlParseIndexTerm0; Index < MaxIndex; Index++) { + FixedArgNode = AmlGetFixedArgument ((AML_OBJECT_NODE*)Node, Index); + if (FixedArgNode == NULL) { + Status = EFI_INVALID_PARAMETER; + ASSERT (0); + goto error_handler; + } + + // Clone child. + Status = AmlCloneTree ( + FixedArgNode, + &ClonedChildNode + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + goto error_handler; + } + + // Bind child. + Status = AmlSetFixedArgument ( + (AML_OBJECT_NODE*)HeadNode, + Index, + ClonedChildNode + ); + if (EFI_ERROR (Status)) { + AmlDeleteTree (ClonedChildNode); + ASSERT (0); + goto error_handler; + } + } // for + + // Clone the variable arguments and bind them to their parent. + StartLink = AmlNodeGetVariableArgList (Node); + if (StartLink != NULL) { + CurrentLink = StartLink->ForwardLink; + while (CurrentLink != StartLink) { + // Clone child. + Status = AmlCloneTree ((AML_NODE_HEADER*)CurrentLink, &ClonedChildNode); + if (EFI_ERROR (Status)) { + ASSERT (0); + goto error_handler; + } + + // Bind child. + Status = AmlVarListAddTailInternal ( + HeadNode, + ClonedChildNode + ); + if (EFI_ERROR (Status)) { + AmlDeleteTree (ClonedChildNode); + ASSERT (0); + goto error_handler; + } + + CurrentLink = CurrentLink->ForwardLink; + } // while + } + + *ClonedNode = HeadNode; + return Status; + +error_handler: + *ClonedNode = NULL; + + if (HeadNode != NULL) { + AmlDeleteTree (HeadNode); + } + + return Status; +} -- 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'