00542 {
00543 ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr;
00544 const ACPI_PREDEFINED_INFO *Package;
00545 ACPI_OPERAND_OBJECT **Elements;
00546 ACPI_STATUS Status = AE_OK;
00547 UINT32 ExpectedCount;
00548 UINT32 Count;
00549 UINT32 i;
00550
00551
00552 ACPI_FUNCTION_NAME (NsCheckPackage);
00553
00554
00555
00556
00557 Package = Data->Predefined + 1;
00558
00559 ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
00560 "%s Validating return Package of Type %X, Count %X\n",
00561 Data->Pathname, Package->RetInfo.Type, ReturnObject->Package.Count));
00562
00563
00564
00565
00566
00567 AcpiNsRemoveNullElements (Data, Package->RetInfo.Type, ReturnObject);
00568
00569
00570
00571 Elements = ReturnObject->Package.Elements;
00572 Count = ReturnObject->Package.Count;
00573
00574
00575
00576 if (!Count)
00577 {
00578 ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags,
00579 "Return Package has no elements (empty)"));
00580
00581 return (AE_AML_OPERAND_VALUE);
00582 }
00583
00584
00585
00586
00587
00588
00589
00590 switch (Package->RetInfo.Type)
00591 {
00592 case ACPI_PTYPE1_FIXED:
00593
00594
00595
00596
00597
00598
00599
00600 ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
00601 if (Count < ExpectedCount)
00602 {
00603 goto PackageTooSmall;
00604 }
00605 else if (Count > ExpectedCount)
00606 {
00607 ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
00608 "%s: Return Package is larger than needed - "
00609 "found %u, expected %u\n",
00610 Data->Pathname, Count, ExpectedCount));
00611 }
00612
00613
00614
00615 Status = AcpiNsCheckPackageElements (Data, Elements,
00616 Package->RetInfo.ObjectType1, Package->RetInfo.Count1,
00617 Package->RetInfo.ObjectType2, Package->RetInfo.Count2, 0);
00618 break;
00619
00620
00621 case ACPI_PTYPE1_VAR:
00622
00623
00624
00625
00626
00627 for (i = 0; i < Count; i++)
00628 {
00629 Status = AcpiNsCheckObjectType (Data, Elements,
00630 Package->RetInfo.ObjectType1, i);
00631 if (ACPI_FAILURE (Status))
00632 {
00633 return (Status);
00634 }
00635 Elements++;
00636 }
00637 break;
00638
00639
00640 case ACPI_PTYPE1_OPTION:
00641
00642
00643
00644
00645
00646
00647
00648
00649 ExpectedCount = Package->RetInfo3.Count;
00650 if (Count < ExpectedCount)
00651 {
00652 goto PackageTooSmall;
00653 }
00654
00655
00656
00657 for (i = 0; i < Count; i++)
00658 {
00659 if (i < Package->RetInfo3.Count)
00660 {
00661
00662
00663 Status = AcpiNsCheckObjectType (Data, Elements,
00664 Package->RetInfo3.ObjectType[i], i);
00665 if (ACPI_FAILURE (Status))
00666 {
00667 return (Status);
00668 }
00669 }
00670 else
00671 {
00672
00673
00674 Status = AcpiNsCheckObjectType (Data, Elements,
00675 Package->RetInfo3.TailObjectType, i);
00676 if (ACPI_FAILURE (Status))
00677 {
00678 return (Status);
00679 }
00680 }
00681 Elements++;
00682 }
00683 break;
00684
00685
00686 case ACPI_PTYPE2_REV_FIXED:
00687
00688
00689
00690 Status = AcpiNsCheckObjectType (Data, Elements,
00691 ACPI_RTYPE_INTEGER, 0);
00692 if (ACPI_FAILURE (Status))
00693 {
00694 return (Status);
00695 }
00696
00697 Elements++;
00698 Count--;
00699
00700
00701
00702 Status = AcpiNsCheckPackageList (Data, Package, Elements, Count);
00703 break;
00704
00705
00706 case ACPI_PTYPE2_PKG_COUNT:
00707
00708
00709
00710 Status = AcpiNsCheckObjectType (Data, Elements,
00711 ACPI_RTYPE_INTEGER, 0);
00712 if (ACPI_FAILURE (Status))
00713 {
00714 return (Status);
00715 }
00716
00717
00718
00719
00720
00721 ExpectedCount = (UINT32) (*Elements)->Integer.Value;
00722 if (ExpectedCount >= Count)
00723 {
00724 goto PackageTooSmall;
00725 }
00726
00727 Count = ExpectedCount;
00728 Elements++;
00729
00730
00731
00732 Status = AcpiNsCheckPackageList (Data, Package, Elements, Count);
00733 break;
00734
00735
00736 case ACPI_PTYPE2:
00737 case ACPI_PTYPE2_FIXED:
00738 case ACPI_PTYPE2_MIN:
00739 case ACPI_PTYPE2_COUNT:
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751 if (*Elements && ((*Elements)->Common.Type != ACPI_TYPE_PACKAGE))
00752 {
00753
00754
00755 Status = AcpiNsRepairPackageList (Data, ReturnObjectPtr);
00756 if (ACPI_FAILURE (Status))
00757 {
00758 return (Status);
00759 }
00760
00761
00762
00763 ReturnObject = *ReturnObjectPtr;
00764 Elements = ReturnObject->Package.Elements;
00765 Count = 1;
00766 }
00767
00768
00769
00770 Status = AcpiNsCheckPackageList (Data, Package, Elements, Count);
00771 break;
00772
00773
00774 default:
00775
00776
00777
00778 ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags,
00779 "Invalid internal return type in table entry: %X",
00780 Package->RetInfo.Type));
00781
00782 return (AE_AML_INTERNAL);
00783 }
00784
00785 return (Status);
00786
00787
00788 PackageTooSmall:
00789
00790
00791
00792 ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags,
00793 "Return Package is too small - found %u elements, expected %u",
00794 Count, ExpectedCount));
00795
00796 return (AE_AML_OPERAND_VALUE);
00797 }