Deleted Added
full compact
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 ---