aslexternal.c (4b49587c3dd54aed8eb103d838a89ca79484a9b6) aslexternal.c (6f1f1a6395c91c5a845727d7313921a6fe3d297b)
1/******************************************************************************
2 *
3 * Module Name: aslexternal - ASL External opcode compiler support
4 *
5 *****************************************************************************/
6
7/******************************************************************************
8 *

--- 195 unchanged lines hidden (view full) ---

204
205 ListOp = TrAllocateOp (PARSEOP_DEFAULT_ARG);
206
207 /* Store External node as child */
208
209 ListOp->Asl.Child = Op;
210 ListOp->Asl.Next = NULL;
211
1/******************************************************************************
2 *
3 * Module Name: aslexternal - ASL External opcode compiler support
4 *
5 *****************************************************************************/
6
7/******************************************************************************
8 *

--- 195 unchanged lines hidden (view full) ---

204
205 ListOp = TrAllocateOp (PARSEOP_DEFAULT_ARG);
206
207 /* Store External node as child */
208
209 ListOp->Asl.Child = Op;
210 ListOp->Asl.Next = NULL;
211
212 if (Gbl_ExternalsListHead)
212 if (AslGbl_ExternalsListHead)
213 {
214 /* Link new External to end of list */
215
213 {
214 /* Link new External to end of list */
215
216 Prev = Gbl_ExternalsListHead;
216 Prev = AslGbl_ExternalsListHead;
217 Next = Prev;
218 while (Next)
219 {
220 Prev = Next;
221 Next = Next->Asl.Next;
222 }
223
224 Prev->Asl.Next = ListOp;
225 }
226 else
227 {
217 Next = Prev;
218 while (Next)
219 {
220 Prev = Next;
221 Next = Next->Asl.Next;
222 }
223
224 Prev->Asl.Next = ListOp;
225 }
226 else
227 {
228 Gbl_ExternalsListHead = ListOp;
228 AslGbl_ExternalsListHead = ListOp;
229 }
230}
231
232
233/*******************************************************************************
234 *
235 * FUNCTION: ExInsertArgCount
236 *

--- 17 unchanged lines hidden (view full) ---

254 char * ExternalName;
255 char * CallName;
256 UINT16 ArgCount = 0;
257 ACPI_STATUS Status;
258
259
260 CallName = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE);
261
229 }
230}
231
232
233/*******************************************************************************
234 *
235 * FUNCTION: ExInsertArgCount
236 *

--- 17 unchanged lines hidden (view full) ---

254 char * ExternalName;
255 char * CallName;
256 UINT16 ArgCount = 0;
257 ACPI_STATUS Status;
258
259
260 CallName = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE);
261
262 Next = Gbl_ExternalsListHead;
262 Next = AslGbl_ExternalsListHead;
263 while (Next)
264 {
265 ArgCount = 0;
266
267 /* Skip if External node already handled */
268
269 if (Next->Asl.Child->Asl.CompileFlags & OP_VISITED)
270 {

--- 68 unchanged lines hidden (view full) ---

339 UINT32 Level,
340 void *Context)
341{
342
343 /* External list head saved in the definition block op */
344
345 if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)
346 {
263 while (Next)
264 {
265 ArgCount = 0;
266
267 /* Skip if External node already handled */
268
269 if (Next->Asl.Child->Asl.CompileFlags & OP_VISITED)
270 {

--- 68 unchanged lines hidden (view full) ---

339 UINT32 Level,
340 void *Context)
341{
342
343 /* External list head saved in the definition block op */
344
345 if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)
346 {
347 Gbl_ExternalsListHead = Op->Asl.Value.Arg;
347 AslGbl_ExternalsListHead = Op->Asl.Value.Arg;
348 }
349
348 }
349
350 if (!Gbl_ExternalsListHead)
350 if (!AslGbl_ExternalsListHead)
351 {
352 return (AE_OK);
353 }
354
355 if (Op->Asl.ParseOpcode != PARSEOP_METHODCALL)
356 {
357 return (AE_OK);
358 }

--- 37 unchanged lines hidden (view full) ---

396
397 if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)
398 {
399 /*
400 * Process any existing external list. (Support for
401 * multiple definition blocks in a single file/compile)
402 */
403 ExMoveExternals (Op);
351 {
352 return (AE_OK);
353 }
354
355 if (Op->Asl.ParseOpcode != PARSEOP_METHODCALL)
356 {
357 return (AE_OK);
358 }

--- 37 unchanged lines hidden (view full) ---

396
397 if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)
398 {
399 /*
400 * Process any existing external list. (Support for
401 * multiple definition blocks in a single file/compile)
402 */
403 ExMoveExternals (Op);
404 Gbl_ExternalsListHead = NULL;
404 AslGbl_ExternalsListHead = NULL;
405 }
406
407 return (AE_OK);
408}
409
410
411/*******************************************************************************
412 *

--- 21 unchanged lines hidden (view full) ---

434 ACPI_PARSE_OBJECT *Prev;
435 ACPI_PARSE_OBJECT *Next;
436 char *ExternalName;
437 ACPI_OBJECT_TYPE ObjType;
438 ACPI_STATUS Status;
439 UINT32 i;
440
441
405 }
406
407 return (AE_OK);
408}
409
410
411/*******************************************************************************
412 *

--- 21 unchanged lines hidden (view full) ---

434 ACPI_PARSE_OBJECT *Prev;
435 ACPI_PARSE_OBJECT *Next;
436 char *ExternalName;
437 ACPI_OBJECT_TYPE ObjType;
438 ACPI_STATUS Status;
439 UINT32 i;
440
441
442 if (!Gbl_ExternalsListHead)
442 if (!AslGbl_ExternalsListHead)
443 {
444 return;
445 }
446
447 /* Remove the External nodes from the tree */
448
443 {
444 return;
445 }
446
447 /* Remove the External nodes from the tree */
448
449 NextOp = Gbl_ExternalsListHead;
449 NextOp = AslGbl_ExternalsListHead;
450 while (NextOp)
451 {
452 /*
453 * The External is stored in child pointer of each node in the
454 * list
455 */
456 ExternalOp = NextOp->Asl.Child;
457

--- 57 unchanged lines hidden (view full) ---

515 {
516 /* External was the first child node */
517
518 ParentOp->Asl.Child = ExternalOp->Asl.Next;
519 }
520
521 Prev->Asl.Next = ExternalOp->Asl.Next;
522 ExternalOp->Asl.Next = NULL;
450 while (NextOp)
451 {
452 /*
453 * The External is stored in child pointer of each node in the
454 * list
455 */
456 ExternalOp = NextOp->Asl.Child;
457

--- 57 unchanged lines hidden (view full) ---

515 {
516 /* External was the first child node */
517
518 ParentOp->Asl.Child = ExternalOp->Asl.Next;
519 }
520
521 Prev->Asl.Next = ExternalOp->Asl.Next;
522 ExternalOp->Asl.Next = NULL;
523 ExternalOp->Asl.Parent = Gbl_ExternalsListHead;
523 ExternalOp->Asl.Parent = AslGbl_ExternalsListHead;
524
525 /* Point the External to the next in the list */
526
527 if (NextOp->Asl.Next)
528 {
529 ExternalOp->Asl.Next = NextOp->Asl.Next->Asl.Child;
530 }
531
532 NextOp = NextOp->Asl.Next;
533 }
534
535 /*
536 * Loop again to remove MethodObj Externals for which
537 * a MethodCall was not found (dead external reference)
538 */
524
525 /* Point the External to the next in the list */
526
527 if (NextOp->Asl.Next)
528 {
529 ExternalOp->Asl.Next = NextOp->Asl.Next->Asl.Child;
530 }
531
532 NextOp = NextOp->Asl.Next;
533 }
534
535 /*
536 * Loop again to remove MethodObj Externals for which
537 * a MethodCall was not found (dead external reference)
538 */
539 Prev = Gbl_ExternalsListHead->Asl.Child;
539 Prev = AslGbl_ExternalsListHead->Asl.Child;
540 Next = Prev;
541 while (Next)
542 {
543 ObjType = (ACPI_OBJECT_TYPE)
544 Next->Asl.Child->Asl.Next->Asl.Value.Integer;
545
546 if (ObjType == ACPI_TYPE_METHOD &&
547 !(Next->Asl.CompileFlags & OP_VISITED))
548 {
549 if (Next == Prev)
550 {
540 Next = Prev;
541 while (Next)
542 {
543 ObjType = (ACPI_OBJECT_TYPE)
544 Next->Asl.Child->Asl.Next->Asl.Value.Integer;
545
546 if (ObjType == ACPI_TYPE_METHOD &&
547 !(Next->Asl.CompileFlags & OP_VISITED))
548 {
549 if (Next == Prev)
550 {
551 Gbl_ExternalsListHead->Asl.Child = Next->Asl.Next;
551 AslGbl_ExternalsListHead->Asl.Child = Next->Asl.Next;
552 Next->Asl.Next = NULL;
552 Next->Asl.Next = NULL;
553 Prev = Gbl_ExternalsListHead->Asl.Child;
553 Prev = AslGbl_ExternalsListHead->Asl.Child;
554 Next = Prev;
555 continue;
556 }
557 else
558 {
559 Prev->Asl.Next = Next->Asl.Next;
560 Next->Asl.Next = NULL;
561 Next = Prev->Asl.Next;
562 continue;
563 }
564 }
565
566 Prev = Next;
567 Next = Next->Asl.Next;
568 }
569
570 /* If list is now empty, don't bother to make If (0) block */
571
554 Next = Prev;
555 continue;
556 }
557 else
558 {
559 Prev->Asl.Next = Next->Asl.Next;
560 Next->Asl.Next = NULL;
561 Next = Prev->Asl.Next;
562 continue;
563 }
564 }
565
566 Prev = Next;
567 Next = Next->Asl.Next;
568 }
569
570 /* If list is now empty, don't bother to make If (0) block */
571
572 if (!Gbl_ExternalsListHead->Asl.Child)
572 if (!AslGbl_ExternalsListHead->Asl.Child)
573 {
574 return;
575 }
576
577 /* Convert Gbl_ExternalsListHead parent to If(). */
578
573 {
574 return;
575 }
576
577 /* Convert Gbl_ExternalsListHead parent to If(). */
578
579 Gbl_ExternalsListHead->Asl.ParseOpcode = PARSEOP_IF;
580 Gbl_ExternalsListHead->Asl.AmlOpcode = AML_IF_OP;
581 Gbl_ExternalsListHead->Asl.CompileFlags = OP_AML_PACKAGE;
582 UtSetParseOpName (Gbl_ExternalsListHead);
579 AslGbl_ExternalsListHead->Asl.ParseOpcode = PARSEOP_IF;
580 AslGbl_ExternalsListHead->Asl.AmlOpcode = AML_IF_OP;
581 AslGbl_ExternalsListHead->Asl.CompileFlags = OP_AML_PACKAGE;
582 UtSetParseOpName (AslGbl_ExternalsListHead);
583
584 /* Create a Zero op for the If predicate */
585
586 PredicateOp = TrAllocateOp (PARSEOP_ZERO);
587 PredicateOp->Asl.AmlOpcode = AML_ZERO_OP;
588
583
584 /* Create a Zero op for the If predicate */
585
586 PredicateOp = TrAllocateOp (PARSEOP_ZERO);
587 PredicateOp->Asl.AmlOpcode = AML_ZERO_OP;
588
589 PredicateOp->Asl.Parent = Gbl_ExternalsListHead;
589 PredicateOp->Asl.Parent = AslGbl_ExternalsListHead;
590 PredicateOp->Asl.Child = NULL;
590 PredicateOp->Asl.Child = NULL;
591 PredicateOp->Asl.Next = Gbl_ExternalsListHead->Asl.Child;
592 Gbl_ExternalsListHead->Asl.Child = PredicateOp;
591 PredicateOp->Asl.Next = AslGbl_ExternalsListHead->Asl.Child;
592 AslGbl_ExternalsListHead->Asl.Child = PredicateOp;
593
594 /* Set line numbers (for listings, etc.) */
595
593
594 /* Set line numbers (for listings, etc.) */
595
596 Gbl_ExternalsListHead->Asl.LineNumber = 0;
597 Gbl_ExternalsListHead->Asl.LogicalLineNumber = 0;
596 AslGbl_ExternalsListHead->Asl.LineNumber = 0;
597 AslGbl_ExternalsListHead->Asl.LogicalLineNumber = 0;
598
599 PredicateOp->Asl.LineNumber = 0;
600 PredicateOp->Asl.LogicalLineNumber = 0;
601
602 /* Insert block back in the list */
603
604 Prev = DefinitionBlockOp->Asl.Child;
605 Next = Prev;

