nspredef.c (199337) | nspredef.c (200553) |
---|---|
1/****************************************************************************** 2 * 3 * Module Name: nspredef - Validation of ACPI predefined methods and objects 4 * 5 *****************************************************************************/ 6 7/****************************************************************************** 8 * --- 299 unchanged lines hidden (view full) --- 308 { 309 goto Cleanup; 310 } 311 Data->Predefined = Predefined; 312 Data->NodeFlags = Node->Flags; 313 Data->Pathname = Pathname; 314 315 /* | 1/****************************************************************************** 2 * 3 * Module Name: nspredef - Validation of ACPI predefined methods and objects 4 * 5 *****************************************************************************/ 6 7/****************************************************************************** 8 * --- 299 unchanged lines hidden (view full) --- 308 { 309 goto Cleanup; 310 } 311 Data->Predefined = Predefined; 312 Data->NodeFlags = Node->Flags; 313 Data->Pathname = Pathname; 314 315 /* |
316 * Check that the type of the return object is what is expected for 317 * this predefined name | 316 * Check that the type of the main return object is what is expected 317 * for this predefined name |
318 */ 319 Status = AcpiNsCheckObjectType (Data, ReturnObjectPtr, 320 Predefined->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT); 321 if (ACPI_FAILURE (Status)) 322 { | 318 */ 319 Status = AcpiNsCheckObjectType (Data, ReturnObjectPtr, 320 Predefined->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT); 321 if (ACPI_FAILURE (Status)) 322 { |
323 goto CheckValidationStatus; | 323 goto Exit; |
324 } 325 | 324 } 325 |
326 /* For returned Package objects, check the type of all sub-objects */ 327 328 if (ReturnObject->Common.Type == ACPI_TYPE_PACKAGE) | 326 /* 327 * For returned Package objects, check the type of all sub-objects. 328 * Note: Package may have been newly created by call above. 329 */ 330 if ((*ReturnObjectPtr)->Common.Type == ACPI_TYPE_PACKAGE) |
329 { 330 Status = AcpiNsCheckPackage (Data, ReturnObjectPtr); | 331 { 332 Status = AcpiNsCheckPackage (Data, ReturnObjectPtr); |
333 if (ACPI_FAILURE (Status)) 334 { 335 goto Exit; 336 } |
|
331 } 332 333 /* | 337 } 338 339 /* |
334 * Perform additional, more complicated repairs on a per-name 335 * basis. | 340 * The return object was OK, or it was successfully repaired above. 341 * Now make some additional checks such as verifying that package 342 * objects are sorted correctly (if required) or buffer objects have 343 * the correct data width (bytes vs. dwords). These repairs are 344 * performed on a per-name basis, i.e., the code is specific to 345 * particular predefined names. |
336 */ 337 Status = AcpiNsComplexRepairs (Data, Node, Status, ReturnObjectPtr); 338 | 346 */ 347 Status = AcpiNsComplexRepairs (Data, Node, Status, ReturnObjectPtr); 348 |
339 340CheckValidationStatus: | 349Exit: |
341 /* 342 * If the object validation failed or if we successfully repaired one 343 * or more objects, mark the parent node to suppress further warning 344 * messages during the next evaluation of the same method/object. 345 */ 346 if (ACPI_FAILURE (Status) || (Data->Flags & ACPI_OBJECT_REPAIRED)) 347 { 348 Node->Flags |= ANOBJ_EVALUATED; 349 } 350 ACPI_FREE (Data); 351 | 350 /* 351 * If the object validation failed or if we successfully repaired one 352 * or more objects, mark the parent node to suppress further warning 353 * messages during the next evaluation of the same method/object. 354 */ 355 if (ACPI_FAILURE (Status) || (Data->Flags & ACPI_OBJECT_REPAIRED)) 356 { 357 Node->Flags |= ANOBJ_EVALUATED; 358 } 359 ACPI_FREE (Data); 360 |
352 | |
353Cleanup: 354 ACPI_FREE (Pathname); 355 return (Status); 356} 357 358 359/******************************************************************************* 360 * --- 178 unchanged lines hidden (view full) --- 539 /* The package info for this name is in the next table entry */ 540 541 Package = Data->Predefined + 1; 542 543 ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, 544 "%s Validating return Package of Type %X, Count %X\n", 545 Data->Pathname, Package->RetInfo.Type, ReturnObject->Package.Count)); 546 | 361Cleanup: 362 ACPI_FREE (Pathname); 363 return (Status); 364} 365 366 367/******************************************************************************* 368 * --- 178 unchanged lines hidden (view full) --- 547 /* The package info for this name is in the next table entry */ 548 549 Package = Data->Predefined + 1; 550 551 ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, 552 "%s Validating return Package of Type %X, Count %X\n", 553 Data->Pathname, Package->RetInfo.Type, ReturnObject->Package.Count)); 554 |
555 /* 556 * For variable-length Packages, we can safely remove all embedded 557 * and trailing NULL package elements 558 */ 559 AcpiNsRemoveNullElements (Data, Package->RetInfo.Type, ReturnObject); 560 |
|
547 /* Extract package count and elements array */ 548 549 Elements = ReturnObject->Package.Elements; 550 Count = ReturnObject->Package.Count; 551 552 /* The package must have at least one element, else invalid */ 553 554 if (!Count) --- 22 unchanged lines hidden (view full) --- 577 */ 578 ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; 579 if (Count < ExpectedCount) 580 { 581 goto PackageTooSmall; 582 } 583 else if (Count > ExpectedCount) 584 { | 561 /* Extract package count and elements array */ 562 563 Elements = ReturnObject->Package.Elements; 564 Count = ReturnObject->Package.Count; 565 566 /* The package must have at least one element, else invalid */ 567 568 if (!Count) --- 22 unchanged lines hidden (view full) --- 591 */ 592 ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; 593 if (Count < ExpectedCount) 594 { 595 goto PackageTooSmall; 596 } 597 else if (Count > ExpectedCount) 598 { |
585 ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 586 "Return Package is larger than needed - " 587 "found %u, expected %u", Count, ExpectedCount)); | 599 ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, 600 "%s: Return Package is larger than needed - " 601 "found %u, expected %u\n", 602 Data->Pathname, Count, ExpectedCount)); |
588 } 589 590 /* Validate all elements of the returned package */ 591 592 Status = AcpiNsCheckPackageElements (Data, Elements, 593 Package->RetInfo.ObjectType1, Package->RetInfo.Count1, 594 Package->RetInfo.ObjectType2, Package->RetInfo.Count2, 0); 595 break; --- 199 unchanged lines hidden (view full) --- 795 ACPI_PREDEFINED_DATA *Data, 796 const ACPI_PREDEFINED_INFO *Package, 797 ACPI_OPERAND_OBJECT **Elements, 798 UINT32 Count) 799{ 800 ACPI_OPERAND_OBJECT *SubPackage; 801 ACPI_OPERAND_OBJECT **SubElements; 802 ACPI_STATUS Status; | 603 } 604 605 /* Validate all elements of the returned package */ 606 607 Status = AcpiNsCheckPackageElements (Data, Elements, 608 Package->RetInfo.ObjectType1, Package->RetInfo.Count1, 609 Package->RetInfo.ObjectType2, Package->RetInfo.Count2, 0); 610 break; --- 199 unchanged lines hidden (view full) --- 810 ACPI_PREDEFINED_DATA *Data, 811 const ACPI_PREDEFINED_INFO *Package, 812 ACPI_OPERAND_OBJECT **Elements, 813 UINT32 Count) 814{ 815 ACPI_OPERAND_OBJECT *SubPackage; 816 ACPI_OPERAND_OBJECT **SubElements; 817 ACPI_STATUS Status; |
803 BOOLEAN NonTrailingNull = FALSE; | |
804 UINT32 ExpectedCount; 805 UINT32 i; 806 UINT32 j; 807 808 | 818 UINT32 ExpectedCount; 819 UINT32 i; 820 UINT32 j; 821 822 |
809 /* Validate each sub-Package in the parent Package */ 810 | 823 /* 824 * Validate each sub-Package in the parent Package 825 * 826 * NOTE: assumes list of sub-packages contains no NULL elements. 827 * Any NULL elements should have been removed by earlier call 828 * to AcpiNsRemoveNullElements. 829 */ |
811 for (i = 0; i < Count; i++) 812 { | 830 for (i = 0; i < Count; i++) 831 { |
813 /* 814 * Handling for NULL package elements. For now, we will simply allow 815 * a parent package with trailing NULL elements. This can happen if 816 * the package was defined to be longer than the initializer list. 817 * This is legal as per the ACPI specification. It is often used 818 * to allow for dynamic initialization of a Package. 819 * 820 * A future enhancement may be to simply truncate the package to 821 * remove the trailing NULL elements. 822 */ 823 if (!(*Elements)) 824 { 825 if (!NonTrailingNull) 826 { 827 /* Ensure the remaining elements are all NULL */ 828 829 for (j = 1; j < (Count - i + 1); j++) 830 { 831 if (Elements[j]) 832 { 833 NonTrailingNull = TRUE; 834 } 835 } 836 837 if (!NonTrailingNull) 838 { 839 /* Ignore the trailing NULL elements */ 840 841 return (AE_OK); 842 } 843 } 844 845 /* There are trailing non-null elements, issue warning */ 846 847 ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 848 "Found NULL element at package index %u", i)); 849 Elements++; 850 continue; 851 } 852 | |
853 SubPackage = *Elements; 854 SubElements = SubPackage->Package.Elements; 855 856 /* Each sub-object must be of type Package */ 857 858 Status = AcpiNsCheckObjectType (Data, &SubPackage, 859 ACPI_RTYPE_PACKAGE, i); 860 if (ACPI_FAILURE (Status)) --- 424 unchanged lines hidden --- | 832 SubPackage = *Elements; 833 SubElements = SubPackage->Package.Elements; 834 835 /* Each sub-object must be of type Package */ 836 837 Status = AcpiNsCheckObjectType (Data, &SubPackage, 838 ACPI_RTYPE_PACKAGE, i); 839 if (ACPI_FAILURE (Status)) --- 424 unchanged lines hidden --- |