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
) ||
44 return EFI_INVALID_PARAMETER
;
47 if (IS_AML_DATA_NODE (Node
)) {
48 DataNode
= (AML_DATA_NODE
*)Node
;
49 Status
= AmlCreateDataNode (
53 (AML_DATA_NODE
**)ClonedNode
55 if (EFI_ERROR (Status
)) {
58 } else if (IS_AML_OBJECT_NODE (Node
)) {
59 ObjectNode
= (AML_OBJECT_NODE
*)Node
;
61 Status
= AmlCreateObjectNode (
62 ObjectNode
->AmlByteEncoding
,
64 (AML_OBJECT_NODE
**)ClonedNode
66 if (EFI_ERROR (Status
)) {
69 } else if (IS_AML_ROOT_NODE (Node
)) {
70 RootNode
= (AML_ROOT_NODE
*)Node
;
72 Status
= AmlCreateRootNode (
74 (AML_ROOT_NODE
**)ClonedNode
76 if (EFI_ERROR (Status
)) {
81 return EFI_INVALID_PARAMETER
;
87 /** Clone a node and its children (clone a tree branch).
89 The cloned branch returned is not attached to any tree.
91 @param [in] Node Pointer to a node.
92 Node is the head of the branch to clone.
93 @param [out] ClonedNode Pointer holding the head of the created cloned
96 @retval EFI_SUCCESS The function completed successfully.
97 @retval EFI_INVALID_PARAMETER Invalid parameter.
98 @retval EFI_OUT_OF_RESOURCES Could not allocate memory.
103 IN AML_NODE_HEADER
*Node
,
104 OUT AML_NODE_HEADER
**ClonedNode
109 AML_NODE_HEADER
*HeadNode
;
110 AML_NODE_HEADER
*ClonedChildNode
;
111 AML_NODE_HEADER
*FixedArgNode
;
113 EAML_PARSE_INDEX Index
;
114 EAML_PARSE_INDEX MaxIndex
;
116 LIST_ENTRY
*StartLink
;
117 LIST_ENTRY
*CurrentLink
;
119 if (!IS_AML_NODE_VALID (Node
) ||
120 (ClonedNode
== NULL
))
123 return EFI_INVALID_PARAMETER
;
126 Status
= AmlCloneNode (Node
, &HeadNode
);
127 if (EFI_ERROR (Status
)) {
132 // Clone the fixed arguments and bind them to their parent.
133 MaxIndex
= (EAML_PARSE_INDEX
)AmlGetFixedArgumentCount (
134 (AML_OBJECT_NODE
*)Node
136 for (Index
= EAmlParseIndexTerm0
; Index
< MaxIndex
; Index
++) {
137 FixedArgNode
= AmlGetFixedArgument ((AML_OBJECT_NODE
*)Node
, Index
);
138 if (FixedArgNode
== NULL
) {
139 Status
= EFI_INVALID_PARAMETER
;
145 Status
= AmlCloneTree (
149 if (EFI_ERROR (Status
)) {
155 Status
= AmlSetFixedArgument (
156 (AML_OBJECT_NODE
*)HeadNode
,
160 if (EFI_ERROR (Status
)) {
161 AmlDeleteTree (ClonedChildNode
);
167 // Clone the variable arguments and bind them to their parent.
168 StartLink
= AmlNodeGetVariableArgList (Node
);
169 if (StartLink
!= NULL
) {
170 CurrentLink
= StartLink
->ForwardLink
;
171 while (CurrentLink
!= StartLink
) {
173 Status
= AmlCloneTree ((AML_NODE_HEADER
*)CurrentLink
, &ClonedChildNode
);
174 if (EFI_ERROR (Status
)) {
180 Status
= AmlVarListAddTailInternal (
184 if (EFI_ERROR (Status
)) {
185 AmlDeleteTree (ClonedChildNode
);
190 CurrentLink
= CurrentLink
->ForwardLink
;
194 *ClonedNode
= HeadNode
;
200 if (HeadNode
!= NULL
) {
201 AmlDeleteTree (HeadNode
);