--- 5 unchanged lines hidden (view full) ---

611 Prev = Next;
612 Next = Prev->Asl.Next;
613 }
614
615 if (Next)
616 {
617 /* Definition Block is not empty */
618
598
599 PredicateOp->Asl.LineNumber = 0;
600 PredicateOp->Asl.LogicalLineNumber = 0;
601
602 /* Insert block back in the list */
603
604 Prev = DefinitionBlockOp->Asl.Child;
605 Next = Prev;

--- 5 unchanged lines hidden (view full) ---

611 Prev = Next;
612 Next = Prev->Asl.Next;
613 }
614
615 if (Next)
616 {
617 /* Definition Block is not empty */
618
619 Gbl_ExternalsListHead->Asl.Next = Next;
619 AslGbl_ExternalsListHead->Asl.Next = Next;
620 }
621 else
622 {
623 /* Definition Block is empty. */
624
620 }
621 else
622 {
623 /* Definition Block is empty. */
624
625 Gbl_ExternalsListHead->Asl.Next = NULL;
625 AslGbl_ExternalsListHead->Asl.Next = NULL;
626 }
627
626 }
627
628 Prev->Asl.Next = Gbl_ExternalsListHead;
629 Gbl_ExternalsListHead->Asl.Parent = Prev->Asl.Parent;
628 Prev->Asl.Next = AslGbl_ExternalsListHead;
629 AslGbl_ExternalsListHead->Asl.Parent = Prev->Asl.Parent;
630}
630}