diff options
Diffstat (limited to 'source/components/namespace')
| -rw-r--r-- | source/components/namespace/nsdump.c | 16 | ||||
| -rw-r--r-- | source/components/namespace/nsdumpdv.c | 2 | ||||
| -rw-r--r-- | source/components/namespace/nspredef.c | 2 | ||||
| -rw-r--r-- | source/components/namespace/nsrepair.c | 161 | ||||
| -rw-r--r-- | source/components/namespace/nsutils.c | 2 | 
5 files changed, 72 insertions, 111 deletions
| diff --git a/source/components/namespace/nsdump.c b/source/components/namespace/nsdump.c index edc16257d4dd..6b7c50577918 100644 --- a/source/components/namespace/nsdump.c +++ b/source/components/namespace/nsdump.c @@ -270,7 +270,21 @@ AcpiNsDumpOneObject (          if (!ObjDesc)          { -            /* No attached object, we are done */ +            /* No attached object. Some types should always have an object */ + +            switch (Type) +            { +            case ACPI_TYPE_INTEGER: +            case ACPI_TYPE_PACKAGE: +            case ACPI_TYPE_BUFFER: +            case ACPI_TYPE_STRING: +            case ACPI_TYPE_METHOD: +                AcpiOsPrintf ("<No attached object>"); +                break; + +            default: +                break; +            }              AcpiOsPrintf ("\n");              return (AE_OK); diff --git a/source/components/namespace/nsdumpdv.c b/source/components/namespace/nsdumpdv.c index dde0a8d09abc..9d30886608a3 100644 --- a/source/components/namespace/nsdumpdv.c +++ b/source/components/namespace/nsdumpdv.c @@ -141,7 +141,7 @@ AcpiNsDumpRootDevices (          return;      } -    Status = AcpiGetHandle (NULL, ACPI_NS_SYSTEM_BUS, &SysBusHandle); +    Status = AcpiGetHandle (NULL, METHOD_NAME__SB_, &SysBusHandle);      if (ACPI_FAILURE (Status))      {          return; diff --git a/source/components/namespace/nspredef.c b/source/components/namespace/nspredef.c index 19662680125c..3a61aa3666e8 100644 --- a/source/components/namespace/nspredef.c +++ b/source/components/namespace/nspredef.c @@ -681,7 +681,7 @@ AcpiNsCheckPackage (          {              /* Create the new outer package and populate it */ -            Status = AcpiNsRepairPackageList (Data, ReturnObjectPtr); +            Status = AcpiNsWrapWithPackage (Data, *Elements, ReturnObjectPtr);              if (ACPI_FAILURE (Status))              {                  return (Status); diff --git a/source/components/namespace/nsrepair.c b/source/components/namespace/nsrepair.c index d820834e881e..06898a31e41c 100644 --- a/source/components/namespace/nsrepair.c +++ b/source/components/namespace/nsrepair.c @@ -74,11 +74,10 @@   * Buffer  -> String   * Buffer  -> Package of Integers   * Package -> Package of one Package + * An incorrect standalone object is wrapped with required outer package   *   * Additional possible repairs: - *   * Required package elements that are NULL replaced by Integer/String/Buffer - * Incorrect standalone package wrapped with required outer package   *   ******************************************************************************/ @@ -100,11 +99,6 @@ AcpiNsConvertToBuffer (      ACPI_OPERAND_OBJECT     *OriginalObject,      ACPI_OPERAND_OBJECT     **ReturnObject); -static ACPI_STATUS -AcpiNsConvertToPackage ( -    ACPI_OPERAND_OBJECT     *OriginalObject, -    ACPI_OPERAND_OBJECT     **ReturnObject); -  /*******************************************************************************   * @@ -172,10 +166,24 @@ AcpiNsRepairObject (      }      if (ExpectedBtypes & ACPI_RTYPE_PACKAGE)      { -        Status = AcpiNsConvertToPackage (ReturnObject, &NewObject); +        /* +         * A package is expected. We will wrap the existing object with a +         * new package object. It is often the case that if a variable-length +         * package is required, but there is only a single object needed, the +         * BIOS will return that object instead of wrapping it with a Package +         * object. Note: after the wrapping, the package will be validated +         * for correct contents (expected object type or types). +         */ +        Status = AcpiNsWrapWithPackage (Data, ReturnObject, &NewObject);          if (ACPI_SUCCESS (Status))          { -            goto ObjectRepaired; +            /* +             * The original object just had its reference count +             * incremented for being inserted into the new package. +             */ +            *ReturnObjectPtr = NewObject;       /* New Package object */ +            Data->Flags |= ACPI_OBJECT_REPAIRED; +            return (AE_OK);          }      } @@ -188,24 +196,27 @@ ObjectRepaired:      /* Object was successfully repaired */ -    /* -     * If the original object is a package element, we need to: -     * 1. Set the reference count of the new object to match the -     *    reference count of the old object. -     * 2. Decrement the reference count of the original object. -     */      if (PackageIndex != ACPI_NOT_PACKAGE_ELEMENT)      { -        NewObject->Common.ReferenceCount = -            ReturnObject->Common.ReferenceCount; - -        if (ReturnObject->Common.ReferenceCount > 1) +        /* +         * The original object is a package element. We need to +         * decrement the reference count of the original object, +         * for removing it from the package. +         * +         * However, if the original object was just wrapped with a +         * package object as part of the repair, we don't need to +         * change the reference count. +         */ +        if (!(Data->Flags & ACPI_OBJECT_WRAPPED))          { -            ReturnObject->Common.ReferenceCount--; +            if (ReturnObject->Common.ReferenceCount > 1) +            { +                ReturnObject->Common.ReferenceCount--; +            }          }          ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, -            "%s: Converted %s to expected %s at index %u\n", +            "%s: Converted %s to expected %s at Package index %u\n",              Data->Pathname, AcpiUtGetObjectTypeName (ReturnObject),              AcpiUtGetObjectTypeName (NewObject), PackageIndex));      } @@ -498,71 +509,6 @@ AcpiNsConvertToBuffer (  /*******************************************************************************   * - * FUNCTION:    AcpiNsConvertToPackage - * - * PARAMETERS:  OriginalObject      - Object to be converted - *              ReturnObject        - Where the new converted object is returned - * - * RETURN:      Status. AE_OK if conversion was successful. - * - * DESCRIPTION: Attempt to convert a Buffer object to a Package. Each byte of - *              the buffer is converted to a single integer package element. - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiNsConvertToPackage ( -    ACPI_OPERAND_OBJECT     *OriginalObject, -    ACPI_OPERAND_OBJECT     **ReturnObject) -{ -    ACPI_OPERAND_OBJECT     *NewObject; -    ACPI_OPERAND_OBJECT     **Elements; -    UINT32                  Length; -    UINT8                   *Buffer; - - -    switch (OriginalObject->Common.Type) -    { -    case ACPI_TYPE_BUFFER: - -        /* Buffer-to-Package conversion */ - -        Length = OriginalObject->Buffer.Length; -        NewObject = AcpiUtCreatePackageObject (Length); -        if (!NewObject) -        { -            return (AE_NO_MEMORY); -        } - -        /* Convert each buffer byte to an integer package element */ - -        Elements = NewObject->Package.Elements; -        Buffer = OriginalObject->Buffer.Pointer; - -        while (Length--) -        { -            *Elements = AcpiUtCreateIntegerObject ((UINT64) *Buffer); -            if (!*Elements) -            { -                AcpiUtRemoveReference (NewObject); -                return (AE_NO_MEMORY); -            } -            Elements++; -            Buffer++; -        } -        break; - -    default: -        return (AE_AML_OPERAND_TYPE); -    } - -    *ReturnObject = NewObject; -    return (AE_OK); -} - - -/******************************************************************************* - *   * FUNCTION:    AcpiNsRepairNullElement   *   * PARAMETERS:  Data                - Pointer to validation data structure @@ -745,42 +691,43 @@ AcpiNsRemoveNullElements (  /*******************************************************************************   * - * FUNCTION:    AcpiNsRepairPackageList + * FUNCTION:    AcpiNsWrapWithPackage   *   * PARAMETERS:  Data                - Pointer to validation data structure - *              ObjDescPtr          - Pointer to the object to repair. The new - *                                    package object is returned here, - *                                    overwriting the old object. + *              OriginalObject      - Pointer to the object to repair. + *              ObjDescPtr          - The new package object is returned here   *   * RETURN:      Status, new object in *ObjDescPtr   * - * DESCRIPTION: Repair a common problem with objects that are defined to return - *              a variable-length Package of Packages. If the variable-length - *              is one, some BIOS code mistakenly simply declares a single - *              Package instead of a Package with one sub-Package. This - *              function attempts to repair this error by wrapping a Package - *              object around the original Package, creating the correct - *              Package with one sub-Package. + * DESCRIPTION: Repair a common problem with objects that are defined to + *              return a variable-length Package of sub-objects. If there is + *              only one sub-object, some BIOS code mistakenly simply declares + *              the single object instead of a Package with one sub-object. + *              This function attempts to repair this error by wrapping a + *              Package object around the original object, creating the + *              correct and expected Package with one sub-object.   *   *              Names that can be repaired in this manner include: - *              _ALR, _CSD, _HPX, _MLS, _PRT, _PSS, _TRT, TSS + *              _ALR, _CSD, _HPX, _MLS, _PLD, _PRT, _PSS, _TRT, _TSS, + *              _BCL, _DOD, _FIX, _Sx   *   ******************************************************************************/  ACPI_STATUS -AcpiNsRepairPackageList ( +AcpiNsWrapWithPackage (      ACPI_PREDEFINED_DATA    *Data, +    ACPI_OPERAND_OBJECT     *OriginalObject,      ACPI_OPERAND_OBJECT     **ObjDescPtr)  {      ACPI_OPERAND_OBJECT     *PkgObjDesc; -    ACPI_FUNCTION_NAME (NsRepairPackageList); +    ACPI_FUNCTION_NAME (NsWrapWithPackage);      /*       * Create the new outer package and populate it. The new package will -     * have a single element, the lone subpackage. +     * have a single element, the lone sub-object.       */      PkgObjDesc = AcpiUtCreatePackageObject (1);      if (!PkgObjDesc) @@ -788,15 +735,15 @@ AcpiNsRepairPackageList (          return (AE_NO_MEMORY);      } -    PkgObjDesc->Package.Elements[0] = *ObjDescPtr; +    PkgObjDesc->Package.Elements[0] = OriginalObject; + +    ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, +        "%s: Wrapped %s with expected Package object\n", +        Data->Pathname, AcpiUtGetObjectTypeName (OriginalObject)));      /* Return the new object in the object pointer */      *ObjDescPtr = PkgObjDesc; -    Data->Flags |= ACPI_OBJECT_REPAIRED; - -    ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, -        "%s: Repaired incorrectly formed Package\n", Data->Pathname)); - +    Data->Flags |= ACPI_OBJECT_REPAIRED | ACPI_OBJECT_WRAPPED;      return (AE_OK);  } diff --git a/source/components/namespace/nsutils.c b/source/components/namespace/nsutils.c index 3b07f83a9e33..43f734e81902 100644 --- a/source/components/namespace/nsutils.c +++ b/source/components/namespace/nsutils.c @@ -405,7 +405,7 @@ AcpiNsBuildInternalName (          if (!AcpiNsValidPathSeparator (*ExternalName) &&              (*ExternalName != 0))          { -            return_ACPI_STATUS (AE_BAD_PARAMETER); +            return_ACPI_STATUS (AE_BAD_PATHNAME);          }          /* Move on the next segment */ | 
