4 Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include <AmlNodeDefines.h>
11 #include <AmlCoreInterface.h>
12 #include <Tree/AmlNode.h>
13 #include <Tree/AmlTree.h>
17 This function does not clone the children nodes.
18 The cloned node returned is not attached to any tree.
20 @param [in] Node Pointer to a node.
21 @param [out] ClonedNode Pointer holding the cloned node.
23 @retval EFI_SUCCESS The function completed successfully.
24 @retval EFI_INVALID_PARAMETER Invalid parameter.
25 @retval EFI_OUT_OF_RESOURCES Could not allocate memory.
30 IN AML_NODE_HEADER
* Node
,
31 OUT AML_NODE_HEADER
** ClonedNode
36 AML_OBJECT_NODE
* ObjectNode
;
37 AML_DATA_NODE
* DataNode
;
38 AML_ROOT_NODE
* RootNode
;
40 if (!IS_AML_NODE_VALID (Node
) ||
41 (ClonedNode
== NULL
)) {
43 return EFI_INVALID_PARAMETER
;
46 if (IS_AML_DATA_NODE (Node
)) {
47 DataNode
= (AML_DATA_NODE
*)Node
;
48 Status
= AmlCreateDataNode (
52 (AML_DATA_NODE
**)ClonedNode
54 if (EFI_ERROR (Status
)) {
57 } else if (IS_AML_OBJECT_NODE (Node
)) {
58 ObjectNode
= (AML_OBJECT_NODE
*)Node
;
60 Status
= AmlCreateObjectNode (
61 ObjectNode
->AmlByteEncoding
,
63 (AML_OBJECT_NODE
**)ClonedNode
65 if (EFI_ERROR (Status
)) {
68 } else if (IS_AML_ROOT_NODE (Node
)) {
69 RootNode
= (AML_ROOT_NODE
*)Node
;
71 Status
= AmlCreateRootNode (
73 (AML_ROOT_NODE
**)ClonedNode
75 if (EFI_ERROR (Status
)) {
80 return EFI_INVALID_PARAMETER
;
86 /** Clone a node and its children (clone a tree branch).
88 The cloned branch returned is not attached to any tree.
90 @param [in] Node Pointer to a node.
91 Node is the head of the branch to clone.
92 @param [out] ClonedNode Pointer holding the head of the created cloned
95 @retval EFI_SUCCESS The function completed successfully.
96 @retval EFI_INVALID_PARAMETER Invalid parameter.
97 @retval EFI_OUT_OF_RESOURCES Could not allocate memory.
102 IN AML_NODE_HEADER
* Node
,
103 OUT AML_NODE_HEADER
** ClonedNode
108 AML_NODE_HEADER
* HeadNode
;
109 AML_NODE_HEADER
* ClonedChildNode
;
110 AML_NODE_HEADER
* FixedArgNode
;
112 EAML_PARSE_INDEX Index
;
113 EAML_PARSE_INDEX MaxIndex
;
115 LIST_ENTRY
* StartLink
;
116 LIST_ENTRY
* CurrentLink
;
118 if (!IS_AML_NODE_VALID (Node
) ||
119 (ClonedNode
== NULL
)) {
121 return EFI_INVALID_PARAMETER
;
124 Status
= AmlCloneNode (Node
, &HeadNode
);
125 if (EFI_ERROR (Status
)) {
130 // Clone the fixed arguments and bind them to their parent.
131 MaxIndex
= (EAML_PARSE_INDEX
)AmlGetFixedArgumentCount (
132 (AML_OBJECT_NODE
*)Node
134 for (Index
= EAmlParseIndexTerm0
; Index
< MaxIndex
; Index
++) {
135 FixedArgNode
= AmlGetFixedArgument ((AML_OBJECT_NODE
*)Node
, Index
);
136 if (FixedArgNode
== NULL
) {
137 Status
= EFI_INVALID_PARAMETER
;
143 Status
= AmlCloneTree (
147 if (EFI_ERROR (Status
)) {
153 Status
= AmlSetFixedArgument (
154 (AML_OBJECT_NODE
*)HeadNode
,
158 if (EFI_ERROR (Status
)) {
159 AmlDeleteTree (ClonedChildNode
);
165 // Clone the variable arguments and bind them to their parent.
166 StartLink
= AmlNodeGetVariableArgList (Node
);
167 if (StartLink
!= NULL
) {
168 CurrentLink
= StartLink
->ForwardLink
;
169 while (CurrentLink
!= StartLink
) {
171 Status
= AmlCloneTree ((AML_NODE_HEADER
*)CurrentLink
, &ClonedChildNode
);
172 if (EFI_ERROR (Status
)) {
178 Status
= AmlVarListAddTailInternal (
182 if (EFI_ERROR (Status
)) {
183 AmlDeleteTree (ClonedChildNode
);
188 CurrentLink
= CurrentLink
->ForwardLink
;
192 *ClonedNode
= HeadNode
;
198 if (HeadNode
!= NULL
) {
199 AmlDeleteTree (HeadNode
);