nsrepair2.c (199337) | nsrepair2.c (200553) |
---|---|
1/****************************************************************************** 2 * 3 * Module Name: nsrepair2 - Repair for objects returned by specific 4 * predefined methods 5 * 6 *****************************************************************************/ 7 8/****************************************************************************** --- 105 unchanged lines hidden (view full) --- 114 * 115 *****************************************************************************/ 116 117#define __NSREPAIR2_C__ 118 119#include <contrib/dev/acpica/include/acpi.h> 120#include <contrib/dev/acpica/include/accommon.h> 121#include <contrib/dev/acpica/include/acnamesp.h> | 1/****************************************************************************** 2 * 3 * Module Name: nsrepair2 - Repair for objects returned by specific 4 * predefined methods 5 * 6 *****************************************************************************/ 7 8/****************************************************************************** --- 105 unchanged lines hidden (view full) --- 114 * 115 *****************************************************************************/ 116 117#define __NSREPAIR2_C__ 118 119#include <contrib/dev/acpica/include/acpi.h> 120#include <contrib/dev/acpica/include/accommon.h> 121#include <contrib/dev/acpica/include/acnamesp.h> |
122#include <contrib/dev/acpica/include/acpredef.h> |
|
122 123#define _COMPONENT ACPI_NAMESPACE 124 ACPI_MODULE_NAME ("nsrepair2") 125 126 127/* 128 * Information structure and handler for ACPI predefined names that can 129 * be repaired on a per-name basis. --- 18 unchanged lines hidden (view full) --- 148 ACPI_NAMESPACE_NODE *Node); 149 150static ACPI_STATUS 151AcpiNsRepair_ALR ( 152 ACPI_PREDEFINED_DATA *Data, 153 ACPI_OPERAND_OBJECT **ReturnObjectPtr); 154 155static ACPI_STATUS | 123 124#define _COMPONENT ACPI_NAMESPACE 125 ACPI_MODULE_NAME ("nsrepair2") 126 127 128/* 129 * Information structure and handler for ACPI predefined names that can 130 * be repaired on a per-name basis. --- 18 unchanged lines hidden (view full) --- 149 ACPI_NAMESPACE_NODE *Node); 150 151static ACPI_STATUS 152AcpiNsRepair_ALR ( 153 ACPI_PREDEFINED_DATA *Data, 154 ACPI_OPERAND_OBJECT **ReturnObjectPtr); 155 156static ACPI_STATUS |
157AcpiNsRepair_FDE ( 158 ACPI_PREDEFINED_DATA *Data, 159 ACPI_OPERAND_OBJECT **ReturnObjectPtr); 160 161static ACPI_STATUS |
|
156AcpiNsRepair_PSS ( 157 ACPI_PREDEFINED_DATA *Data, 158 ACPI_OPERAND_OBJECT **ReturnObjectPtr); 159 160static ACPI_STATUS 161AcpiNsRepair_TSS ( 162 ACPI_PREDEFINED_DATA *Data, 163 ACPI_OPERAND_OBJECT **ReturnObjectPtr); 164 165static ACPI_STATUS 166AcpiNsCheckSortedList ( 167 ACPI_PREDEFINED_DATA *Data, 168 ACPI_OPERAND_OBJECT *ReturnObject, 169 UINT32 ExpectedCount, 170 UINT32 SortIndex, 171 UINT8 SortDirection, 172 char *SortKeyName); 173 174static ACPI_STATUS | 162AcpiNsRepair_PSS ( 163 ACPI_PREDEFINED_DATA *Data, 164 ACPI_OPERAND_OBJECT **ReturnObjectPtr); 165 166static ACPI_STATUS 167AcpiNsRepair_TSS ( 168 ACPI_PREDEFINED_DATA *Data, 169 ACPI_OPERAND_OBJECT **ReturnObjectPtr); 170 171static ACPI_STATUS 172AcpiNsCheckSortedList ( 173 ACPI_PREDEFINED_DATA *Data, 174 ACPI_OPERAND_OBJECT *ReturnObject, 175 UINT32 ExpectedCount, 176 UINT32 SortIndex, 177 UINT8 SortDirection, 178 char *SortKeyName); 179 180static ACPI_STATUS |
175AcpiNsRemoveNullElements ( 176 ACPI_OPERAND_OBJECT *Package); 177 178static ACPI_STATUS | |
179AcpiNsSortList ( 180 ACPI_OPERAND_OBJECT **Elements, 181 UINT32 Count, 182 UINT32 Index, 183 UINT8 SortDirection); 184 185/* Values for SortDirection above */ 186 187#define ACPI_SORT_ASCENDING 0 188#define ACPI_SORT_DESCENDING 1 189 190 191/* 192 * This table contains the names of the predefined methods for which we can 193 * perform more complex repairs. 194 * | 181AcpiNsSortList ( 182 ACPI_OPERAND_OBJECT **Elements, 183 UINT32 Count, 184 UINT32 Index, 185 UINT8 SortDirection); 186 187/* Values for SortDirection above */ 188 189#define ACPI_SORT_ASCENDING 0 190#define ACPI_SORT_DESCENDING 1 191 192 193/* 194 * This table contains the names of the predefined methods for which we can 195 * perform more complex repairs. 196 * |
195 * _ALR: Sort the list ascending by AmbientIlluminance if necessary 196 * _PSS: Sort the list descending by Power if necessary 197 * _TSS: Sort the list descending by Power if necessary | 197 * As necessary: 198 * 199 * _ALR: Sort the list ascending by AmbientIlluminance 200 * _FDE: Convert Buffer of BYTEs to a Buffer of DWORDs 201 * _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs 202 * _PSS: Sort the list descending by Power 203 * _TSS: Sort the list descending by Power |
198 */ 199static const ACPI_REPAIR_INFO AcpiNsRepairableNames[] = 200{ 201 {"_ALR", AcpiNsRepair_ALR}, | 204 */ 205static const ACPI_REPAIR_INFO AcpiNsRepairableNames[] = 206{ 207 {"_ALR", AcpiNsRepair_ALR}, |
208 {"_FDE", AcpiNsRepair_FDE}, 209 {"_GTM", AcpiNsRepair_FDE}, /* _GTM has same repair as _FDE */ |
|
202 {"_PSS", AcpiNsRepair_PSS}, 203 {"_TSS", AcpiNsRepair_TSS}, | 210 {"_PSS", AcpiNsRepair_PSS}, 211 {"_TSS", AcpiNsRepair_TSS}, |
204 {{0,0,0,0}, NULL} /* Table terminator */ | 212 {{0,0,0,0}, NULL} /* Table terminator */ |
205}; 206 207 | 213}; 214 215 |
216#define ACPI_FDE_FIELD_COUNT 5 217#define ACPI_FDE_BYTE_BUFFER_SIZE 5 218#define ACPI_FDE_DWORD_BUFFER_SIZE (ACPI_FDE_FIELD_COUNT * sizeof (UINT32)) 219 220 |
|
208/****************************************************************************** 209 * 210 * FUNCTION: AcpiNsComplexRepairs 211 * 212 * PARAMETERS: Data - Pointer to validation data structure 213 * Node - Namespace node for the method/object 214 * ValidateStatus - Original status of earlier validation 215 * ReturnObjectPtr - Pointer to the object returned from the 216 * evaluation of a method or object 217 * | 221/****************************************************************************** 222 * 223 * FUNCTION: AcpiNsComplexRepairs 224 * 225 * PARAMETERS: Data - Pointer to validation data structure 226 * Node - Namespace node for the method/object 227 * ValidateStatus - Original status of earlier validation 228 * ReturnObjectPtr - Pointer to the object returned from the 229 * evaluation of a method or object 230 * |
218 * RETURN: Status. AE_OK if repair was successful. If name is not | 231 * RETURN: Status. AE_OK if repair was successful. If name is not |
219 * matched, ValidateStatus is returned. 220 * 221 * DESCRIPTION: Attempt to repair/convert a return object of a type that was 222 * not expected. 223 * 224 *****************************************************************************/ 225 226ACPI_STATUS --- 83 unchanged lines hidden (view full) --- 310 ACPI_SORT_ASCENDING, "AmbientIlluminance"); 311 312 return (Status); 313} 314 315 316/****************************************************************************** 317 * | 232 * matched, ValidateStatus is returned. 233 * 234 * DESCRIPTION: Attempt to repair/convert a return object of a type that was 235 * not expected. 236 * 237 *****************************************************************************/ 238 239ACPI_STATUS --- 83 unchanged lines hidden (view full) --- 323 ACPI_SORT_ASCENDING, "AmbientIlluminance"); 324 325 return (Status); 326} 327 328 329/****************************************************************************** 330 * |
331 * FUNCTION: AcpiNsRepair_FDE 332 * 333 * PARAMETERS: Data - Pointer to validation data structure 334 * ReturnObjectPtr - Pointer to the object returned from the 335 * evaluation of a method or object 336 * 337 * RETURN: Status. AE_OK if object is OK or was repaired successfully 338 * 339 * DESCRIPTION: Repair for the _FDE and _GTM objects. The expected return 340 * value is a Buffer of 5 DWORDs. This function repairs a common 341 * problem where the return value is a Buffer of BYTEs, not 342 * DWORDs. 343 * 344 *****************************************************************************/ 345 346static ACPI_STATUS 347AcpiNsRepair_FDE ( 348 ACPI_PREDEFINED_DATA *Data, 349 ACPI_OPERAND_OBJECT **ReturnObjectPtr) 350{ 351 ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; 352 ACPI_OPERAND_OBJECT *BufferObject; 353 UINT8 *ByteBuffer; 354 UINT32 *DwordBuffer; 355 UINT32 i; 356 357 358 ACPI_FUNCTION_NAME (NsRepair_FDE); 359 360 361 switch (ReturnObject->Common.Type) 362 { 363 case ACPI_TYPE_BUFFER: 364 365 /* This is the expected type. Length should be (at least) 5 DWORDs */ 366 367 if (ReturnObject->Buffer.Length >= ACPI_FDE_DWORD_BUFFER_SIZE) 368 { 369 return (AE_OK); 370 } 371 372 /* We can only repair if we have exactly 5 BYTEs */ 373 374 if (ReturnObject->Buffer.Length != ACPI_FDE_BYTE_BUFFER_SIZE) 375 { 376 ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 377 "Incorrect return buffer length %u, expected %u", 378 ReturnObject->Buffer.Length, ACPI_FDE_DWORD_BUFFER_SIZE)); 379 380 return (AE_AML_OPERAND_TYPE); 381 } 382 383 /* Create the new (larger) buffer object */ 384 385 BufferObject = AcpiUtCreateBufferObject (ACPI_FDE_DWORD_BUFFER_SIZE); 386 if (!BufferObject) 387 { 388 return (AE_NO_MEMORY); 389 } 390 391 /* Expand each byte to a DWORD */ 392 393 ByteBuffer = ReturnObject->Buffer.Pointer; 394 DwordBuffer = ACPI_CAST_PTR (UINT32, BufferObject->Buffer.Pointer); 395 396 for (i = 0; i < ACPI_FDE_FIELD_COUNT; i++) 397 { 398 *DwordBuffer = (UINT32) *ByteBuffer; 399 DwordBuffer++; 400 ByteBuffer++; 401 } 402 403 ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, 404 "%s Expanded Byte Buffer to expected DWord Buffer\n", 405 Data->Pathname)); 406 break; 407 408 default: 409 return (AE_AML_OPERAND_TYPE); 410 } 411 412 /* Delete the original return object, return the new buffer object */ 413 414 AcpiUtRemoveReference (ReturnObject); 415 *ReturnObjectPtr = BufferObject; 416 417 Data->Flags |= ACPI_OBJECT_REPAIRED; 418 return (AE_OK); 419} 420 421 422/****************************************************************************** 423 * |
|
318 * FUNCTION: AcpiNsRepair_TSS 319 * 320 * PARAMETERS: Data - Pointer to validation data structure 321 * ReturnObjectPtr - Pointer to the object returned from the 322 * evaluation of a method or object 323 * 324 * RETURN: Status. AE_OK if object is OK or was repaired successfully 325 * --- 123 unchanged lines hidden (view full) --- 449 ACPI_OPERAND_OBJECT **OuterElements; 450 ACPI_OPERAND_OBJECT **Elements; 451 ACPI_OPERAND_OBJECT *ObjDesc; 452 UINT32 i; 453 UINT32 PreviousValue; 454 ACPI_STATUS Status; 455 456 | 424 * FUNCTION: AcpiNsRepair_TSS 425 * 426 * PARAMETERS: Data - Pointer to validation data structure 427 * ReturnObjectPtr - Pointer to the object returned from the 428 * evaluation of a method or object 429 * 430 * RETURN: Status. AE_OK if object is OK or was repaired successfully 431 * --- 123 unchanged lines hidden (view full) --- 555 ACPI_OPERAND_OBJECT **OuterElements; 556 ACPI_OPERAND_OBJECT **Elements; 557 ACPI_OPERAND_OBJECT *ObjDesc; 558 UINT32 i; 559 UINT32 PreviousValue; 560 ACPI_STATUS Status; 561 562 |
563 ACPI_FUNCTION_NAME (NsCheckSortedList); 564 565 |
|
457 /* The top-level object must be a package */ 458 459 if (ReturnObject->Common.Type != ACPI_TYPE_PACKAGE) 460 { 461 return (AE_AML_OPERAND_TYPE); 462 } 463 464 /* | 566 /* The top-level object must be a package */ 567 568 if (ReturnObject->Common.Type != ACPI_TYPE_PACKAGE) 569 { 570 return (AE_AML_OPERAND_TYPE); 571 } 572 573 /* |
465 * Detect any NULL package elements and remove them from the 466 * package. 467 * 468 * TBD: We may want to do this for all predefined names that 469 * return a variable-length package of packages. | 574 * NOTE: assumes list of sub-packages contains no NULL elements. 575 * Any NULL elements should have been removed by earlier call 576 * to AcpiNsRemoveNullElements. |
470 */ | 577 */ |
471 Status = AcpiNsRemoveNullElements (ReturnObject); 472 if (Status == AE_NULL_ENTRY) 473 { 474 ACPI_INFO_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 475 "NULL elements removed from package")); 476 477 /* Exit if package is now zero length */ 478 479 if (!ReturnObject->Package.Count) 480 { 481 return (AE_NULL_ENTRY); 482 } 483 } 484 | |
485 OuterElements = ReturnObject->Package.Elements; 486 OuterElementCount = ReturnObject->Package.Count; 487 if (!OuterElementCount) 488 { 489 return (AE_AML_PACKAGE_LIMIT); 490 } 491 492 PreviousValue = 0; --- 41 unchanged lines hidden (view full) --- 534 OuterElementCount, SortIndex, SortDirection); 535 if (ACPI_FAILURE (Status)) 536 { 537 return (Status); 538 } 539 540 Data->Flags |= ACPI_OBJECT_REPAIRED; 541 | 578 OuterElements = ReturnObject->Package.Elements; 579 OuterElementCount = ReturnObject->Package.Count; 580 if (!OuterElementCount) 581 { 582 return (AE_AML_PACKAGE_LIMIT); 583 } 584 585 PreviousValue = 0; --- 41 unchanged lines hidden (view full) --- 627 OuterElementCount, SortIndex, SortDirection); 628 if (ACPI_FAILURE (Status)) 629 { 630 return (Status); 631 } 632 633 Data->Flags |= ACPI_OBJECT_REPAIRED; 634 |
542 ACPI_INFO_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 543 "Repaired unsorted list - now sorted by %s", SortKeyName)); | 635 ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, 636 "%s: Repaired unsorted list - now sorted by %s\n", 637 Data->Pathname, SortKeyName)); |
544 return (AE_OK); 545 } 546 547 PreviousValue = (UINT32) ObjDesc->Integer.Value; 548 OuterElements++; 549 } 550 551 return (AE_OK); 552} 553 554 555/****************************************************************************** 556 * 557 * FUNCTION: AcpiNsRemoveNullElements 558 * | 638 return (AE_OK); 639 } 640 641 PreviousValue = (UINT32) ObjDesc->Integer.Value; 642 OuterElements++; 643 } 644 645 return (AE_OK); 646} 647 648 649/****************************************************************************** 650 * 651 * FUNCTION: AcpiNsRemoveNullElements 652 * |
559 * PARAMETERS: ObjDesc - A Package object | 653 * PARAMETERS: Data - Pointer to validation data structure 654 * PackageType - An AcpiReturnPackageTypes value 655 * ObjDesc - A Package object |
560 * | 656 * |
561 * RETURN: Status. AE_NULL_ENTRY means that one or more elements were 562 * removed. | 657 * RETURN: None. |
563 * | 658 * |
564 * DESCRIPTION: Remove all NULL package elements and update the package count. | 659 * DESCRIPTION: Remove all NULL package elements from packages that contain 660 * a variable number of sub-packages. |
565 * 566 *****************************************************************************/ 567 | 661 * 662 *****************************************************************************/ 663 |
568static ACPI_STATUS | 664void |
569AcpiNsRemoveNullElements ( | 665AcpiNsRemoveNullElements ( |
666 ACPI_PREDEFINED_DATA *Data, 667 UINT8 PackageType, |
|
570 ACPI_OPERAND_OBJECT *ObjDesc) 571{ 572 ACPI_OPERAND_OBJECT **Source; 573 ACPI_OPERAND_OBJECT **Dest; | 668 ACPI_OPERAND_OBJECT *ObjDesc) 669{ 670 ACPI_OPERAND_OBJECT **Source; 671 ACPI_OPERAND_OBJECT **Dest; |
574 ACPI_STATUS Status = AE_OK; | |
575 UINT32 Count; 576 UINT32 NewCount; 577 UINT32 i; 578 579 | 672 UINT32 Count; 673 UINT32 NewCount; 674 UINT32 i; 675 676 |
677 ACPI_FUNCTION_NAME (NsRemoveNullElements); 678 679 680 /* 681 * PTYPE1 packages contain no subpackages. 682 * PTYPE2 packages contain a variable number of sub-packages. We can 683 * safely remove all NULL elements from the PTYPE2 packages. 684 */ 685 switch (PackageType) 686 { 687 case ACPI_PTYPE1_FIXED: 688 case ACPI_PTYPE1_VAR: 689 case ACPI_PTYPE1_OPTION: 690 return; 691 692 case ACPI_PTYPE2: 693 case ACPI_PTYPE2_COUNT: 694 case ACPI_PTYPE2_PKG_COUNT: 695 case ACPI_PTYPE2_FIXED: 696 case ACPI_PTYPE2_MIN: 697 case ACPI_PTYPE2_REV_FIXED: 698 break; 699 700 default: 701 return; 702 } 703 |
|
580 Count = ObjDesc->Package.Count; 581 NewCount = Count; 582 583 Source = ObjDesc->Package.Elements; 584 Dest = Source; 585 | 704 Count = ObjDesc->Package.Count; 705 NewCount = Count; 706 707 Source = ObjDesc->Package.Elements; 708 Dest = Source; 709 |
586 /* Examine all elements of the package object */ | 710 /* Examine all elements of the package object, remove nulls */ |
587 588 for (i = 0; i < Count; i++) 589 { 590 if (!*Source) 591 { | 711 712 for (i = 0; i < Count; i++) 713 { 714 if (!*Source) 715 { |
592 Status = AE_NULL_ENTRY; | |
593 NewCount--; 594 } 595 else 596 { 597 *Dest = *Source; 598 Dest++; 599 } 600 Source++; 601 } 602 | 716 NewCount--; 717 } 718 else 719 { 720 *Dest = *Source; 721 Dest++; 722 } 723 Source++; 724 } 725 |
603 if (Status == AE_NULL_ENTRY) | 726 /* Update parent package if any null elements were removed */ 727 728 if (NewCount < Count) |
604 { | 729 { |
730 ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, 731 "%s: Found and removed %u NULL elements\n", 732 Data->Pathname, (Count - NewCount))); 733 |
|
605 /* NULL terminate list and update the package count */ 606 607 *Dest = NULL; 608 ObjDesc->Package.Count = NewCount; 609 } | 734 /* NULL terminate list and update the package count */ 735 736 *Dest = NULL; 737 ObjDesc->Package.Count = NewCount; 738 } |
610 611 return (Status); | |
612} 613 614 615/****************************************************************************** 616 * 617 * FUNCTION: AcpiNsSortList 618 * 619 * PARAMETERS: Elements - Package object element list --- 50 unchanged lines hidden --- | 739} 740 741 742/****************************************************************************** 743 * 744 * FUNCTION: AcpiNsSortList 745 * 746 * PARAMETERS: Elements - Package object element list --- 50 unchanged lines hidden --- |