]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Acpi/AcpiTableDxe/AmlNamespace.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / AcpiTableDxe / AmlNamespace.c
CommitLineData
3dc8585e
JY
1/** @file\r
2 ACPI Sdt Protocol Driver\r
3\r
d1102dba 4 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved. <BR>\r
9d510e61 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
3dc8585e
JY
6\r
7**/\r
8\r
9#include "AcpiTable.h"\r
10\r
11/**\r
12 Construct node list according to the AML handle.\r
d1102dba 13\r
3dc8585e
JY
14 @param[in] AmlHandle AML handle.\r
15 @param[in] AmlRootNodeList AML root node list.\r
16 @param[in] AmlParentNodeList AML parent node list.\r
d1102dba 17\r
3dc8585e
JY
18 @retval EFI_SUCCESS Success.\r
19 @retval EFI_INVALID_PARAMETER AML handle does not refer to a valid ACPI object.\r
20**/\r
21EFI_STATUS\r
22AmlConstructNodeList (\r
1436aea4
MK
23 IN EFI_AML_HANDLE *AmlHandle,\r
24 IN EFI_AML_NODE_LIST *AmlRootNodeList,\r
25 IN EFI_AML_NODE_LIST *AmlParentNodeList\r
3dc8585e
JY
26 );\r
27\r
28/**\r
29 Create AML Node.\r
d1102dba 30\r
3dc8585e
JY
31 @param[in] NameSeg AML NameSeg.\r
32 @param[in] Parent AML parent node list.\r
33 @param[in] AmlByteEncoding AML Byte Encoding.\r
d1102dba 34\r
3dc8585e
JY
35 @return AML Node.\r
36**/\r
37EFI_AML_NODE_LIST *\r
38AmlCreateNode (\r
39 IN UINT8 *NameSeg,\r
40 IN EFI_AML_NODE_LIST *Parent,\r
41 IN AML_BYTE_ENCODING *AmlByteEncoding\r
42 )\r
43{\r
1436aea4 44 EFI_AML_NODE_LIST *AmlNodeList;\r
3dc8585e 45\r
1436aea4 46 AmlNodeList = AllocatePool (sizeof (*AmlNodeList));\r
3dc8585e
JY
47 ASSERT (AmlNodeList != NULL);\r
48\r
49 AmlNodeList->Signature = EFI_AML_NODE_LIST_SIGNATURE;\r
50 CopyMem (AmlNodeList->Name, NameSeg, AML_NAME_SEG_SIZE);\r
1436aea4
MK
51 AmlNodeList->Buffer = NULL;\r
52 AmlNodeList->Size = 0;\r
3dc8585e
JY
53 InitializeListHead (&AmlNodeList->Link);\r
54 InitializeListHead (&AmlNodeList->Children);\r
1436aea4 55 AmlNodeList->Parent = Parent;\r
3dc8585e
JY
56 AmlNodeList->AmlByteEncoding = AmlByteEncoding;\r
57\r
58 return AmlNodeList;\r
59}\r
60\r
61/**\r
62 Find the AML NameSeg in the children of AmlParentNodeList.\r
d1102dba 63\r
3dc8585e
JY
64 @param[in] NameSeg AML NameSeg.\r
65 @param[in] AmlParentNodeList AML parent node list.\r
66 @param[in] Create TRUE means to create node if not found.\r
d1102dba 67\r
3dc8585e
JY
68 @return AmlChildNode whoes name is same as NameSeg.\r
69**/\r
70EFI_AML_NODE_LIST *\r
71AmlFindNodeInThis (\r
1436aea4
MK
72 IN UINT8 *NameSeg,\r
73 IN EFI_AML_NODE_LIST *AmlParentNodeList,\r
74 IN BOOLEAN Create\r
3dc8585e
JY
75 )\r
76{\r
1436aea4
MK
77 EFI_AML_NODE_LIST *CurrentAmlNodeList;\r
78 LIST_ENTRY *CurrentLink;\r
79 LIST_ENTRY *StartLink;\r
80 EFI_AML_NODE_LIST *AmlNodeList;\r
3dc8585e
JY
81\r
82 StartLink = &AmlParentNodeList->Children;\r
83 CurrentLink = StartLink->ForwardLink;\r
84\r
85 while (CurrentLink != StartLink) {\r
86 CurrentAmlNodeList = EFI_AML_NODE_LIST_FROM_LINK (CurrentLink);\r
87 //\r
88 // AML name is same as the one stored\r
89 //\r
90 if (CompareMem (CurrentAmlNodeList->Name, NameSeg, AML_NAME_SEG_SIZE) == 0) {\r
91 //\r
92 // Good! Found it\r
93 //\r
94 return CurrentAmlNodeList;\r
95 }\r
1436aea4 96\r
3dc8585e
JY
97 CurrentLink = CurrentLink->ForwardLink;\r
98 }\r
99\r
100 //\r
101 // Not found\r
102 //\r
103 if (!Create) {\r
104 return NULL;\r
105 }\r
106\r
107 //\r
108 // Create new node with NULL buffer - it means namespace not be returned.\r
109 //\r
110 AmlNodeList = AmlCreateNode (NameSeg, AmlParentNodeList, NULL);\r
111 InsertTailList (&AmlParentNodeList->Children, &AmlNodeList->Link);\r
112\r
113 return AmlNodeList;\r
114}\r
115\r
116/**\r
117 Find the AML NameString in the children of AmlParentNodeList or AmlRootNodeList.\r
d1102dba 118\r
3dc8585e
JY
119 @param[in] NameString AML NameString.\r
120 @param[in] AmlRootNodeList AML root node list.\r
121 @param[in] AmlParentNodeList AML parent node list.\r
122 @param[in] Create TRUE means to create node if not found.\r
d1102dba 123\r
3dc8585e
JY
124 @return AmlChildNode whoes name is same as NameSeg.\r
125**/\r
126EFI_AML_NODE_LIST *\r
127AmlFindNodeInTheTree (\r
1436aea4
MK
128 IN UINT8 *NameString,\r
129 IN EFI_AML_NODE_LIST *AmlRootNodeList,\r
130 IN EFI_AML_NODE_LIST *AmlParentNodeList,\r
131 IN BOOLEAN Create\r
3dc8585e
JY
132 )\r
133{\r
1436aea4
MK
134 UINT8 *Buffer;\r
135 EFI_AML_NODE_LIST *AmlNodeList;\r
136 EFI_AML_NODE_LIST *AmlCurrentNodeList;\r
137 UINT8 Index;\r
138 UINT8 SegCount;\r
3dc8585e
JY
139\r
140 Buffer = NameString;\r
141\r
142 //\r
143 // Handle root or parent prefix\r
144 //\r
145 if (*Buffer == AML_ROOT_CHAR) {\r
146 AmlCurrentNodeList = AmlRootNodeList;\r
1436aea4 147 Buffer += 1;\r
3dc8585e
JY
148 } else if (*Buffer == AML_PARENT_PREFIX_CHAR) {\r
149 AmlCurrentNodeList = AmlParentNodeList;\r
150 do {\r
151 if (AmlCurrentNodeList->Parent != NULL) {\r
152 AmlCurrentNodeList = AmlCurrentNodeList->Parent;\r
153 } else {\r
154 //\r
155 // Only root has no parent\r
156 //\r
157 ASSERT (AmlCurrentNodeList == AmlRootNodeList);\r
158 }\r
1436aea4 159\r
3dc8585e
JY
160 Buffer += 1;\r
161 } while (*Buffer == AML_PARENT_PREFIX_CHAR);\r
162 } else {\r
163 AmlCurrentNodeList = AmlParentNodeList;\r
164 }\r
d1102dba 165\r
3dc8585e
JY
166 //\r
167 // Handle name segment\r
168 //\r
169 if (*Buffer == AML_DUAL_NAME_PREFIX) {\r
1436aea4 170 Buffer += 1;\r
3dc8585e
JY
171 SegCount = 2;\r
172 } else if (*Buffer == AML_MULTI_NAME_PREFIX) {\r
1436aea4 173 Buffer += 1;\r
3dc8585e 174 SegCount = *Buffer;\r
1436aea4 175 Buffer += 1;\r
3dc8585e
JY
176 } else if (*Buffer == 0) {\r
177 //\r
178 // NULL name, only for Root\r
179 //\r
180 ASSERT (AmlCurrentNodeList == AmlRootNodeList);\r
181 return AmlCurrentNodeList;\r
182 } else {\r
183 SegCount = 1;\r
184 }\r
185\r
186 //\r
187 // Handle NamePath\r
188 //\r
189 Index = 0;\r
190 do {\r
191 AmlNodeList = AmlFindNodeInThis (Buffer, AmlCurrentNodeList, Create);\r
192 if (AmlNodeList == NULL) {\r
193 return NULL;\r
194 }\r
1436aea4 195\r
3dc8585e 196 AmlCurrentNodeList = AmlNodeList;\r
1436aea4
MK
197 Buffer += AML_NAME_SEG_SIZE;\r
198 Index++;\r
3dc8585e
JY
199 } while (Index < SegCount);\r
200\r
201 return AmlNodeList;\r
202}\r
203\r
204/**\r
205 Insert the NameString to the AmlNodeList.\r
d1102dba 206\r
3dc8585e
JY
207 @param[in] NameString AML NameString.\r
208 @param[in] Buffer Buffer for the Node.\r
209 @param[in] Size Size for the Node.\r
210 @param[in] AmlRootNodeList AML root node list.\r
211 @param[in] AmlParentNodeList AML parent node list.\r
d1102dba 212\r
3dc8585e
JY
213 @return AmlChildNode whoes name is NameString.\r
214**/\r
215EFI_AML_NODE_LIST *\r
216AmlInsertNodeToTree (\r
1436aea4
MK
217 IN UINT8 *NameString,\r
218 IN VOID *Buffer,\r
219 IN UINTN Size,\r
220 IN EFI_AML_NODE_LIST *AmlRootNodeList,\r
221 IN EFI_AML_NODE_LIST *AmlParentNodeList\r
3dc8585e
JY
222 )\r
223{\r
1436aea4 224 EFI_AML_NODE_LIST *AmlNodeList;\r
3dc8585e
JY
225\r
226 AmlNodeList = AmlFindNodeInTheTree (\r
227 NameString,\r
228 AmlRootNodeList,\r
229 AmlParentNodeList,\r
230 TRUE // Find and Create\r
231 );\r
232 ASSERT (AmlNodeList != NULL);\r
233 if (AmlNodeList == NULL) {\r
234 return NULL;\r
235 }\r
236\r
237 //\r
238 // Check buffer\r
239 //\r
240 if (AmlNodeList->Buffer == NULL) {\r
241 //\r
242 // NULL means new added one or SCOPE_OP\r
243 //\r
244 if (*(UINT8 *)Buffer != AML_SCOPE_OP) {\r
245 //\r
246 // We need check if new one is SCOPE_OP, because SCOPE_OP just means namespace, not a real device.\r
247 // We should not return SCOPE_OP.\r
248 //\r
1436aea4
MK
249 AmlNodeList->Buffer = Buffer;\r
250 AmlNodeList->Size = Size;\r
3dc8585e
JY
251 AmlNodeList->AmlByteEncoding = AmlSearchByOpByte (Buffer);\r
252 }\r
1436aea4 253\r
3dc8585e
JY
254 return AmlNodeList;\r
255 }\r
256\r
257 //\r
258 // Already added\r
259 //\r
260 if (*(UINT8 *)Buffer == AML_SCOPE_OP) {\r
261 //\r
262 // The new one is SCOPE_OP, OK just return;\r
263 //\r
264 return AmlNodeList;\r
265 }\r
266\r
267 //\r
268 // Oops!!!, There must be something wrong.\r
269 //\r
87000d77
MK
270 DEBUG ((DEBUG_ERROR, "AML: Override Happen - %a!\n", NameString));\r
271 DEBUG ((DEBUG_ERROR, "AML: Existing Node - %x\n", AmlNodeList->Buffer));\r
272 DEBUG ((DEBUG_ERROR, "AML: New Buffer - %x\n", Buffer));\r
3dc8585e
JY
273\r
274 return NULL;\r
275}\r
276\r
277/**\r
278 Construct child node list according to the AML handle.\r
d1102dba 279\r
3dc8585e
JY
280 @param[in] AmlHandle AML handle.\r
281 @param[in] AmlRootNodeList AML root node list.\r
282 @param[in] AmlParentNodeList AML parent node list.\r
d1102dba 283\r
3dc8585e
JY
284 @retval EFI_SUCCESS Success.\r
285 @retval EFI_INVALID_PARAMETER AML handle does not refer to a valid ACPI object.\r
286**/\r
287EFI_STATUS\r
288AmlConstructNodeListForChild (\r
1436aea4
MK
289 IN EFI_AML_HANDLE *AmlHandle,\r
290 IN EFI_AML_NODE_LIST *AmlRootNodeList,\r
291 IN EFI_AML_NODE_LIST *AmlParentNodeList\r
3dc8585e
JY
292 )\r
293{\r
1436aea4
MK
294 AML_BYTE_ENCODING *AmlByteEncoding;\r
295 UINT8 *Buffer;\r
296 UINTN BufferSize;\r
297 UINT8 *CurrentBuffer;\r
298 EFI_AML_HANDLE *AmlChildHandle;\r
299 EFI_STATUS Status;\r
3dc8585e 300\r
4e1005ec
ED
301 CurrentBuffer = NULL;\r
302 AmlChildHandle = NULL;\r
3dc8585e
JY
303 AmlByteEncoding = AmlHandle->AmlByteEncoding;\r
304 Buffer = AmlHandle->Buffer;\r
305 BufferSize = AmlHandle->Size;\r
306\r
307 //\r
308 // Check if we need recursively add node\r
309 //\r
310 if ((AmlByteEncoding->Attribute & AML_HAS_CHILD_OBJ) == 0) {\r
311 //\r
312 // No more node need to be added\r
313 //\r
314 return EFI_SUCCESS;\r
315 }\r
316\r
317 //\r
318 // Do we need add node within METHOD?\r
319 // Yes, just add Object is OK. But we need filter NameString for METHOD invoke.\r
320 //\r
321\r
322 //\r
323 // Now, we get the last node.\r
324 //\r
325 Status = AmlGetOffsetAfterLastOption (AmlHandle, &CurrentBuffer);\r
326 if (EFI_ERROR (Status)) {\r
327 return EFI_INVALID_PARAMETER;\r
328 }\r
329\r
330 //\r
331 // Go through all the reset buffer.\r
332 //\r
333 while ((UINTN)CurrentBuffer < (UINTN)Buffer + BufferSize) {\r
334 //\r
335 // Find the child node.\r
336 //\r
337 Status = SdtOpenEx (CurrentBuffer, (UINTN)Buffer + BufferSize - (UINTN)CurrentBuffer, (EFI_ACPI_HANDLE *)&AmlChildHandle);\r
338 if (EFI_ERROR (Status)) {\r
339 //\r
340 // No child found, break now.\r
341 //\r
342 break;\r
343 }\r
344\r
345 //\r
346 // Good, find the child. Construct node recursively\r
347 //\r
348 Status = AmlConstructNodeList (\r
349 AmlChildHandle,\r
350 AmlRootNodeList,\r
351 AmlParentNodeList\r
352 );\r
353 if (EFI_ERROR (Status)) {\r
354 break;\r
355 }\r
356\r
357 //\r
358 // Parse next one\r
359 //\r
360 CurrentBuffer += AmlChildHandle->Size;\r
361\r
362 Close ((EFI_ACPI_HANDLE)AmlChildHandle);\r
363 }\r
364\r
365 return EFI_SUCCESS;\r
366}\r
367\r
368/**\r
369 Construct node list according to the AML handle.\r
d1102dba 370\r
3dc8585e
JY
371 @param[in] AmlHandle AML handle.\r
372 @param[in] AmlRootNodeList AML root node list.\r
373 @param[in] AmlParentNodeList AML parent node list.\r
d1102dba 374\r
3dc8585e
JY
375 @retval EFI_SUCCESS Success.\r
376 @retval EFI_INVALID_PARAMETER AML handle does not refer to a valid ACPI object.\r
377**/\r
378EFI_STATUS\r
379AmlConstructNodeList (\r
1436aea4
MK
380 IN EFI_AML_HANDLE *AmlHandle,\r
381 IN EFI_AML_NODE_LIST *AmlRootNodeList,\r
382 IN EFI_AML_NODE_LIST *AmlParentNodeList\r
3dc8585e
JY
383 )\r
384{\r
1436aea4
MK
385 VOID *NameString;\r
386 EFI_AML_NODE_LIST *AmlNodeList;\r
3dc8585e
JY
387\r
388 //\r
389 // 1. Check if there is need to construct node for this OpCode.\r
390 //\r
391 if ((AmlHandle->AmlByteEncoding->Attribute & AML_IN_NAMESPACE) == 0) {\r
392 //\r
393 // No need to construct node, so we just skip this OpCode.\r
394 //\r
395 return EFI_SUCCESS;\r
396 }\r
397\r
398 //\r
399 // 2. Now, we need construct node for this OpCode.\r
400 //\r
401 NameString = AmlGetObjectName (AmlHandle);\r
402 if (NameString == NULL) {\r
403 return EFI_INVALID_PARAMETER;\r
404 }\r
405\r
406 //\r
407 // Now, we need to insert node to the node list.\r
408 // NOTE: The name here could be AML NameString. So the callee need parse it.\r
409 //\r
410 AmlNodeList = AmlInsertNodeToTree (NameString, AmlHandle->Buffer, AmlHandle->Size, AmlRootNodeList, AmlParentNodeList);\r
411 ASSERT (AmlNodeList != NULL);\r
412\r
413 //\r
414 // 3. Ok, we need to parse the object list to see if there are more node to be added.\r
415 //\r
416 return AmlConstructNodeListForChild (AmlHandle, AmlRootNodeList, AmlNodeList);\r
417}\r
418\r
419/**\r
420 Destruct node list\r
d1102dba 421\r
3dc8585e
JY
422 @param[in] AmlParentNodeList AML parent node list.\r
423**/\r
424VOID\r
425AmlDestructNodeList (\r
1436aea4 426 IN EFI_AML_NODE_LIST *AmlParentNodeList\r
3dc8585e
JY
427 )\r
428{\r
1436aea4
MK
429 EFI_AML_NODE_LIST *CurrentAmlNodeList;\r
430 LIST_ENTRY *CurrentLink;\r
431 LIST_ENTRY *StartLink;\r
3dc8585e
JY
432\r
433 //\r
434 // Get the children link\r
435 //\r
436 StartLink = &AmlParentNodeList->Children;\r
437 CurrentLink = StartLink->ForwardLink;\r
438\r
439 //\r
440 // Go through all the children\r
441 //\r
442 while (CurrentLink != StartLink) {\r
443 //\r
444 // Destruct the child's list recursively\r
445 //\r
446 CurrentAmlNodeList = EFI_AML_NODE_LIST_FROM_LINK (CurrentLink);\r
1436aea4 447 CurrentLink = CurrentLink->ForwardLink;\r
3dc8585e
JY
448\r
449 //\r
450 // Remove this child from list and free the node\r
451 //\r
452 RemoveEntryList (&(CurrentAmlNodeList->Link));\r
453\r
454 AmlDestructNodeList (CurrentAmlNodeList);\r
455 }\r
456\r
457 //\r
458 // Done.\r
459 //\r
460 FreePool (AmlParentNodeList);\r
1436aea4 461 return;\r
3dc8585e
JY
462}\r
463\r
464/**\r
465 Dump node list\r
d1102dba 466\r
3dc8585e
JY
467 @param[in] AmlParentNodeList AML parent node list.\r
468 @param[in] Level Output debug level.\r
469**/\r
470VOID\r
471AmlDumpNodeInfo (\r
1436aea4
MK
472 IN EFI_AML_NODE_LIST *AmlParentNodeList,\r
473 IN UINTN Level\r
3dc8585e
JY
474 )\r
475{\r
1436aea4
MK
476 EFI_AML_NODE_LIST *CurrentAmlNodeList;\r
477 volatile LIST_ENTRY *CurrentLink;\r
478 UINTN Index;\r
3dc8585e
JY
479\r
480 CurrentLink = AmlParentNodeList->Children.ForwardLink;\r
481\r
482 if (Level == 0) {\r
87000d77 483 DEBUG ((DEBUG_ERROR, "\\"));\r
3dc8585e
JY
484 } else {\r
485 for (Index = 0; Index < Level; Index++) {\r
87000d77 486 DEBUG ((DEBUG_ERROR, " "));\r
3dc8585e 487 }\r
1436aea4 488\r
3dc8585e
JY
489 AmlPrintNameSeg (AmlParentNodeList->Name);\r
490 }\r
1436aea4 491\r
87000d77 492 DEBUG ((DEBUG_ERROR, "\n"));\r
3dc8585e
JY
493\r
494 while (CurrentLink != &AmlParentNodeList->Children) {\r
495 CurrentAmlNodeList = EFI_AML_NODE_LIST_FROM_LINK (CurrentLink);\r
496 AmlDumpNodeInfo (CurrentAmlNodeList, Level + 1);\r
497 CurrentLink = CurrentLink->ForwardLink;\r
498 }\r
499\r
1436aea4 500 return;\r
3dc8585e
JY
501}\r
502\r
503/**\r
504 Returns the handle of the ACPI object representing the specified ACPI AML path\r
d1102dba 505\r
3dc8585e
JY
506 @param[in] AmlHandle Points to the handle of the object representing the starting point for the path search.\r
507 @param[in] AmlPath Points to the ACPI AML path.\r
508 @param[out] Buffer On return, points to the ACPI object which represents AcpiPath, relative to\r
509 HandleIn.\r
510 @param[in] FromRoot TRUE means to find AML path from \ (Root) Node.\r
511 FALSE means to find AML path from this Node (The HandleIn).\r
d1102dba 512\r
3dc8585e 513 @retval EFI_SUCCESS Success\r
d1102dba 514 @retval EFI_INVALID_PARAMETER HandleIn does not refer to a valid ACPI object.\r
3dc8585e
JY
515**/\r
516EFI_STATUS\r
517AmlFindPath (\r
518 IN EFI_AML_HANDLE *AmlHandle,\r
519 IN UINT8 *AmlPath,\r
520 OUT VOID **Buffer,\r
521 IN BOOLEAN FromRoot\r
522 )\r
523{\r
1436aea4
MK
524 EFI_AML_NODE_LIST *AmlRootNodeList;\r
525 EFI_STATUS Status;\r
526 EFI_AML_NODE_LIST *AmlNodeList;\r
527 UINT8 RootNameSeg[AML_NAME_SEG_SIZE];\r
528 EFI_AML_NODE_LIST *CurrentAmlNodeList;\r
529 LIST_ENTRY *CurrentLink;\r
3dc8585e
JY
530\r
531 //\r
532 // 1. create tree\r
533 //\r
534\r
535 //\r
536 // Create root handle\r
537 //\r
1436aea4
MK
538 RootNameSeg[0] = AML_ROOT_CHAR;\r
539 RootNameSeg[1] = 0;\r
3dc8585e
JY
540 AmlRootNodeList = AmlCreateNode (RootNameSeg, NULL, AmlHandle->AmlByteEncoding);\r
541\r
542 Status = AmlConstructNodeList (\r
543 AmlHandle,\r
544 AmlRootNodeList, // Root\r
545 AmlRootNodeList // Parent\r
546 );\r
547 if (EFI_ERROR (Status)) {\r
548 return EFI_INVALID_PARAMETER;\r
549 }\r
550\r
551 DEBUG_CODE_BEGIN ();\r
87000d77 552 DEBUG ((DEBUG_ERROR, "AcpiSdt: NameSpace:\n"));\r
3dc8585e
JY
553 AmlDumpNodeInfo (AmlRootNodeList, 0);\r
554 DEBUG_CODE_END ();\r
555\r
556 //\r
557 // 2. Search the node in the tree\r
558 //\r
559 if (FromRoot) {\r
560 //\r
561 // Search from Root\r
562 //\r
563 CurrentAmlNodeList = AmlRootNodeList;\r
564 } else {\r
565 //\r
566 // Search from this node, NOT ROOT.\r
567 // Since we insert node to ROOT one by one, we just get the first node and search from it.\r
568 //\r
569 CurrentLink = AmlRootNodeList->Children.ForwardLink;\r
570 if (CurrentLink != &AmlRootNodeList->Children) {\r
571 //\r
572 // First node\r
573 //\r
574 CurrentAmlNodeList = EFI_AML_NODE_LIST_FROM_LINK (CurrentLink);\r
575 } else {\r
576 //\r
577 // No child\r
578 //\r
579 CurrentAmlNodeList = NULL;\r
580 }\r
581 }\r
582\r
583 //\r
584 // Search\r
585 //\r
586 if (CurrentAmlNodeList != NULL) {\r
587 DEBUG_CODE_BEGIN ();\r
87000d77 588 DEBUG ((DEBUG_ERROR, "AcpiSdt: Search from: \\"));\r
3dc8585e 589 AmlPrintNameSeg (CurrentAmlNodeList->Name);\r
87000d77 590 DEBUG ((DEBUG_ERROR, "\n"));\r
3dc8585e
JY
591 DEBUG_CODE_END ();\r
592 AmlNodeList = AmlFindNodeInTheTree (\r
593 AmlPath,\r
594 AmlRootNodeList, // Root\r
595 CurrentAmlNodeList, // Parent\r
596 FALSE\r
597 );\r
598 } else {\r
599 AmlNodeList = NULL;\r
600 }\r
601\r
602 *Buffer = NULL;\r
1436aea4
MK
603 Status = EFI_SUCCESS;\r
604 if ((AmlNodeList != NULL) && (AmlNodeList->Buffer != NULL)) {\r
3dc8585e
JY
605 *Buffer = AmlNodeList->Buffer;\r
606 }\r
607\r
608 //\r
609 // 3. free the tree\r
610 //\r
611 AmlDestructNodeList (AmlRootNodeList);\r
612\r
613 return Status;\r
614}\r