diff options
Diffstat (limited to 'source/components')
62 files changed, 4513 insertions, 4040 deletions
| diff --git a/source/components/debugger/dbcmds.c b/source/components/debugger/dbcmds.c index 5cd41781765f..924e683118ca 100644 --- a/source/components/debugger/dbcmds.c +++ b/source/components/debugger/dbcmds.c @@ -87,12 +87,12 @@ AcpiDbDeviceResources (   *   * FUNCTION:    AcpiDbConvertToNode   * - * PARAMETERS:  InString        - String to convert + * PARAMETERS:  InString            - String to convert   *   * RETURN:      Pointer to a NS node   *   * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or - *              alpha strings. + *              alphanumeric strings.   *   ******************************************************************************/ @@ -126,9 +126,9 @@ AcpiDbConvertToNode (      }      else      { -        /* Alpha argument */ -        /* The parameter is a name string that must be resolved to a -         * Named obj +        /* +         * Alpha argument: The parameter is a name string that must be +         * resolved to a Namespace object.           */          Node = AcpiDbLocalNsLookup (InString);          if (!Node) @@ -145,7 +145,7 @@ AcpiDbConvertToNode (   *   * FUNCTION:    AcpiDbSleep   * - * PARAMETERS:  ObjectArg       - Desired sleep state (0-5) + * PARAMETERS:  ObjectArg           - Desired sleep state (0-5)   *   * RETURN:      Status   * @@ -236,7 +236,7 @@ AcpiDbDisplayLocks (   *   * FUNCTION:    AcpiDbDisplayTableInfo   * - * PARAMETERS:  TableArg        - String with name of table to be displayed + * PARAMETERS:  TableArg            - Name of table to be displayed   *   * RETURN:      None   * @@ -377,8 +377,8 @@ AcpiDbUnloadAcpiTable (   *   * FUNCTION:    AcpiDbSendNotify   * - * PARAMETERS:  Name            - Name of ACPI object to send the notify to - *              Value           - Value of the notify to send. + * PARAMETERS:  Name                - Name of ACPI object where to send notify + *              Value               - Value of the notify to send.   *   * RETURN:      None   * @@ -416,7 +416,8 @@ AcpiDbSendNotify (      }      else      { -        AcpiOsPrintf ("Named object [%4.4s] Type %s, must be Device/Thermal/Processor type\n", +        AcpiOsPrintf ( +            "Named object [%4.4s] Type %s, must be Device/Thermal/Processor type\n",              AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type));      }  } @@ -453,7 +454,6 @@ AcpiDbDisplayInterfaces (                      ACPI_WAIT_FOREVER);          NextInterface = AcpiGbl_SupportedInterfaces; -          while (NextInterface)          {              if (!(NextInterface->Flags & ACPI_OSI_INVALID)) @@ -518,7 +518,7 @@ AcpiDbDisplayInterfaces (   *   * FUNCTION:    AcpiDbDisplayTemplate   * - * PARAMETERS:  BufferArg           - Buffer name or addrss + * PARAMETERS:  BufferArg           - Buffer name or address   *   * RETURN:      None   * @@ -532,7 +532,7 @@ AcpiDbDisplayTemplate (  {      ACPI_NAMESPACE_NODE     *Node;      ACPI_STATUS             Status; -    ACPI_BUFFER             ReturnObj; +    ACPI_BUFFER             ReturnBuffer;      /* Translate BufferArg to an Named object */ @@ -553,12 +553,12 @@ AcpiDbDisplayTemplate (          return;      } -    ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; -    ReturnObj.Pointer = AcpiGbl_DbBuffer; +    ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; +    ReturnBuffer.Pointer = AcpiGbl_DbBuffer;      /* Attempt to convert the raw buffer to a resource list */ -    Status = AcpiRsCreateResourceList (Node->Object, &ReturnObj); +    Status = AcpiRsCreateResourceList (Node->Object, &ReturnBuffer);      AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);      AcpiDbgLevel |= ACPI_LV_RESOURCES; @@ -573,7 +573,7 @@ AcpiDbDisplayTemplate (      /* Now we can dump the resource list */      AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, -        ReturnObj.Pointer)); +        ReturnBuffer.Pointer));  DumpBuffer:      AcpiOsPrintf ("\nRaw data buffer:\n"); @@ -666,7 +666,8 @@ AcpiDmCompareAmlResources (              {                  if (Aml1[i] != Aml2[i])                  { -                    AcpiOsPrintf ("Mismatch at byte offset %.2X: is %2.2X, should be %2.2X\n", +                    AcpiOsPrintf ( +                        "Mismatch at byte offset %.2X: is %2.2X, should be %2.2X\n",                          i, Aml2[i], Aml1[i]);                  }              } @@ -693,8 +694,8 @@ AcpiDmCompareAmlResources (   *   * FUNCTION:    AcpiDmTestResourceConversion   * - * PARAMETERS:  Node            - Parent device node - *              Name            - resource method name (_CRS) + * PARAMETERS:  Node                - Parent device node + *              Name                - resource method name (_CRS)   *   * RETURN:      Status   * @@ -709,8 +710,8 @@ AcpiDmTestResourceConversion (      char                    *Name)  {      ACPI_STATUS             Status; -    ACPI_BUFFER             ReturnObj; -    ACPI_BUFFER             ResourceObj; +    ACPI_BUFFER             ReturnBuffer; +    ACPI_BUFFER             ResourceBuffer;      ACPI_BUFFER             NewAml;      ACPI_OBJECT             *OriginalAml; @@ -718,12 +719,12 @@ AcpiDmTestResourceConversion (      AcpiOsPrintf ("Resource Conversion Comparison:\n");      NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER; -    ReturnObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER; -    ResourceObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER; +    ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; +    ResourceBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;      /* Get the original _CRS AML resource template */ -    Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnObj); +    Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnBuffer);      if (ACPI_FAILURE (Status))      {          AcpiOsPrintf ("Could not obtain %s: %s\n", @@ -733,7 +734,7 @@ AcpiDmTestResourceConversion (      /* Get the AML resource template, converted to internal resource structs */ -    Status = AcpiGetCurrentResources (Node, &ResourceObj); +    Status = AcpiGetCurrentResources (Node, &ResourceBuffer);      if (ACPI_FAILURE (Status))      {          AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", @@ -743,7 +744,7 @@ AcpiDmTestResourceConversion (      /* Convert internal resource list to external AML resource template */ -    Status = AcpiRsCreateAmlResources (ResourceObj.Pointer, &NewAml); +    Status = AcpiRsCreateAmlResources (ResourceBuffer.Pointer, &NewAml);      if (ACPI_FAILURE (Status))      {          AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n", @@ -753,7 +754,7 @@ AcpiDmTestResourceConversion (      /* Compare original AML to the newly created AML resource list */ -    OriginalAml = ReturnObj.Pointer; +    OriginalAml = ReturnBuffer.Pointer;      AcpiDmCompareAmlResources (          OriginalAml->Buffer.Pointer, (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length, @@ -763,9 +764,9 @@ AcpiDmTestResourceConversion (      ACPI_FREE (NewAml.Pointer);  Exit2: -    ACPI_FREE (ResourceObj.Pointer); +    ACPI_FREE (ResourceBuffer.Pointer);  Exit1: -    ACPI_FREE (ReturnObj.Pointer); +    ACPI_FREE (ReturnBuffer.Pointer);      return (Status);  } @@ -778,7 +779,8 @@ Exit1:   *   * RETURN:      Status   * - * DESCRIPTION: Simple callback to exercise AcpiWalkResources + * DESCRIPTION: Simple callback to exercise AcpiWalkResources and + *              AcpiWalkResourceBuffer.   *   ******************************************************************************/ @@ -817,7 +819,7 @@ AcpiDbDeviceResources (      ACPI_NAMESPACE_NODE     *PrsNode = NULL;      ACPI_NAMESPACE_NODE     *AeiNode = NULL;      char                    *ParentPath; -    ACPI_BUFFER             ReturnObj; +    ACPI_BUFFER             ReturnBuffer;      ACPI_STATUS             Status; @@ -843,8 +845,8 @@ AcpiDbDeviceResources (      /* Prepare for a return object of arbitrary size */ -    ReturnObj.Pointer = AcpiGbl_DbBuffer; -    ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE; +    ReturnBuffer.Pointer = AcpiGbl_DbBuffer; +    ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;      /* _PRT */ @@ -853,7 +855,7 @@ AcpiDbDeviceResources (      {          AcpiOsPrintf ("Evaluating _PRT\n"); -        Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnObj); +        Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnBuffer);          if (ACPI_FAILURE (Status))          {              AcpiOsPrintf ("Could not evaluate _PRT: %s\n", @@ -861,10 +863,10 @@ AcpiDbDeviceResources (              goto GetCrs;          } -        ReturnObj.Pointer = AcpiGbl_DbBuffer; -        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE; +        ReturnBuffer.Pointer = AcpiGbl_DbBuffer; +        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE; -        Status = AcpiGetIrqRoutingTable (Node, &ReturnObj); +        Status = AcpiGetIrqRoutingTable (Node, &ReturnBuffer);          if (ACPI_FAILURE (Status))          {              AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n", @@ -883,10 +885,10 @@ GetCrs:      {          AcpiOsPrintf ("Evaluating _CRS\n"); -        ReturnObj.Pointer = AcpiGbl_DbBuffer; -        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE; +        ReturnBuffer.Pointer = AcpiGbl_DbBuffer; +        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE; -        Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnObj); +        Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnBuffer);          if (ACPI_FAILURE (Status))          {              AcpiOsPrintf ("Could not evaluate _CRS: %s\n", @@ -894,7 +896,7 @@ GetCrs:              goto GetPrs;          } -        /* This code is here to exercise the AcpiWalkResources interface */ +        /* This code exercises the AcpiWalkResources interface */          Status = AcpiWalkResources (Node, METHOD_NAME__CRS,              AcpiDbResourceCallback, NULL); @@ -905,12 +907,12 @@ GetCrs:              goto GetPrs;          } -        /* Get the _CRS resource list */ +        /* Get the _CRS resource list (test ALLOCATE buffer) */ -        ReturnObj.Pointer = AcpiGbl_DbBuffer; -        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE; +        ReturnBuffer.Pointer = NULL; +        ReturnBuffer.Length  = ACPI_ALLOCATE_LOCAL_BUFFER; -        Status = AcpiGetCurrentResources (Node, &ReturnObj); +        Status = AcpiGetCurrentResources (Node, &ReturnBuffer);          if (ACPI_FAILURE (Status))          {              AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", @@ -918,26 +920,41 @@ GetCrs:              goto GetPrs;          } +        /* This code exercises the AcpiWalkResourceBuffer interface */ + +        Status = AcpiWalkResourceBuffer (&ReturnBuffer, +            AcpiDbResourceCallback, NULL); +        if (ACPI_FAILURE (Status)) +        { +            AcpiOsPrintf ("AcpiWalkResourceBuffer failed: %s\n", +                AcpiFormatException (Status)); +            goto EndCrs; +        } +          /* Dump the _CRS resource list */          AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, -            ReturnObj.Pointer)); +            ReturnBuffer.Pointer));          /* -         * Perform comparison of original AML to newly created AML. This tests both -         * the AML->Resource conversion and the Resource->Aml conversion. +         * Perform comparison of original AML to newly created AML. This +         * tests both the AML->Resource conversion and the Resource->AML +         * conversion.           */ -        Status = AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS); +        (void) AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS);          /* Execute _SRS with the resource list */ -        Status = AcpiSetCurrentResources (Node, &ReturnObj); +        Status = AcpiSetCurrentResources (Node, &ReturnBuffer);          if (ACPI_FAILURE (Status))          {              AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n",                  AcpiFormatException (Status)); -            goto GetPrs; +            goto EndCrs;          } + +EndCrs: +        ACPI_FREE_BUFFER (ReturnBuffer);      } @@ -948,10 +965,10 @@ GetPrs:      {          AcpiOsPrintf ("Evaluating _PRS\n"); -        ReturnObj.Pointer = AcpiGbl_DbBuffer; -        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE; +        ReturnBuffer.Pointer = AcpiGbl_DbBuffer; +        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE; -        Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnObj); +        Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnBuffer);          if (ACPI_FAILURE (Status))          {              AcpiOsPrintf ("Could not evaluate _PRS: %s\n", @@ -959,10 +976,10 @@ GetPrs:              goto GetAei;          } -        ReturnObj.Pointer = AcpiGbl_DbBuffer; -        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE; +        ReturnBuffer.Pointer = AcpiGbl_DbBuffer; +        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE; -        Status = AcpiGetPossibleResources (Node, &ReturnObj); +        Status = AcpiGetPossibleResources (Node, &ReturnBuffer);          if (ACPI_FAILURE (Status))          {              AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n", @@ -981,10 +998,10 @@ GetAei:      {          AcpiOsPrintf ("Evaluating _AEI\n"); -        ReturnObj.Pointer = AcpiGbl_DbBuffer; -        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE; +        ReturnBuffer.Pointer = AcpiGbl_DbBuffer; +        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE; -        Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnObj); +        Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnBuffer);          if (ACPI_FAILURE (Status))          {              AcpiOsPrintf ("Could not evaluate _AEI: %s\n", @@ -992,10 +1009,10 @@ GetAei:              goto Cleanup;          } -        ReturnObj.Pointer = AcpiGbl_DbBuffer; -        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE; +        ReturnBuffer.Pointer = AcpiGbl_DbBuffer; +        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE; -        Status = AcpiGetEventResources (Node, &ReturnObj); +        Status = AcpiGetEventResources (Node, &ReturnBuffer);          if (ACPI_FAILURE (Status))          {              AcpiOsPrintf ("AcpiGetEventResources failed: %s\n", @@ -1017,8 +1034,9 @@ Cleanup:   *   * FUNCTION:    AcpiDbDisplayResources   * - * PARAMETERS:  ObjectArg       - String object name or object pointer. - *                                "*" means "display resources for all devices" + * PARAMETERS:  ObjectArg           - String object name or object pointer. + *                                    "*" means "display resources for all + *                                    devices"   *   * RETURN:      None   * @@ -1071,13 +1089,13 @@ AcpiDbDisplayResources (   *   * FUNCTION:    AcpiDbGenerateGpe   * - * PARAMETERS:  GpeArg          - Raw GPE number, ascii string - *              BlockArg        - GPE block number, ascii string - *                                0 or 1 for FADT GPE blocks + * PARAMETERS:  GpeArg              - Raw GPE number, ascii string + *              BlockArg            - GPE block number, ascii string + *                                    0 or 1 for FADT GPE blocks   *   * RETURN:      None   * - * DESCRIPTION: Generate a GPE + * DESCRIPTION: Simulate firing of a GPE   *   ******************************************************************************/ diff --git a/source/components/debugger/dbconvert.c b/source/components/debugger/dbconvert.c new file mode 100644 index 000000000000..78a990b8f523 --- /dev/null +++ b/source/components/debugger/dbconvert.c @@ -0,0 +1,525 @@ +/******************************************************************************* + * + * Module Name: dbconvert - debugger miscellaneous conversion routines + * + ******************************************************************************/ + +/* + * Copyright (C) 2000 - 2012, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions, and the following disclaimer, + *    without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + *    substantially similar to the "NO WARRANTY" disclaimer below + *    ("Disclaimer") and any redistribution must be conditioned upon + *    including a substantially similar Disclaimer requirement for further + *    binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + *    of any contributors may be used to endorse or promote products derived + *    from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + */ + + +#include "acpi.h" +#include "accommon.h" +#include "acdebug.h" + +#ifdef ACPI_DEBUGGER + +#define _COMPONENT          ACPI_CA_DEBUGGER +        ACPI_MODULE_NAME    ("dbconvert") + + +#define DB_DEFAULT_PKG_ELEMENTS     33 + + +/******************************************************************************* + * + * FUNCTION:    AcpiDbHexCharToValue + * + * PARAMETERS:  HexChar             - Ascii Hex digit, 0-9|a-f|A-F + *              ReturnValue         - Where the converted value is returned + * + * RETURN:      Status + * + * DESCRIPTION: Convert a single hex character to a 4-bit number (0-16). + * + ******************************************************************************/ + +ACPI_STATUS +AcpiDbHexCharToValue ( +    int                     HexChar, +    UINT8                   *ReturnValue) +{ +    UINT8                   Value; + + +    /* Digit must be ascii [0-9a-fA-F] */ + +    if (!ACPI_IS_XDIGIT (HexChar)) +    { +        return (AE_BAD_HEX_CONSTANT); +    } + +    if (HexChar <= 0x39) +    { +        Value = (UINT8) (HexChar - 0x30); +    } +    else +    { +        Value = (UINT8) (ACPI_TOUPPER (HexChar) - 0x37); +    } + +    *ReturnValue = Value; +    return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiDbHexByteToBinary + * + * PARAMETERS:  HexByte             - Double hex digit (0x00 - 0xFF) in format: + *                                    HiByte then LoByte. + *              ReturnValue         - Where the converted value is returned + * + * RETURN:      Status + * + * DESCRIPTION: Convert two hex characters to an 8 bit number (0 - 255). + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiDbHexByteToBinary ( +    char                    *HexByte, +    UINT8                   *ReturnValue) +{ +    UINT8                   Local0; +    UINT8                   Local1; +    ACPI_STATUS             Status; + + +    /* High byte */ + +    Status = AcpiDbHexCharToValue (HexByte[0], &Local0); +    if (ACPI_FAILURE (Status)) +    { +        return (Status); +    } + +    /* Low byte */ + +    Status = AcpiDbHexCharToValue (HexByte[1], &Local1); +    if (ACPI_FAILURE (Status)) +    { +        return (Status); +    } + +    *ReturnValue = (UINT8) ((Local0 << 4) | Local1); +    return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiDbConvertToBuffer + * + * PARAMETERS:  String              - Input string to be converted + *              Object              - Where the buffer object is returned + * + * RETURN:      Status + * + * DESCRIPTION: Convert a string to a buffer object. String is treated a list + *              of buffer elements, each separated by a space or comma. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiDbConvertToBuffer ( +    char                    *String, +    ACPI_OBJECT             *Object) +{ +    UINT32                  i; +    UINT32                  j; +    UINT32                  Length; +    UINT8                   *Buffer; +    ACPI_STATUS             Status; + + +    /* Generate the final buffer length */ + +    for (i = 0, Length = 0; String[i];) +    { +        i+=2; +        Length++; + +        while (String[i] && +              ((String[i] == ',') || (String[i] == ' '))) +        { +            i++; +        } +    } + +    Buffer = ACPI_ALLOCATE (Length); +    if (!Buffer) +    { +        return (AE_NO_MEMORY); +    } + +    /* Convert the command line bytes to the buffer */ + +    for (i = 0, j = 0; String[i];) +    { +        Status = AcpiDbHexByteToBinary (&String[i], &Buffer[j]); +        if (ACPI_FAILURE (Status)) +        { +            ACPI_FREE (Buffer); +            return (Status); +        } + +        j++; +        i+=2; +        while (String[i] && +              ((String[i] == ',') || (String[i] == ' '))) +        { +            i++; +        } +    } + +    Object->Type = ACPI_TYPE_BUFFER; +    Object->Buffer.Pointer = Buffer; +    Object->Buffer.Length = Length; +    return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiDbConvertToPackage + * + * PARAMETERS:  String              - Input string to be converted + *              Object              - Where the package object is returned + * + * RETURN:      Status + * + * DESCRIPTION: Convert a string to a package object. Handles nested packages + *              via recursion with AcpiDbConvertToObject. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiDbConvertToPackage ( +    char                    *String, +    ACPI_OBJECT             *Object) +{ +    char                    *This; +    char                    *Next; +    UINT32                  i; +    ACPI_OBJECT_TYPE        Type; +    ACPI_OBJECT             *Elements; +    ACPI_STATUS             Status; + + +    Elements = ACPI_ALLOCATE_ZEROED ( +        DB_DEFAULT_PKG_ELEMENTS * sizeof (ACPI_OBJECT)); + +    This = String; +    for (i = 0; i < (DB_DEFAULT_PKG_ELEMENTS - 1); i++) +    { +        This = AcpiDbGetNextToken (This, &Next, &Type); +        if (!This) +        { +            break; +        } + +        /* Recursive call to convert each package element */ + +        Status = AcpiDbConvertToObject (Type, This, &Elements[i]); +        if (ACPI_FAILURE (Status)) +        { +            AcpiDbDeleteObjects (i + 1, Elements); +            ACPI_FREE (Elements); +            return (Status); +        } + +        This = Next; +    } + +    Object->Type = ACPI_TYPE_PACKAGE; +    Object->Package.Count = i; +    Object->Package.Elements = Elements; +    return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiDbConvertToObject + * + * PARAMETERS:  Type                - Object type as determined by parser + *              String              - Input string to be converted + *              Object              - Where the new object is returned + * + * RETURN:      Status + * + * DESCRIPTION: Convert a typed and tokenized string to an ACPI_OBJECT. Typing: + *              1) String objects were surrounded by quotes. + *              2) Buffer objects were surrounded by parentheses. + *              3) Package objects were surrounded by brackets "[]". + *              4) All standalone tokens are treated as integers. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiDbConvertToObject ( +    ACPI_OBJECT_TYPE        Type, +    char                    *String, +    ACPI_OBJECT             *Object) +{ +    ACPI_STATUS             Status = AE_OK; + + +    switch (Type) +    { +    case ACPI_TYPE_STRING: +        Object->Type = ACPI_TYPE_STRING; +        Object->String.Pointer = String; +        Object->String.Length = (UINT32) ACPI_STRLEN (String); +        break; + +    case ACPI_TYPE_BUFFER: +        Status = AcpiDbConvertToBuffer (String, Object); +        break; + +    case ACPI_TYPE_PACKAGE: +        Status = AcpiDbConvertToPackage (String, Object); +        break; + +    default: +        Object->Type = ACPI_TYPE_INTEGER; +        Status = AcpiUtStrtoul64 (String, 16, &Object->Integer.Value); +        break; +    } + +    return (Status); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiDbEncodePldBuffer + * + * PARAMETERS:  PldInfo             - _PLD buffer struct (Using local struct) + * + * RETURN:      Encode _PLD buffer suitable for return value from _PLD + * + * DESCRIPTION: Bit-packs a _PLD buffer struct. Used to test the _PLD macros + * + ******************************************************************************/ + +UINT8 * +AcpiDbEncodePldBuffer ( +    ACPI_PLD_INFO           *PldInfo) +{ +    UINT32                  *Buffer; +    UINT32                  Dword; + + +    Buffer = ACPI_ALLOCATE_ZEROED (ACPI_PLD_BUFFER_SIZE); +    if (!Buffer) +    { +        return (NULL); +    } + +    /* First 32 bits */ + +    Dword = 0; +    ACPI_PLD_SET_REVISION       (&Dword, PldInfo->Revision); +    ACPI_PLD_SET_IGNORE_COLOR   (&Dword, PldInfo->IgnoreColor); +    ACPI_PLD_SET_COLOR          (&Dword, PldInfo->Color); +    ACPI_MOVE_32_TO_32 (&Buffer[0], &Dword); + +    /* Second 32 bits */ + +    Dword = 0; +    ACPI_PLD_SET_WIDTH          (&Dword, PldInfo->Width); +    ACPI_PLD_SET_HEIGHT         (&Dword, PldInfo->Height); +    ACPI_MOVE_32_TO_32 (&Buffer[1], &Dword); + +    /* Third 32 bits */ + +    Dword = 0; +    ACPI_PLD_SET_USER_VISIBLE   (&Dword, PldInfo->UserVisible); +    ACPI_PLD_SET_DOCK           (&Dword, PldInfo->Dock); +    ACPI_PLD_SET_LID            (&Dword, PldInfo->Lid); +    ACPI_PLD_SET_PANEL          (&Dword, PldInfo->Panel); +    ACPI_PLD_SET_VERTICAL       (&Dword, PldInfo->VerticalPosition); +    ACPI_PLD_SET_HORIZONTAL     (&Dword, PldInfo->HorizontalPosition); +    ACPI_PLD_SET_SHAPE          (&Dword, PldInfo->Shape); +    ACPI_PLD_SET_ORIENTATION    (&Dword, PldInfo->GroupOrientation); +    ACPI_PLD_SET_TOKEN          (&Dword, PldInfo->GroupToken); +    ACPI_PLD_SET_POSITION       (&Dword, PldInfo->GroupPosition); +    ACPI_PLD_SET_BAY            (&Dword, PldInfo->Bay); +    ACPI_MOVE_32_TO_32 (&Buffer[2], &Dword); + +    /* Fourth 32 bits */ + +    Dword = 0; +    ACPI_PLD_SET_EJECTABLE      (&Dword, PldInfo->Ejectable); +    ACPI_PLD_SET_OSPM_EJECT     (&Dword, PldInfo->OspmEjectRequired); +    ACPI_PLD_SET_CABINET        (&Dword, PldInfo->CabinetNumber); +    ACPI_PLD_SET_CARD_CAGE      (&Dword, PldInfo->CardCageNumber); +    ACPI_PLD_SET_REFERENCE      (&Dword, PldInfo->Reference); +    ACPI_PLD_SET_ROTATION       (&Dword, PldInfo->Rotation); +    ACPI_PLD_SET_ORDER          (&Dword, PldInfo->Order); +    ACPI_MOVE_32_TO_32 (&Buffer[3], &Dword); + +    if (PldInfo->Revision >= 2) +    { +        /* Fifth 32 bits */ + +        Dword = 0; +        ACPI_PLD_SET_VERT_OFFSET    (&Dword, PldInfo->VerticalOffset); +        ACPI_PLD_SET_HORIZ_OFFSET   (&Dword, PldInfo->HorizontalOffset); +        ACPI_MOVE_32_TO_32 (&Buffer[4], &Dword); +    } + +    return (ACPI_CAST_PTR (UINT8, Buffer)); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiDbDumpPldBuffer + * + * PARAMETERS:  ObjDesc             - Object returned from _PLD method + * + * RETURN:      None. + * + * DESCRIPTION: Dumps formatted contents of a _PLD return buffer. + * + ******************************************************************************/ + +#define ACPI_PLD_OUTPUT     "%20s : %-6X\n" + +void +AcpiDbDumpPldBuffer ( +    ACPI_OBJECT             *ObjDesc) +{ +    ACPI_OBJECT             *BufferDesc; +    ACPI_PLD_INFO           *PldInfo; +    UINT8                   *NewBuffer; +    ACPI_STATUS             Status; + + +    /* Object must be of type Package with at least one Buffer element */ + +    if (ObjDesc->Type != ACPI_TYPE_PACKAGE) +    { +        return; +    } + +    BufferDesc = &ObjDesc->Package.Elements[0]; +    if (BufferDesc->Type != ACPI_TYPE_BUFFER) +    { +        return; +    } + +    /* Convert _PLD buffer to local _PLD struct */ + +    Status = AcpiDecodePldBuffer (BufferDesc->Buffer.Pointer, +        BufferDesc->Buffer.Length, &PldInfo); +    if (ACPI_FAILURE (Status)) +    { +        return; +    } + +    /* Encode local _PLD struct back to a _PLD buffer */ + +    NewBuffer = AcpiDbEncodePldBuffer (PldInfo); +    if (!NewBuffer) +    { +        return; +    } + +    /* The two bit-packed buffers should match */ + +    if (ACPI_MEMCMP (NewBuffer, BufferDesc->Buffer.Pointer, +        BufferDesc->Buffer.Length)) +    { +        AcpiOsPrintf ("Converted _PLD buffer does not compare. New:\n"); + +        AcpiUtDumpBuffer (NewBuffer, +            BufferDesc->Buffer.Length, DB_BYTE_DISPLAY, 0); +    } + +    /* First 32-bit dword */ + +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Revision", PldInfo->Revision); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "IgnoreColor", PldInfo->IgnoreColor); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Color", PldInfo->Color); + +    /* Second 32-bit dword */ + +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Width", PldInfo->Width); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Height", PldInfo->Height); + +    /* Third 32-bit dword */ + +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "UserVisible", PldInfo->UserVisible); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Dock", PldInfo->Dock); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Lid", PldInfo->Lid); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Panel", PldInfo->Panel); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "VerticalPosition", PldInfo->VerticalPosition); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "HorizontalPosition", PldInfo->HorizontalPosition); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Shape", PldInfo->Shape); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "GroupOrientation", PldInfo->GroupOrientation); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "GroupToken", PldInfo->GroupToken); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "GroupPosition", PldInfo->GroupPosition); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Bay", PldInfo->Bay); + +    /* Fourth 32-bit dword */ + +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Ejectable", PldInfo->Ejectable); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "OspmEjectRequired", PldInfo->OspmEjectRequired); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "CabinetNumber", PldInfo->CabinetNumber); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "CardCageNumber", PldInfo->CardCageNumber); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Reference", PldInfo->Reference); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Rotation", PldInfo->Rotation); +    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Order", PldInfo->Order); + +    /* Fifth 32-bit dword */ + +    if (BufferDesc->Buffer.Length > 16) +    { +        AcpiOsPrintf (ACPI_PLD_OUTPUT, "VerticalOffset", PldInfo->VerticalOffset); +        AcpiOsPrintf (ACPI_PLD_OUTPUT, "HorizontalOffset", PldInfo->HorizontalOffset); +    } + +    ACPI_FREE (PldInfo); +    ACPI_FREE (NewBuffer); +} + +#endif /* ACPI_DEBUGGER */ diff --git a/source/components/debugger/dbexec.c b/source/components/debugger/dbexec.c index 1644fc23a5f8..19cf05616141 100644 --- a/source/components/debugger/dbexec.c +++ b/source/components/debugger/dbexec.c @@ -54,7 +54,6 @@  static ACPI_DB_METHOD_INFO          AcpiGbl_DbMethodInfo; -#define DB_DEFAULT_PKG_ELEMENTS     33  /* Local prototypes */ @@ -82,308 +81,6 @@ AcpiDbExecutionWalk (      void                    *Context,      void                    **ReturnValue); -static ACPI_STATUS -AcpiDbHexCharToValue ( -    int                     HexChar, -    UINT8                   *ReturnValue); - -static ACPI_STATUS -AcpiDbConvertToPackage ( -    char                    *String, -    ACPI_OBJECT             *Object); - -static ACPI_STATUS -AcpiDbConvertToObject ( -    ACPI_OBJECT_TYPE        Type, -    char                    *String, -    ACPI_OBJECT             *Object); - -static void -AcpiDbDeleteObjects ( -    UINT32                  Count, -    ACPI_OBJECT             *Objects); - - -static UINT8 * -AcpiDbEncodePldBuffer ( -    ACPI_PLD_INFO           *PldInfo); - -static void -AcpiDbDumpPldBuffer ( -    ACPI_OBJECT             *ObjDesc); - - -/******************************************************************************* - * - * FUNCTION:    AcpiDbHexCharToValue - * - * PARAMETERS:  HexChar             - Ascii Hex digit, 0-9|a-f|A-F - *              ReturnValue         - Where the converted value is returned - * - * RETURN:      Status - * - * DESCRIPTION: Convert a single hex character to a 4-bit number (0-16). - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiDbHexCharToValue ( -    int                     HexChar, -    UINT8                   *ReturnValue) -{ -    UINT8                   Value; - - -    /* Digit must be ascii [0-9a-fA-F] */ - -    if (!ACPI_IS_XDIGIT (HexChar)) -    { -        return (AE_BAD_HEX_CONSTANT); -    } - -    if (HexChar <= 0x39) -    { -        Value = (UINT8) (HexChar - 0x30); -    } -    else -    { -        Value = (UINT8) (ACPI_TOUPPER (HexChar) - 0x37); -    } - -    *ReturnValue = Value; -    return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiDbHexByteToBinary - * - * PARAMETERS:  HexByte             - Double hex digit (0x00 - 0xFF) in format: - *                                    HiByte then LoByte. - *              ReturnValue         - Where the converted value is returned - * - * RETURN:      Status - * - * DESCRIPTION: Convert two hex characters to an 8 bit number (0 - 255). - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiDbHexByteToBinary ( -    char                    *HexByte, -    UINT8                   *ReturnValue) -{ -    UINT8                   Local0; -    UINT8                   Local1; -    ACPI_STATUS             Status; - - -    /* High byte */ - -    Status = AcpiDbHexCharToValue (HexByte[0], &Local0); -    if (ACPI_FAILURE (Status)) -    { -        return (Status); -    } - -    /* Low byte */ - -    Status = AcpiDbHexCharToValue (HexByte[1], &Local1); -    if (ACPI_FAILURE (Status)) -    { -        return (Status); -    } - -    *ReturnValue = (UINT8) ((Local0 << 4) | Local1); -    return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiDbConvertToBuffer - * - * PARAMETERS:  String              - Input string to be converted - *              Object              - Where the buffer object is returned - * - * RETURN:      Status - * - * DESCRIPTION: Convert a string to a buffer object. String is treated a list - *              of buffer elements, each separated by a space or comma. - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiDbConvertToBuffer ( -    char                    *String, -    ACPI_OBJECT             *Object) -{ -    UINT32                  i; -    UINT32                  j; -    UINT32                  Length; -    UINT8                   *Buffer; -    ACPI_STATUS             Status; - - -    /* Generate the final buffer length */ - -    for (i = 0, Length = 0; String[i];) -    { -        i+=2; -        Length++; - -        while (String[i] && -              ((String[i] == ',') || (String[i] == ' '))) -        { -            i++; -        } -    } - -    Buffer = ACPI_ALLOCATE (Length); -    if (!Buffer) -    { -        return (AE_NO_MEMORY); -    } - -    /* Convert the command line bytes to the buffer */ - -    for (i = 0, j = 0; String[i];) -    { -        Status = AcpiDbHexByteToBinary (&String[i], &Buffer[j]); -        if (ACPI_FAILURE (Status)) -        { -            ACPI_FREE (Buffer); -            return (Status); -        } - -        j++; -        i+=2; -        while (String[i] && -              ((String[i] == ',') || (String[i] == ' '))) -        { -            i++; -        } -    } - -    Object->Type = ACPI_TYPE_BUFFER; -    Object->Buffer.Pointer = Buffer; -    Object->Buffer.Length = Length; -    return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiDbConvertToPackage - * - * PARAMETERS:  String              - Input string to be converted - *              Object              - Where the package object is returned - * - * RETURN:      Status - * - * DESCRIPTION: Convert a string to a package object. Handles nested packages - *              via recursion with AcpiDbConvertToObject. - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiDbConvertToPackage ( -    char                    *String, -    ACPI_OBJECT             *Object) -{ -    char                    *This; -    char                    *Next; -    UINT32                  i; -    ACPI_OBJECT_TYPE        Type; -    ACPI_OBJECT             *Elements; -    ACPI_STATUS             Status; - - -    Elements = ACPI_ALLOCATE_ZEROED ( -        DB_DEFAULT_PKG_ELEMENTS * sizeof (ACPI_OBJECT)); - -    This = String; -    for (i = 0; i < (DB_DEFAULT_PKG_ELEMENTS - 1); i++) -    { -        This = AcpiDbGetNextToken (This, &Next, &Type); -        if (!This) -        { -            break; -        } - -        /* Recursive call to convert each package element */ - -        Status = AcpiDbConvertToObject (Type, This, &Elements[i]); -        if (ACPI_FAILURE (Status)) -        { -            AcpiDbDeleteObjects (i + 1, Elements); -            ACPI_FREE (Elements); -            return (Status); -        } - -        This = Next; -    } - -    Object->Type = ACPI_TYPE_PACKAGE; -    Object->Package.Count = i; -    Object->Package.Elements = Elements; -    return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiDbConvertToObject - * - * PARAMETERS:  Type                - Object type as determined by parser - *              String              - Input string to be converted - *              Object              - Where the new object is returned - * - * RETURN:      Status - * - * DESCRIPTION: Convert a typed and tokenized string to an ACPI_OBJECT. Typing: - *              1) String objects were surrounded by quotes. - *              2) Buffer objects were surrounded by parentheses. - *              3) Package objects were surrounded by brackets "[]". - *              4) All standalone tokens are treated as integers. - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiDbConvertToObject ( -    ACPI_OBJECT_TYPE        Type, -    char                    *String, -    ACPI_OBJECT             *Object) -{ -    ACPI_STATUS             Status = AE_OK; - - -    switch (Type) -    { -    case ACPI_TYPE_STRING: -        Object->Type = ACPI_TYPE_STRING; -        Object->String.Pointer = String; -        Object->String.Length = (UINT32) ACPI_STRLEN (String); -        break; - -    case ACPI_TYPE_BUFFER: -        Status = AcpiDbConvertToBuffer (String, Object); -        break; - -    case ACPI_TYPE_PACKAGE: -        Status = AcpiDbConvertToPackage (String, Object); -        break; - -    default: -        Object->Type = ACPI_TYPE_INTEGER; -        Status = AcpiUtStrtoul64 (String, 16, &Object->Integer.Value); -        break; -    } - -    return (Status); -} -  /*******************************************************************************   * @@ -399,7 +96,7 @@ AcpiDbConvertToObject (   *   ******************************************************************************/ -static void +void  AcpiDbDeleteObjects (      UINT32                  Count,      ACPI_OBJECT             *Objects) @@ -720,202 +417,6 @@ AcpiDbExecutionWalk (  /*******************************************************************************   * - * FUNCTION:    AcpiDbEncodePldBuffer - * - * PARAMETERS:  PldInfo             - _PLD buffer struct (Using local struct) - * - * RETURN:      Encode _PLD buffer suitable for return value from _PLD - * - * DESCRIPTION: Bit-packs a _PLD buffer struct. Used to test the _PLD macros - * - ******************************************************************************/ - -static UINT8 * -AcpiDbEncodePldBuffer ( -    ACPI_PLD_INFO           *PldInfo) -{ -    UINT32                  *Buffer; -    UINT32                  Dword; - - -    Buffer = ACPI_ALLOCATE_ZEROED (ACPI_PLD_BUFFER_SIZE); -    if (!Buffer) -    { -        return (NULL); -    } - -    /* First 32 bits */ - -    Dword = 0; -    ACPI_PLD_SET_REVISION       (&Dword, PldInfo->Revision); -    ACPI_PLD_SET_IGNORE_COLOR   (&Dword, PldInfo->IgnoreColor); -    ACPI_PLD_SET_COLOR          (&Dword, PldInfo->Color); -    ACPI_MOVE_32_TO_32 (&Buffer[0], &Dword); - -    /* Second 32 bits */ - -    Dword = 0; -    ACPI_PLD_SET_WIDTH          (&Dword, PldInfo->Width); -    ACPI_PLD_SET_HEIGHT         (&Dword, PldInfo->Height); -    ACPI_MOVE_32_TO_32 (&Buffer[1], &Dword); - -    /* Third 32 bits */ - -    Dword = 0; -    ACPI_PLD_SET_USER_VISIBLE   (&Dword, PldInfo->UserVisible); -    ACPI_PLD_SET_DOCK           (&Dword, PldInfo->Dock); -    ACPI_PLD_SET_LID            (&Dword, PldInfo->Lid); -    ACPI_PLD_SET_PANEL          (&Dword, PldInfo->Panel); -    ACPI_PLD_SET_VERTICAL       (&Dword, PldInfo->VerticalPosition); -    ACPI_PLD_SET_HORIZONTAL     (&Dword, PldInfo->HorizontalPosition); -    ACPI_PLD_SET_SHAPE          (&Dword, PldInfo->Shape); -    ACPI_PLD_SET_ORIENTATION    (&Dword, PldInfo->GroupOrientation); -    ACPI_PLD_SET_TOKEN          (&Dword, PldInfo->GroupToken); -    ACPI_PLD_SET_POSITION       (&Dword, PldInfo->GroupPosition); -    ACPI_PLD_SET_BAY            (&Dword, PldInfo->Bay); -    ACPI_MOVE_32_TO_32 (&Buffer[2], &Dword); - -    /* Fourth 32 bits */ - -    Dword = 0; -    ACPI_PLD_SET_EJECTABLE      (&Dword, PldInfo->Ejectable); -    ACPI_PLD_SET_OSPM_EJECT     (&Dword, PldInfo->OspmEjectRequired); -    ACPI_PLD_SET_CABINET        (&Dword, PldInfo->CabinetNumber); -    ACPI_PLD_SET_CARD_CAGE      (&Dword, PldInfo->CardCageNumber); -    ACPI_PLD_SET_REFERENCE      (&Dword, PldInfo->Reference); -    ACPI_PLD_SET_ROTATION       (&Dword, PldInfo->Rotation); -    ACPI_PLD_SET_ORDER          (&Dword, PldInfo->Order); -    ACPI_MOVE_32_TO_32 (&Buffer[3], &Dword); - -    if (PldInfo->Revision >= 2) -    { -        /* Fifth 32 bits */ - -        Dword = 0; -        ACPI_PLD_SET_VERT_OFFSET    (&Dword, PldInfo->VerticalOffset); -        ACPI_PLD_SET_HORIZ_OFFSET   (&Dword, PldInfo->HorizontalOffset); -        ACPI_MOVE_32_TO_32 (&Buffer[4], &Dword); -    } - -    return (ACPI_CAST_PTR (UINT8, Buffer)); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiDbDumpPldBuffer - * - * PARAMETERS:  ObjDesc             - Object returned from _PLD method - * - * RETURN:      None. - * - * DESCRIPTION: Dumps formatted contents of a _PLD return buffer. - * - ******************************************************************************/ - -#define ACPI_PLD_OUTPUT     "%20s : %-6X\n" - -static void -AcpiDbDumpPldBuffer ( -    ACPI_OBJECT             *ObjDesc) -{ -    ACPI_OBJECT             *BufferDesc; -    ACPI_PLD_INFO           *PldInfo; -    UINT8                   *NewBuffer; -    ACPI_STATUS             Status; - - -    /* Object must be of type Package with at least one Buffer element */ - -    if (ObjDesc->Type != ACPI_TYPE_PACKAGE) -    { -        return; -    } - -    BufferDesc = &ObjDesc->Package.Elements[0]; -    if (BufferDesc->Type != ACPI_TYPE_BUFFER) -    { -        return; -    } - -    /* Convert _PLD buffer to local _PLD struct */ - -    Status = AcpiDecodePldBuffer (BufferDesc->Buffer.Pointer, -        BufferDesc->Buffer.Length, &PldInfo); -    if (ACPI_FAILURE (Status)) -    { -        return; -    } - -    /* Encode local _PLD struct back to a _PLD buffer */ - -    NewBuffer = AcpiDbEncodePldBuffer (PldInfo); -    if (!NewBuffer) -    { -        return; -    } - -    /* The two bit-packed buffers should match */ - -    if (ACPI_MEMCMP (NewBuffer, BufferDesc->Buffer.Pointer, -        BufferDesc->Buffer.Length)) -    { -        AcpiOsPrintf ("Converted _PLD buffer does not compare. New:\n"); - -        AcpiUtDumpBuffer (NewBuffer, -            BufferDesc->Buffer.Length, DB_BYTE_DISPLAY, 0); -    } - -    /* First 32-bit dword */ - -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Revision", PldInfo->Revision); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "IgnoreColor", PldInfo->IgnoreColor); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Color", PldInfo->Color); - -    /* Second 32-bit dword */ - -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Width", PldInfo->Width); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Height", PldInfo->Height); - -    /* Third 32-bit dword */ - -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "UserVisible", PldInfo->UserVisible); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Dock", PldInfo->Dock); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Lid", PldInfo->Lid); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Panel", PldInfo->Panel); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "VerticalPosition", PldInfo->VerticalPosition); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "HorizontalPosition", PldInfo->HorizontalPosition); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Shape", PldInfo->Shape); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "GroupOrientation", PldInfo->GroupOrientation); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "GroupToken", PldInfo->GroupToken); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "GroupPosition", PldInfo->GroupPosition); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Bay", PldInfo->Bay); - -    /* Fourth 32-bit dword */ - -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Ejectable", PldInfo->Ejectable); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "OspmEjectRequired", PldInfo->OspmEjectRequired); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "CabinetNumber", PldInfo->CabinetNumber); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "CardCageNumber", PldInfo->CardCageNumber); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Reference", PldInfo->Reference); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Rotation", PldInfo->Rotation); -    AcpiOsPrintf (ACPI_PLD_OUTPUT, "Order", PldInfo->Order); - -    /* Fifth 32-bit dword */ - -    if (BufferDesc->Buffer.Length > 16) -    { -        AcpiOsPrintf (ACPI_PLD_OUTPUT, "VerticalOffset", PldInfo->VerticalOffset); -        AcpiOsPrintf (ACPI_PLD_OUTPUT, "HorizontalOffset", PldInfo->HorizontalOffset); -    } - -    ACPI_FREE (PldInfo); -    ACPI_FREE (NewBuffer); -} - - -/******************************************************************************* - *   * FUNCTION:    AcpiDbExecute   *   * PARAMETERS:  Name                - Name of method to execute @@ -983,12 +484,10 @@ AcpiDbExecute (          Status = AcpiGetHandle (NULL, AcpiGbl_DbMethodInfo.Pathname,              &AcpiGbl_DbMethodInfo.Method); -        if (ACPI_FAILURE (Status)) +        if (ACPI_SUCCESS (Status))          { -            return; +            Status = AcpiDbExecuteMethod (&AcpiGbl_DbMethodInfo, &ReturnObj);          } - -        Status = AcpiDbExecuteMethod (&AcpiGbl_DbMethodInfo, &ReturnObj);          ACPI_FREE (NameString);      } @@ -998,7 +497,6 @@ AcpiDbExecute (       */      AcpiOsSleep ((UINT64) 10); -  #ifdef ACPI_DEBUG_OUTPUT      /* Memory allocation tracking */ diff --git a/source/components/debugger/dbinput.c b/source/components/debugger/dbinput.c index d9c01c8c4ab3..077ad7ebae8f 100644 --- a/source/components/debugger/dbinput.c +++ b/source/components/debugger/dbinput.c @@ -1168,6 +1168,8 @@ AcpiDbUserCommands (      ACPI_STATUS             Status = AE_OK; +    AcpiOsPrintf ("\n"); +      /* TBD: [Restructure] Need a separate command line buffer for step mode */      while (!AcpiGbl_DbTerminateThreads) diff --git a/source/components/debugger/dbmethod.c b/source/components/debugger/dbmethod.c index c3266c51e259..4e36aa51535e 100644 --- a/source/components/debugger/dbmethod.c +++ b/source/components/debugger/dbmethod.c @@ -394,7 +394,7 @@ AcpiDbDisassembleMethod (      WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;      Status = AcpiPsParseAml (WalkState); -    AcpiDmParseDeferredOps (Op); +    (void) AcpiDmParseDeferredOps (Op);      /* Now we can disassemble the method */ diff --git a/source/components/debugger/dbnames.c b/source/components/debugger/dbnames.c index a51c08d2cb98..d356019c6544 100644 --- a/source/components/debugger/dbnames.c +++ b/source/components/debugger/dbnames.c @@ -159,7 +159,7 @@ AcpiDbSetScope (      AcpiDbPrepNamestring (Name); -    if (Name[0] == '\\') +    if (ACPI_IS_ROOT_PREFIX (Name[0]))      {          /* Validate new scope from the root */ diff --git a/source/components/debugger/dbutils.c b/source/components/debugger/dbutils.c index 947dd9d93a7b..7da73c1debd1 100644 --- a/source/components/debugger/dbutils.c +++ b/source/components/debugger/dbutils.c @@ -286,7 +286,7 @@ AcpiDbPrepNamestring (      /* Ignore a leading backslash, this is the root prefix */ -    if (*Name == '\\') +    if (ACPI_IS_ROOT_PREFIX (*Name))      {          Name++;      } diff --git a/source/components/debugger/dbxface.c b/source/components/debugger/dbxface.c index 0a7b9465eb1d..c9388dcf98ca 100644 --- a/source/components/debugger/dbxface.c +++ b/source/components/debugger/dbxface.c @@ -433,7 +433,7 @@ AcpiDbInitialize (      /* Initial scope is the root */ -    AcpiGbl_DbScopeBuf [0] = '\\'; +    AcpiGbl_DbScopeBuf [0] = AML_ROOT_PREFIX;      AcpiGbl_DbScopeBuf [1] =  0;      AcpiGbl_DbScopeNode = AcpiGbl_RootNode; diff --git a/source/components/disassembler/dmdeferred.c b/source/components/disassembler/dmdeferred.c index a3f40aee9b1a..40b4d9e85449 100644 --- a/source/components/disassembler/dmdeferred.c +++ b/source/components/disassembler/dmdeferred.c @@ -83,7 +83,7 @@ AcpiDmParseDeferredOps (      ACPI_STATUS             Status; -    ACPI_FUNCTION_NAME (DmParseDeferredOps); +    ACPI_FUNCTION_ENTRY ();      /* Traverse the entire parse tree */ diff --git a/source/components/disassembler/dmnames.c b/source/components/disassembler/dmnames.c index 7284721fd569..35ed7cabe97f 100644 --- a/source/components/disassembler/dmnames.c +++ b/source/components/disassembler/dmnames.c @@ -44,7 +44,6 @@  #include "acpi.h"  #include "accommon.h" -#include "acparser.h"  #include "amlcode.h"  #include "acnamesp.h"  #include "acdisasm.h" @@ -226,7 +225,8 @@ AcpiDmNamestring (      /* Handle all Scope Prefix operators */ -    while (AcpiPsIsPrefixChar (ACPI_GET8 (Name))) +    while (ACPI_IS_ROOT_PREFIX (ACPI_GET8 (Name)) || +           ACPI_IS_PARENT_PREFIX (ACPI_GET8 (Name)))      {          /* Append prefix character */ @@ -323,7 +323,7 @@ AcpiDmDisplayPath (          if ((NamePath) &&              (NamePath->Common.Value.String) && -            (NamePath->Common.Value.String[0] == '\\')) +            (ACPI_IS_ROOT_PREFIX (NamePath->Common.Value.String[0])))          {              AcpiDmNamestring (NamePath->Common.Value.String);              return; diff --git a/source/components/disassembler/dmresrc.c b/source/components/disassembler/dmresrc.c index bf2a4d4da496..89c01fac78df 100644 --- a/source/components/disassembler/dmresrc.c +++ b/source/components/disassembler/dmresrc.c @@ -415,7 +415,8 @@ AcpiDmIsResourceTemplate (      /* Walk the byte list, abort on any invalid descriptor type or length */ -    Status = AcpiUtWalkAmlResources (WalkState, Aml, Length, NULL, &EndAml); +    Status = AcpiUtWalkAmlResources (WalkState, Aml, Length, +        NULL, (void **) &EndAml);      if (ACPI_FAILURE (Status))      {          return (AE_TYPE); diff --git a/source/components/dispatcher/dsmethod.c b/source/components/dispatcher/dsmethod.c index 97d52b87f4eb..fbec94b991cb 100644 --- a/source/components/dispatcher/dsmethod.c +++ b/source/components/dispatcher/dsmethod.c @@ -163,6 +163,7 @@ AcpiDsCreateMethodMutex (      Status = AcpiOsCreateMutex (&MutexDesc->Mutex.OsMutex);      if (ACPI_FAILURE (Status))      { +        AcpiUtDeleteObjectDesc (MutexDesc);          return_ACPI_STATUS (Status);      } diff --git a/source/components/dispatcher/dsobject.c b/source/components/dispatcher/dsobject.c index 24a5c09bc045..c3fa608c7db0 100644 --- a/source/components/dispatcher/dsobject.c +++ b/source/components/dispatcher/dsobject.c @@ -734,7 +734,7 @@ AcpiDsInitObjectFromOp (                  /* Truncate value if we are executing from a 32-bit ACPI table */  #ifndef ACPI_NO_METHOD_EXECUTION -                AcpiExTruncateFor32bitTable (ObjDesc); +                (void) AcpiExTruncateFor32bitTable (ObjDesc);  #endif                  break; @@ -756,8 +756,17 @@ AcpiDsInitObjectFromOp (          case AML_TYPE_LITERAL:              ObjDesc->Integer.Value = Op->Common.Value.Integer; +  #ifndef ACPI_NO_METHOD_EXECUTION -            AcpiExTruncateFor32bitTable (ObjDesc); +            if (AcpiExTruncateFor32bitTable (ObjDesc)) +            { +                /* Warn if we found a 64-bit constant in a 32-bit table */ + +                ACPI_WARNING ((AE_INFO, +                    "Truncated 64-bit constant found in 32-bit table: %8.8X%8.8X => %8.8X", +                    ACPI_FORMAT_UINT64 (Op->Common.Value.Integer), +                    (UINT32) ObjDesc->Integer.Value)); +            }  #endif              break; diff --git a/source/components/dispatcher/dsutils.c b/source/components/dispatcher/dsutils.c index 2cabdc680bad..545ca8fbb97c 100644 --- a/source/components/dispatcher/dsutils.c +++ b/source/components/dispatcher/dsutils.c @@ -201,7 +201,7 @@ AcpiDsIsResultUsed (      if (!Op)      {          ACPI_ERROR ((AE_INFO, "Null Op")); -        return_UINT8 (TRUE); +        return_VALUE (TRUE);      }      /* @@ -231,7 +231,7 @@ AcpiDsIsResultUsed (          ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,              "At Method level, result of [%s] not used\n",              AcpiPsGetOpcodeName (Op->Common.AmlOpcode))); -        return_UINT8 (FALSE); +        return_VALUE (FALSE);      }      /* Get info on the parent. The RootOp is AML_SCOPE */ @@ -241,7 +241,7 @@ AcpiDsIsResultUsed (      {          ACPI_ERROR ((AE_INFO,              "Unknown parent opcode Op=%p", Op)); -        return_UINT8 (FALSE); +        return_VALUE (FALSE);      }      /* @@ -331,7 +331,7 @@ ResultUsed:          AcpiPsGetOpcodeName (Op->Common.AmlOpcode),          AcpiPsGetOpcodeName (Op->Common.Parent->Common.AmlOpcode), Op)); -    return_UINT8 (TRUE); +    return_VALUE (TRUE);  ResultNotUsed: @@ -340,7 +340,7 @@ ResultNotUsed:          AcpiPsGetOpcodeName (Op->Common.AmlOpcode),          AcpiPsGetOpcodeName (Op->Common.Parent->Common.AmlOpcode), Op)); -    return_UINT8 (FALSE); +    return_VALUE (FALSE);  } diff --git a/source/components/dispatcher/dswexec.c b/source/components/dispatcher/dswexec.c index 0d38b739eee4..a51a85b84f4f 100644 --- a/source/components/dispatcher/dswexec.c +++ b/source/components/dispatcher/dswexec.c @@ -164,7 +164,7 @@ AcpiDsGetPredicateValue (      /* Truncate the predicate to 32-bits if necessary */ -    AcpiExTruncateFor32bitTable (LocalObjDesc); +    (void) AcpiExTruncateFor32bitTable (LocalObjDesc);      /*       * Save the result of the predicate evaluation on @@ -739,7 +739,7 @@ AcpiDsExecEndOp (       * ACPI 2.0 support for 64-bit integers: Truncate numeric       * result value if we are executing from a 32-bit ACPI table       */ -    AcpiExTruncateFor32bitTable (WalkState->ResultObj); +    (void) AcpiExTruncateFor32bitTable (WalkState->ResultObj);      /*       * Check if we just completed the evaluation of a diff --git a/source/components/events/evgpe.c b/source/components/events/evgpe.c index 7c572b74f15d..897e5cde3f66 100644 --- a/source/components/events/evgpe.c +++ b/source/components/events/evgpe.c @@ -770,7 +770,7 @@ AcpiEvGpeDispatch (          {              ACPI_EXCEPTION ((AE_INFO, Status,                  "Unable to clear GPE%02X", GpeNumber)); -            return_UINT32 (ACPI_INTERRUPT_NOT_HANDLED); +            return_VALUE (ACPI_INTERRUPT_NOT_HANDLED);          }      } @@ -788,7 +788,7 @@ AcpiEvGpeDispatch (      {          ACPI_EXCEPTION ((AE_INFO, Status,              "Unable to disable GPE%02X", GpeNumber)); -        return_UINT32 (ACPI_INTERRUPT_NOT_HANDLED); +        return_VALUE (ACPI_INTERRUPT_NOT_HANDLED);      }      /* @@ -846,7 +846,7 @@ AcpiEvGpeDispatch (          break;      } -    return_UINT32 (ACPI_INTERRUPT_HANDLED); +    return_VALUE (ACPI_INTERRUPT_HANDLED);  }  #endif /* !ACPI_REDUCED_HARDWARE */ diff --git a/source/components/events/evgpeblk.c b/source/components/events/evgpeblk.c index c281855c2c8d..3183e2a20a9c 100644 --- a/source/components/events/evgpeblk.c +++ b/source/components/events/evgpeblk.c @@ -443,8 +443,8 @@ AcpiEvCreateGpeBlock (          (*ReturnGpeBlock) = GpeBlock;      } -    ACPI_DEBUG_PRINT ((ACPI_DB_INIT, -        "GPE %02X to %02X [%4.4s] %u regs on int 0x%X\n", +    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, +        "    Initialized GPE %02X to %02X [%4.4s] %u regs on interrupt 0x%X\n",          (UINT32) GpeBlock->BlockBaseNumber,          (UINT32) (GpeBlock->BlockBaseNumber + (GpeBlock->GpeCount - 1)),          GpeDevice->Name.Ascii, GpeBlock->RegisterCount, @@ -539,8 +539,10 @@ AcpiEvInitializeGpeBlock (      if (GpeEnabledCount)      { -        ACPI_DEBUG_PRINT ((ACPI_DB_INIT, -            "Enabled %u GPEs in this block\n", GpeEnabledCount)); +        ACPI_INFO ((AE_INFO, +            "Enabled %u GPEs in block %02X to %02X", GpeEnabledCount, +            (UINT32) GpeBlock->BlockBaseNumber, +            (UINT32) (GpeBlock->BlockBaseNumber + (GpeBlock->GpeCount - 1))));      }      GpeBlock->Initialized = TRUE; diff --git a/source/components/events/evgpeinit.c b/source/components/events/evgpeinit.c index f8962e947f27..e4bfb9229d9b 100644 --- a/source/components/events/evgpeinit.c +++ b/source/components/events/evgpeinit.c @@ -94,6 +94,9 @@ AcpiEvGpeInitialize (      ACPI_FUNCTION_TRACE (EvGpeInitialize); +    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, +        "Initializing General Purpose Events (GPEs):\n")); +      Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);      if (ACPI_FAILURE (Status))      { diff --git a/source/components/events/evhandler.c b/source/components/events/evhandler.c new file mode 100644 index 000000000000..609891a36fdd --- /dev/null +++ b/source/components/events/evhandler.c @@ -0,0 +1,578 @@ +/****************************************************************************** + * + * Module Name: evhandler - Support for Address Space handlers + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2012, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions, and the following disclaimer, + *    without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + *    substantially similar to the "NO WARRANTY" disclaimer below + *    ("Disclaimer") and any redistribution must be conditioned upon + *    including a substantially similar Disclaimer requirement for further + *    binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + *    of any contributors may be used to endorse or promote products derived + *    from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + */ + + +#define __EVHANDLER_C__ + +#include "acpi.h" +#include "accommon.h" +#include "acevents.h" +#include "acnamesp.h" +#include "acinterp.h" + +#define _COMPONENT          ACPI_EVENTS +        ACPI_MODULE_NAME    ("evhandler") + + +/* Local prototypes */ + +static ACPI_STATUS +AcpiEvInstallHandler ( +    ACPI_HANDLE             ObjHandle, +    UINT32                  Level, +    void                    *Context, +    void                    **ReturnValue); + +/* These are the address spaces that will get default handlers */ + +UINT8        AcpiGbl_DefaultAddressSpaces[ACPI_NUM_DEFAULT_SPACES] = +{ +    ACPI_ADR_SPACE_SYSTEM_MEMORY, +    ACPI_ADR_SPACE_SYSTEM_IO, +    ACPI_ADR_SPACE_PCI_CONFIG, +    ACPI_ADR_SPACE_DATA_TABLE +}; + + +/******************************************************************************* + * + * FUNCTION:    AcpiEvInstallRegionHandlers + * + * PARAMETERS:  None + * + * RETURN:      Status + * + * DESCRIPTION: Installs the core subsystem default address space handlers. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiEvInstallRegionHandlers ( +    void) +{ +    ACPI_STATUS             Status; +    UINT32                  i; + + +    ACPI_FUNCTION_TRACE (EvInstallRegionHandlers); + + +    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); +    if (ACPI_FAILURE (Status)) +    { +        return_ACPI_STATUS (Status); +    } + +    /* +     * All address spaces (PCI Config, EC, SMBus) are scope dependent and +     * registration must occur for a specific device. +     * +     * In the case of the system memory and IO address spaces there is +     * currently no device associated with the address space. For these we +     * use the root. +     * +     * We install the default PCI config space handler at the root so that +     * this space is immediately available even though the we have not +     * enumerated all the PCI Root Buses yet. This is to conform to the ACPI +     * specification which states that the PCI config space must be always +     * available -- even though we are nowhere near ready to find the PCI root +     * buses at this point. +     * +     * NOTE: We ignore AE_ALREADY_EXISTS because this means that a handler +     * has already been installed (via AcpiInstallAddressSpaceHandler). +     * Similar for AE_SAME_HANDLER. +     */ +    for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) +    { +        Status = AcpiEvInstallSpaceHandler (AcpiGbl_RootNode, +                    AcpiGbl_DefaultAddressSpaces[i], +                    ACPI_DEFAULT_HANDLER, NULL, NULL); +        switch (Status) +        { +        case AE_OK: +        case AE_SAME_HANDLER: +        case AE_ALREADY_EXISTS: + +            /* These exceptions are all OK */ + +            Status = AE_OK; +            break; + +        default: + +            goto UnlockAndExit; +        } +    } + +UnlockAndExit: +    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); +    return_ACPI_STATUS (Status); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiEvHasDefaultHandler + * + * PARAMETERS:  Node                - Namespace node for the device + *              SpaceId             - The address space ID + * + * RETURN:      TRUE if default handler is installed, FALSE otherwise + * + * DESCRIPTION: Check if the default handler is installed for the requested + *              space ID. + * + ******************************************************************************/ + +BOOLEAN +AcpiEvHasDefaultHandler ( +    ACPI_NAMESPACE_NODE     *Node, +    ACPI_ADR_SPACE_TYPE     SpaceId) +{ +    ACPI_OPERAND_OBJECT     *ObjDesc; +    ACPI_OPERAND_OBJECT     *HandlerObj; + + +    /* Must have an existing internal object */ + +    ObjDesc = AcpiNsGetAttachedObject (Node); +    if (ObjDesc) +    { +        HandlerObj = ObjDesc->Device.Handler; + +        /* Walk the linked list of handlers for this object */ + +        while (HandlerObj) +        { +            if (HandlerObj->AddressSpace.SpaceId == SpaceId) +            { +                if (HandlerObj->AddressSpace.HandlerFlags & +                        ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) +                { +                    return (TRUE); +                } +            } + +            HandlerObj = HandlerObj->AddressSpace.Next; +        } +    } + +    return (FALSE); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiEvInstallHandler + * + * PARAMETERS:  WalkNamespace callback + * + * DESCRIPTION: This routine installs an address handler into objects that are + *              of type Region or Device. + * + *              If the Object is a Device, and the device has a handler of + *              the same type then the search is terminated in that branch. + * + *              This is because the existing handler is closer in proximity + *              to any more regions than the one we are trying to install. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiEvInstallHandler ( +    ACPI_HANDLE             ObjHandle, +    UINT32                  Level, +    void                    *Context, +    void                    **ReturnValue) +{ +    ACPI_OPERAND_OBJECT     *HandlerObj; +    ACPI_OPERAND_OBJECT     *NextHandlerObj; +    ACPI_OPERAND_OBJECT     *ObjDesc; +    ACPI_NAMESPACE_NODE     *Node; +    ACPI_STATUS             Status; + + +    ACPI_FUNCTION_NAME (EvInstallHandler); + + +    HandlerObj = (ACPI_OPERAND_OBJECT  *) Context; + +    /* Parameter validation */ + +    if (!HandlerObj) +    { +        return (AE_OK); +    } + +    /* Convert and validate the device handle */ + +    Node = AcpiNsValidateHandle (ObjHandle); +    if (!Node) +    { +        return (AE_BAD_PARAMETER); +    } + +    /* +     * We only care about regions and objects that are allowed to have +     * address space handlers +     */ +    if ((Node->Type != ACPI_TYPE_DEVICE) && +        (Node->Type != ACPI_TYPE_REGION) && +        (Node != AcpiGbl_RootNode)) +    { +        return (AE_OK); +    } + +    /* Check for an existing internal object */ + +    ObjDesc = AcpiNsGetAttachedObject (Node); +    if (!ObjDesc) +    { +        /* No object, just exit */ + +        return (AE_OK); +    } + +    /* Devices are handled different than regions */ + +    if (ObjDesc->Common.Type == ACPI_TYPE_DEVICE) +    { +        /* Check if this Device already has a handler for this address space */ + +        NextHandlerObj = ObjDesc->Device.Handler; +        while (NextHandlerObj) +        { +            /* Found a handler, is it for the same address space? */ + +            if (NextHandlerObj->AddressSpace.SpaceId == +                    HandlerObj->AddressSpace.SpaceId) +            { +                ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, +                    "Found handler for region [%s] in device %p(%p) " +                    "handler %p\n", +                    AcpiUtGetRegionName (HandlerObj->AddressSpace.SpaceId), +                    ObjDesc, NextHandlerObj, HandlerObj)); + +                /* +                 * Since the object we found it on was a device, then it +                 * means that someone has already installed a handler for +                 * the branch of the namespace from this device on. Just +                 * bail out telling the walk routine to not traverse this +                 * branch. This preserves the scoping rule for handlers. +                 */ +                return (AE_CTRL_DEPTH); +            } + +            /* Walk the linked list of handlers attached to this device */ + +            NextHandlerObj = NextHandlerObj->AddressSpace.Next; +        } + +        /* +         * As long as the device didn't have a handler for this space we +         * don't care about it. We just ignore it and proceed. +         */ +        return (AE_OK); +    } + +    /* Object is a Region */ + +    if (ObjDesc->Region.SpaceId != HandlerObj->AddressSpace.SpaceId) +    { +        /* This region is for a different address space, just ignore it */ + +        return (AE_OK); +    } + +    /* +     * Now we have a region and it is for the handler's address space type. +     * +     * First disconnect region for any previous handler (if any) +     */ +    AcpiEvDetachRegion (ObjDesc, FALSE); + +    /* Connect the region to the new handler */ + +    Status = AcpiEvAttachRegion (HandlerObj, ObjDesc, FALSE); +    return (Status); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiEvInstallSpaceHandler + * + * PARAMETERS:  Node            - Namespace node for the device + *              SpaceId         - The address space ID + *              Handler         - Address of the handler + *              Setup           - Address of the setup function + *              Context         - Value passed to the handler on each access + * + * RETURN:      Status + * + * DESCRIPTION: Install a handler for all OpRegions of a given SpaceId. + *              Assumes namespace is locked + * + ******************************************************************************/ + +ACPI_STATUS +AcpiEvInstallSpaceHandler ( +    ACPI_NAMESPACE_NODE     *Node, +    ACPI_ADR_SPACE_TYPE     SpaceId, +    ACPI_ADR_SPACE_HANDLER  Handler, +    ACPI_ADR_SPACE_SETUP    Setup, +    void                    *Context) +{ +    ACPI_OPERAND_OBJECT     *ObjDesc; +    ACPI_OPERAND_OBJECT     *HandlerObj; +    ACPI_STATUS             Status; +    ACPI_OBJECT_TYPE        Type; +    UINT8                  Flags = 0; + + +    ACPI_FUNCTION_TRACE (EvInstallSpaceHandler); + + +    /* +     * This registration is valid for only the types below and the root. This +     * is where the default handlers get placed. +     */ +    if ((Node->Type != ACPI_TYPE_DEVICE)     && +        (Node->Type != ACPI_TYPE_PROCESSOR)  && +        (Node->Type != ACPI_TYPE_THERMAL)    && +        (Node != AcpiGbl_RootNode)) +    { +        Status = AE_BAD_PARAMETER; +        goto UnlockAndExit; +    } + +    if (Handler == ACPI_DEFAULT_HANDLER) +    { +        Flags = ACPI_ADDR_HANDLER_DEFAULT_INSTALLED; + +        switch (SpaceId) +        { +        case ACPI_ADR_SPACE_SYSTEM_MEMORY: +            Handler = AcpiExSystemMemorySpaceHandler; +            Setup   = AcpiEvSystemMemoryRegionSetup; +            break; + +        case ACPI_ADR_SPACE_SYSTEM_IO: +            Handler = AcpiExSystemIoSpaceHandler; +            Setup   = AcpiEvIoSpaceRegionSetup; +            break; + +        case ACPI_ADR_SPACE_PCI_CONFIG: +            Handler = AcpiExPciConfigSpaceHandler; +            Setup   = AcpiEvPciConfigRegionSetup; +            break; + +        case ACPI_ADR_SPACE_CMOS: +            Handler = AcpiExCmosSpaceHandler; +            Setup   = AcpiEvCmosRegionSetup; +            break; + +        case ACPI_ADR_SPACE_PCI_BAR_TARGET: +            Handler = AcpiExPciBarSpaceHandler; +            Setup   = AcpiEvPciBarRegionSetup; +            break; + +        case ACPI_ADR_SPACE_DATA_TABLE: +            Handler = AcpiExDataTableSpaceHandler; +            Setup   = NULL; +            break; + +        default: +            Status = AE_BAD_PARAMETER; +            goto UnlockAndExit; +        } +    } + +    /* If the caller hasn't specified a setup routine, use the default */ + +    if (!Setup) +    { +        Setup = AcpiEvDefaultRegionSetup; +    } + +    /* Check for an existing internal object */ + +    ObjDesc = AcpiNsGetAttachedObject (Node); +    if (ObjDesc) +    { +        /* +         * The attached device object already exists. Make sure the handler +         * is not already installed. +         */ +        HandlerObj = ObjDesc->Device.Handler; + +        /* Walk the handler list for this device */ + +        while (HandlerObj) +        { +            /* Same SpaceId indicates a handler already installed */ + +            if (HandlerObj->AddressSpace.SpaceId == SpaceId) +            { +                if (HandlerObj->AddressSpace.Handler == Handler) +                { +                    /* +                     * It is (relatively) OK to attempt to install the SAME +                     * handler twice. This can easily happen with the +                     * PCI_Config space. +                     */ +                    Status = AE_SAME_HANDLER; +                    goto UnlockAndExit; +                } +                else +                { +                    /* A handler is already installed */ + +                    Status = AE_ALREADY_EXISTS; +                } +                goto UnlockAndExit; +            } + +            /* Walk the linked list of handlers */ + +            HandlerObj = HandlerObj->AddressSpace.Next; +        } +    } +    else +    { +        ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, +            "Creating object on Device %p while installing handler\n", Node)); + +        /* ObjDesc does not exist, create one */ + +        if (Node->Type == ACPI_TYPE_ANY) +        { +            Type = ACPI_TYPE_DEVICE; +        } +        else +        { +            Type = Node->Type; +        } + +        ObjDesc = AcpiUtCreateInternalObject (Type); +        if (!ObjDesc) +        { +            Status = AE_NO_MEMORY; +            goto UnlockAndExit; +        } + +        /* Init new descriptor */ + +        ObjDesc->Common.Type = (UINT8) Type; + +        /* Attach the new object to the Node */ + +        Status = AcpiNsAttachObject (Node, ObjDesc, Type); + +        /* Remove local reference to the object */ + +        AcpiUtRemoveReference (ObjDesc); + +        if (ACPI_FAILURE (Status)) +        { +            goto UnlockAndExit; +        } +    } + +    ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, +        "Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n", +        AcpiUtGetRegionName (SpaceId), SpaceId, +        AcpiUtGetNodeName (Node), Node, ObjDesc)); + +    /* +     * Install the handler +     * +     * At this point there is no existing handler. Just allocate the object +     * for the handler and link it into the list. +     */ +    HandlerObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_ADDRESS_HANDLER); +    if (!HandlerObj) +    { +        Status = AE_NO_MEMORY; +        goto UnlockAndExit; +    } + +    /* Init handler obj */ + +    HandlerObj->AddressSpace.SpaceId = (UINT8) SpaceId; +    HandlerObj->AddressSpace.HandlerFlags = Flags; +    HandlerObj->AddressSpace.RegionList = NULL; +    HandlerObj->AddressSpace.Node = Node; +    HandlerObj->AddressSpace.Handler = Handler; +    HandlerObj->AddressSpace.Context = Context; +    HandlerObj->AddressSpace.Setup  = Setup; + +    /* Install at head of Device.AddressSpace list */ + +    HandlerObj->AddressSpace.Next = ObjDesc->Device.Handler; + +    /* +     * The Device object is the first reference on the HandlerObj. +     * Each region that uses the handler adds a reference. +     */ +    ObjDesc->Device.Handler = HandlerObj; + +    /* +     * Walk the namespace finding all of the regions this +     * handler will manage. +     * +     * Start at the device and search the branch toward +     * the leaf nodes until either the leaf is encountered or +     * a device is detected that has an address handler of the +     * same type. +     * +     * In either case, back up and search down the remainder +     * of the branch +     */ +    Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX, +                ACPI_NS_WALK_UNLOCK, AcpiEvInstallHandler, NULL, +                HandlerObj, NULL); + +UnlockAndExit: +    return_ACPI_STATUS (Status); +} diff --git a/source/components/events/evregion.c b/source/components/events/evregion.c index 8c1a8ebbae12..d5abe24f6afe 100644 --- a/source/components/events/evregion.c +++ b/source/components/events/evregion.c @@ -1,6 +1,6 @@  /******************************************************************************   * - * Module Name: evregion - ACPI AddressSpace (OpRegion) handler dispatch + * Module Name: evregion - Operation Region support   *   *****************************************************************************/ @@ -54,12 +54,9 @@          ACPI_MODULE_NAME    ("evregion") -/* Local prototypes */ +extern UINT8        AcpiGbl_DefaultAddressSpaces[]; -static BOOLEAN -AcpiEvHasDefaultHandler ( -    ACPI_NAMESPACE_NODE     *Node, -    ACPI_ADR_SPACE_TYPE     SpaceId); +/* Local prototypes */  static void  AcpiEvOrphanEcRegMethod ( @@ -72,152 +69,6 @@ AcpiEvRegRun (      void                    *Context,      void                    **ReturnValue); -static ACPI_STATUS -AcpiEvInstallHandler ( -    ACPI_HANDLE             ObjHandle, -    UINT32                  Level, -    void                    *Context, -    void                    **ReturnValue); - -/* These are the address spaces that will get default handlers */ - -#define ACPI_NUM_DEFAULT_SPACES     4 - -static UINT8        AcpiGbl_DefaultAddressSpaces[ACPI_NUM_DEFAULT_SPACES] = -{ -    ACPI_ADR_SPACE_SYSTEM_MEMORY, -    ACPI_ADR_SPACE_SYSTEM_IO, -    ACPI_ADR_SPACE_PCI_CONFIG, -    ACPI_ADR_SPACE_DATA_TABLE -}; - - -/******************************************************************************* - * - * FUNCTION:    AcpiEvInstallRegionHandlers - * - * PARAMETERS:  None - * - * RETURN:      Status - * - * DESCRIPTION: Installs the core subsystem default address space handlers. - * - ******************************************************************************/ - -ACPI_STATUS -AcpiEvInstallRegionHandlers ( -    void) -{ -    ACPI_STATUS             Status; -    UINT32                  i; - - -    ACPI_FUNCTION_TRACE (EvInstallRegionHandlers); - - -    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); -    if (ACPI_FAILURE (Status)) -    { -        return_ACPI_STATUS (Status); -    } - -    /* -     * All address spaces (PCI Config, EC, SMBus) are scope dependent and -     * registration must occur for a specific device. -     * -     * In the case of the system memory and IO address spaces there is -     * currently no device associated with the address space. For these we -     * use the root. -     * -     * We install the default PCI config space handler at the root so that -     * this space is immediately available even though the we have not -     * enumerated all the PCI Root Buses yet. This is to conform to the ACPI -     * specification which states that the PCI config space must be always -     * available -- even though we are nowhere near ready to find the PCI root -     * buses at this point. -     * -     * NOTE: We ignore AE_ALREADY_EXISTS because this means that a handler -     * has already been installed (via AcpiInstallAddressSpaceHandler). -     * Similar for AE_SAME_HANDLER. -     */ -    for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) -    { -        Status = AcpiEvInstallSpaceHandler (AcpiGbl_RootNode, -                    AcpiGbl_DefaultAddressSpaces[i], -                    ACPI_DEFAULT_HANDLER, NULL, NULL); -        switch (Status) -        { -        case AE_OK: -        case AE_SAME_HANDLER: -        case AE_ALREADY_EXISTS: - -            /* These exceptions are all OK */ - -            Status = AE_OK; -            break; - -        default: - -            goto UnlockAndExit; -        } -    } - -UnlockAndExit: -    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); -    return_ACPI_STATUS (Status); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiEvHasDefaultHandler - * - * PARAMETERS:  Node                - Namespace node for the device - *              SpaceId             - The address space ID - * - * RETURN:      TRUE if default handler is installed, FALSE otherwise - * - * DESCRIPTION: Check if the default handler is installed for the requested - *              space ID. - * - ******************************************************************************/ - -static BOOLEAN -AcpiEvHasDefaultHandler ( -    ACPI_NAMESPACE_NODE     *Node, -    ACPI_ADR_SPACE_TYPE     SpaceId) -{ -    ACPI_OPERAND_OBJECT     *ObjDesc; -    ACPI_OPERAND_OBJECT     *HandlerObj; - - -    /* Must have an existing internal object */ - -    ObjDesc = AcpiNsGetAttachedObject (Node); -    if (ObjDesc) -    { -        HandlerObj = ObjDesc->Device.Handler; - -        /* Walk the linked list of handlers for this object */ - -        while (HandlerObj) -        { -            if (HandlerObj->AddressSpace.SpaceId == SpaceId) -            { -                if (HandlerObj->AddressSpace.HandlerFlags & -                        ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) -                { -                    return (TRUE); -                } -            } - -            HandlerObj = HandlerObj->AddressSpace.Next; -        } -    } - -    return (FALSE); -} -  /*******************************************************************************   * @@ -275,100 +126,6 @@ AcpiEvInitializeOpRegions (  /*******************************************************************************   * - * FUNCTION:    AcpiEvExecuteRegMethod - * - * PARAMETERS:  RegionObj           - Region object - *              Function            - Passed to _REG: On (1) or Off (0) - * - * RETURN:      Status - * - * DESCRIPTION: Execute _REG method for a region - * - ******************************************************************************/ - -ACPI_STATUS -AcpiEvExecuteRegMethod ( -    ACPI_OPERAND_OBJECT     *RegionObj, -    UINT32                  Function) -{ -    ACPI_EVALUATE_INFO      *Info; -    ACPI_OPERAND_OBJECT     *Args[3]; -    ACPI_OPERAND_OBJECT     *RegionObj2; -    ACPI_STATUS             Status; - - -    ACPI_FUNCTION_TRACE (EvExecuteRegMethod); - - -    RegionObj2 = AcpiNsGetSecondaryObject (RegionObj); -    if (!RegionObj2) -    { -        return_ACPI_STATUS (AE_NOT_EXIST); -    } - -    if (RegionObj2->Extra.Method_REG == NULL) -    { -        return_ACPI_STATUS (AE_OK); -    } - -    /* Allocate and initialize the evaluation information block */ - -    Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO)); -    if (!Info) -    { -        return_ACPI_STATUS (AE_NO_MEMORY); -    } - -    Info->PrefixNode = RegionObj2->Extra.Method_REG; -    Info->Pathname = NULL; -    Info->Parameters = Args; -    Info->Flags = ACPI_IGNORE_RETURN_VALUE; - -    /* -     * The _REG method has two arguments: -     * -     * Arg0 - Integer: -     *  Operation region space ID Same value as RegionObj->Region.SpaceId -     * -     * Arg1 - Integer: -     *  connection status 1 for connecting the handler, 0 for disconnecting -     *  the handler (Passed as a parameter) -     */ -    Args[0] = AcpiUtCreateIntegerObject ((UINT64) RegionObj->Region.SpaceId); -    if (!Args[0]) -    { -        Status = AE_NO_MEMORY; -        goto Cleanup1; -    } - -    Args[1] = AcpiUtCreateIntegerObject ((UINT64) Function); -    if (!Args[1]) -    { -        Status = AE_NO_MEMORY; -        goto Cleanup2; -    } - -    Args[2] = NULL; /* Terminate list */ - -    /* Execute the method, no return value */ - -    ACPI_DEBUG_EXEC ( -        AcpiUtDisplayInitPathname (ACPI_TYPE_METHOD, Info->PrefixNode, NULL)); - -    Status = AcpiNsEvaluate (Info); -    AcpiUtRemoveReference (Args[1]); - -Cleanup2: -    AcpiUtRemoveReference (Args[0]); - -Cleanup1: -    ACPI_FREE (Info); -    return_ACPI_STATUS (Status); -} - - -/******************************************************************************* - *   * FUNCTION:    AcpiEvAddressSpaceDispatch   *   * PARAMETERS:  RegionObj           - Internal region object @@ -762,377 +519,94 @@ AcpiEvAttachRegion (  /*******************************************************************************   * - * FUNCTION:    AcpiEvInstallHandler - * - * PARAMETERS:  WalkNamespace callback - * - * DESCRIPTION: This routine installs an address handler into objects that are - *              of type Region or Device. - * - *              If the Object is a Device, and the device has a handler of - *              the same type then the search is terminated in that branch. - * - *              This is because the existing handler is closer in proximity - *              to any more regions than the one we are trying to install. - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiEvInstallHandler ( -    ACPI_HANDLE             ObjHandle, -    UINT32                  Level, -    void                    *Context, -    void                    **ReturnValue) -{ -    ACPI_OPERAND_OBJECT     *HandlerObj; -    ACPI_OPERAND_OBJECT     *NextHandlerObj; -    ACPI_OPERAND_OBJECT     *ObjDesc; -    ACPI_NAMESPACE_NODE     *Node; -    ACPI_STATUS             Status; - - -    ACPI_FUNCTION_NAME (EvInstallHandler); - - -    HandlerObj = (ACPI_OPERAND_OBJECT  *) Context; - -    /* Parameter validation */ - -    if (!HandlerObj) -    { -        return (AE_OK); -    } - -    /* Convert and validate the device handle */ - -    Node = AcpiNsValidateHandle (ObjHandle); -    if (!Node) -    { -        return (AE_BAD_PARAMETER); -    } - -    /* -     * We only care about regions and objects that are allowed to have -     * address space handlers -     */ -    if ((Node->Type != ACPI_TYPE_DEVICE) && -        (Node->Type != ACPI_TYPE_REGION) && -        (Node != AcpiGbl_RootNode)) -    { -        return (AE_OK); -    } - -    /* Check for an existing internal object */ - -    ObjDesc = AcpiNsGetAttachedObject (Node); -    if (!ObjDesc) -    { -        /* No object, just exit */ - -        return (AE_OK); -    } - -    /* Devices are handled different than regions */ - -    if (ObjDesc->Common.Type == ACPI_TYPE_DEVICE) -    { -        /* Check if this Device already has a handler for this address space */ - -        NextHandlerObj = ObjDesc->Device.Handler; -        while (NextHandlerObj) -        { -            /* Found a handler, is it for the same address space? */ - -            if (NextHandlerObj->AddressSpace.SpaceId == -                    HandlerObj->AddressSpace.SpaceId) -            { -                ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, -                    "Found handler for region [%s] in device %p(%p) " -                    "handler %p\n", -                    AcpiUtGetRegionName (HandlerObj->AddressSpace.SpaceId), -                    ObjDesc, NextHandlerObj, HandlerObj)); - -                /* -                 * Since the object we found it on was a device, then it -                 * means that someone has already installed a handler for -                 * the branch of the namespace from this device on. Just -                 * bail out telling the walk routine to not traverse this -                 * branch. This preserves the scoping rule for handlers. -                 */ -                return (AE_CTRL_DEPTH); -            } - -            /* Walk the linked list of handlers attached to this device */ - -            NextHandlerObj = NextHandlerObj->AddressSpace.Next; -        } - -        /* -         * As long as the device didn't have a handler for this space we -         * don't care about it. We just ignore it and proceed. -         */ -        return (AE_OK); -    } - -    /* Object is a Region */ - -    if (ObjDesc->Region.SpaceId != HandlerObj->AddressSpace.SpaceId) -    { -        /* This region is for a different address space, just ignore it */ - -        return (AE_OK); -    } - -    /* -     * Now we have a region and it is for the handler's address space type. -     * -     * First disconnect region for any previous handler (if any) -     */ -    AcpiEvDetachRegion (ObjDesc, FALSE); - -    /* Connect the region to the new handler */ - -    Status = AcpiEvAttachRegion (HandlerObj, ObjDesc, FALSE); -    return (Status); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiEvInstallSpaceHandler + * FUNCTION:    AcpiEvExecuteRegMethod   * - * PARAMETERS:  Node            - Namespace node for the device - *              SpaceId         - The address space ID - *              Handler         - Address of the handler - *              Setup           - Address of the setup function - *              Context         - Value passed to the handler on each access + * PARAMETERS:  RegionObj           - Region object + *              Function            - Passed to _REG: On (1) or Off (0)   *   * RETURN:      Status   * - * DESCRIPTION: Install a handler for all OpRegions of a given SpaceId. - *              Assumes namespace is locked + * DESCRIPTION: Execute _REG method for a region   *   ******************************************************************************/  ACPI_STATUS -AcpiEvInstallSpaceHandler ( -    ACPI_NAMESPACE_NODE     *Node, -    ACPI_ADR_SPACE_TYPE     SpaceId, -    ACPI_ADR_SPACE_HANDLER  Handler, -    ACPI_ADR_SPACE_SETUP    Setup, -    void                    *Context) +AcpiEvExecuteRegMethod ( +    ACPI_OPERAND_OBJECT     *RegionObj, +    UINT32                  Function)  { -    ACPI_OPERAND_OBJECT     *ObjDesc; -    ACPI_OPERAND_OBJECT     *HandlerObj; +    ACPI_EVALUATE_INFO      *Info; +    ACPI_OPERAND_OBJECT     *Args[3]; +    ACPI_OPERAND_OBJECT     *RegionObj2;      ACPI_STATUS             Status; -    ACPI_OBJECT_TYPE        Type; -    UINT8                  Flags = 0; - -    ACPI_FUNCTION_TRACE (EvInstallSpaceHandler); +    ACPI_FUNCTION_TRACE (EvExecuteRegMethod); -    /* -     * This registration is valid for only the types below and the root. This -     * is where the default handlers get placed. -     */ -    if ((Node->Type != ACPI_TYPE_DEVICE)     && -        (Node->Type != ACPI_TYPE_PROCESSOR)  && -        (Node->Type != ACPI_TYPE_THERMAL)    && -        (Node != AcpiGbl_RootNode)) -    { -        Status = AE_BAD_PARAMETER; -        goto UnlockAndExit; -    } -    if (Handler == ACPI_DEFAULT_HANDLER) +    RegionObj2 = AcpiNsGetSecondaryObject (RegionObj); +    if (!RegionObj2)      { -        Flags = ACPI_ADDR_HANDLER_DEFAULT_INSTALLED; - -        switch (SpaceId) -        { -        case ACPI_ADR_SPACE_SYSTEM_MEMORY: -            Handler = AcpiExSystemMemorySpaceHandler; -            Setup   = AcpiEvSystemMemoryRegionSetup; -            break; - -        case ACPI_ADR_SPACE_SYSTEM_IO: -            Handler = AcpiExSystemIoSpaceHandler; -            Setup   = AcpiEvIoSpaceRegionSetup; -            break; - -        case ACPI_ADR_SPACE_PCI_CONFIG: -            Handler = AcpiExPciConfigSpaceHandler; -            Setup   = AcpiEvPciConfigRegionSetup; -            break; - -        case ACPI_ADR_SPACE_CMOS: -            Handler = AcpiExCmosSpaceHandler; -            Setup   = AcpiEvCmosRegionSetup; -            break; - -        case ACPI_ADR_SPACE_PCI_BAR_TARGET: -            Handler = AcpiExPciBarSpaceHandler; -            Setup   = AcpiEvPciBarRegionSetup; -            break; - -        case ACPI_ADR_SPACE_DATA_TABLE: -            Handler = AcpiExDataTableSpaceHandler; -            Setup   = NULL; -            break; - -        default: -            Status = AE_BAD_PARAMETER; -            goto UnlockAndExit; -        } +        return_ACPI_STATUS (AE_NOT_EXIST);      } -    /* If the caller hasn't specified a setup routine, use the default */ - -    if (!Setup) +    if (RegionObj2->Extra.Method_REG == NULL)      { -        Setup = AcpiEvDefaultRegionSetup; +        return_ACPI_STATUS (AE_OK);      } -    /* Check for an existing internal object */ - -    ObjDesc = AcpiNsGetAttachedObject (Node); -    if (ObjDesc) -    { -        /* -         * The attached device object already exists. Make sure the handler -         * is not already installed. -         */ -        HandlerObj = ObjDesc->Device.Handler; - -        /* Walk the handler list for this device */ - -        while (HandlerObj) -        { -            /* Same SpaceId indicates a handler already installed */ - -            if (HandlerObj->AddressSpace.SpaceId == SpaceId) -            { -                if (HandlerObj->AddressSpace.Handler == Handler) -                { -                    /* -                     * It is (relatively) OK to attempt to install the SAME -                     * handler twice. This can easily happen with the -                     * PCI_Config space. -                     */ -                    Status = AE_SAME_HANDLER; -                    goto UnlockAndExit; -                } -                else -                { -                    /* A handler is already installed */ - -                    Status = AE_ALREADY_EXISTS; -                } -                goto UnlockAndExit; -            } - -            /* Walk the linked list of handlers */ +    /* Allocate and initialize the evaluation information block */ -            HandlerObj = HandlerObj->AddressSpace.Next; -        } -    } -    else +    Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO)); +    if (!Info)      { -        ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, -            "Creating object on Device %p while installing handler\n", Node)); - -        /* ObjDesc does not exist, create one */ - -        if (Node->Type == ACPI_TYPE_ANY) -        { -            Type = ACPI_TYPE_DEVICE; -        } -        else -        { -            Type = Node->Type; -        } - -        ObjDesc = AcpiUtCreateInternalObject (Type); -        if (!ObjDesc) -        { -            Status = AE_NO_MEMORY; -            goto UnlockAndExit; -        } - -        /* Init new descriptor */ - -        ObjDesc->Common.Type = (UINT8) Type; - -        /* Attach the new object to the Node */ - -        Status = AcpiNsAttachObject (Node, ObjDesc, Type); - -        /* Remove local reference to the object */ - -        AcpiUtRemoveReference (ObjDesc); - -        if (ACPI_FAILURE (Status)) -        { -            goto UnlockAndExit; -        } +        return_ACPI_STATUS (AE_NO_MEMORY);      } -    ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, -        "Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n", -        AcpiUtGetRegionName (SpaceId), SpaceId, -        AcpiUtGetNodeName (Node), Node, ObjDesc)); +    Info->PrefixNode = RegionObj2->Extra.Method_REG; +    Info->Pathname = NULL; +    Info->Parameters = Args; +    Info->Flags = ACPI_IGNORE_RETURN_VALUE;      /* -     * Install the handler +     * The _REG method has two arguments: +     * +     * Arg0 - Integer: +     *  Operation region space ID Same value as RegionObj->Region.SpaceId       * -     * At this point there is no existing handler. Just allocate the object -     * for the handler and link it into the list. +     * Arg1 - Integer: +     *  connection status 1 for connecting the handler, 0 for disconnecting +     *  the handler (Passed as a parameter)       */ -    HandlerObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_ADDRESS_HANDLER); -    if (!HandlerObj) +    Args[0] = AcpiUtCreateIntegerObject ((UINT64) RegionObj->Region.SpaceId); +    if (!Args[0])      {          Status = AE_NO_MEMORY; -        goto UnlockAndExit; +        goto Cleanup1;      } -    /* Init handler obj */ +    Args[1] = AcpiUtCreateIntegerObject ((UINT64) Function); +    if (!Args[1]) +    { +        Status = AE_NO_MEMORY; +        goto Cleanup2; +    } -    HandlerObj->AddressSpace.SpaceId = (UINT8) SpaceId; -    HandlerObj->AddressSpace.HandlerFlags = Flags; -    HandlerObj->AddressSpace.RegionList = NULL; -    HandlerObj->AddressSpace.Node = Node; -    HandlerObj->AddressSpace.Handler = Handler; -    HandlerObj->AddressSpace.Context = Context; -    HandlerObj->AddressSpace.Setup  = Setup; +    Args[2] = NULL; /* Terminate list */ -    /* Install at head of Device.AddressSpace list */ +    /* Execute the method, no return value */ -    HandlerObj->AddressSpace.Next = ObjDesc->Device.Handler; +    ACPI_DEBUG_EXEC ( +        AcpiUtDisplayInitPathname (ACPI_TYPE_METHOD, Info->PrefixNode, NULL)); -    /* -     * The Device object is the first reference on the HandlerObj. -     * Each region that uses the handler adds a reference. -     */ -    ObjDesc->Device.Handler = HandlerObj; +    Status = AcpiNsEvaluate (Info); +    AcpiUtRemoveReference (Args[1]); -    /* -     * Walk the namespace finding all of the regions this -     * handler will manage. -     * -     * Start at the device and search the branch toward -     * the leaf nodes until either the leaf is encountered or -     * a device is detected that has an address handler of the -     * same type. -     * -     * In either case, back up and search down the remainder -     * of the branch -     */ -    Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX, -                ACPI_NS_WALK_UNLOCK, AcpiEvInstallHandler, NULL, -                HandlerObj, NULL); +Cleanup2: +    AcpiUtRemoveReference (Args[0]); -UnlockAndExit: +Cleanup1: +    ACPI_FREE (Info);      return_ACPI_STATUS (Status);  } diff --git a/source/components/events/evsci.c b/source/components/events/evsci.c index c47cccc8db15..afdf853ec583 100644 --- a/source/components/events/evsci.c +++ b/source/components/events/evsci.c @@ -101,7 +101,7 @@ AcpiEvSciXruptHandler (      InterruptHandled |= AcpiEvGpeDetect (GpeXruptList);      AcpiSciCount++; -    return_UINT32 (InterruptHandled); +    return_VALUE (InterruptHandled);  } @@ -137,7 +137,7 @@ AcpiEvGpeXruptHandler (      InterruptHandled |= AcpiEvGpeDetect (GpeXruptList); -    return_UINT32 (InterruptHandled); +    return_VALUE (InterruptHandled);  } diff --git a/source/components/executer/exconfig.c b/source/components/executer/exconfig.c index f0083ff3beb8..601fa5422a2f 100644 --- a/source/components/executer/exconfig.c +++ b/source/components/executer/exconfig.c @@ -50,6 +50,7 @@  #include "actables.h"  #include "acdispat.h"  #include "acevents.h" +#include "amlcode.h"  #define _COMPONENT          ACPI_EXECUTER @@ -185,14 +186,15 @@ AcpiExLoadTableOp (          (Operand[1]->String.Length > ACPI_OEM_ID_SIZE) ||          (Operand[2]->String.Length > ACPI_OEM_TABLE_ID_SIZE))      { -        return_ACPI_STATUS (AE_BAD_PARAMETER); +        return_ACPI_STATUS (AE_AML_STRING_LIMIT);      }      /* Find the ACPI table in the RSDT/XSDT */ -    Status = AcpiTbFindTable (Operand[0]->String.Pointer, -                              Operand[1]->String.Pointer, -                              Operand[2]->String.Pointer, &TableIndex); +    Status = AcpiTbFindTable ( +                Operand[0]->String.Pointer, +                Operand[1]->String.Pointer, +                Operand[2]->String.Pointer, &TableIndex);      if (ACPI_FAILURE (Status))      {          if (Status != AE_NOT_FOUND) @@ -237,8 +239,8 @@ AcpiExLoadTableOp (      if (Operand[4]->String.Length > 0)      { -        if ((Operand[4]->String.Pointer[0] != '\\') && -            (Operand[4]->String.Pointer[0] != '^')) +        if ((Operand[4]->String.Pointer[0] != AML_ROOT_PREFIX) && +            (Operand[4]->String.Pointer[0] != AML_PARENT_PREFIX))          {              /*               * Path is not absolute, so it will be relative to the node @@ -299,7 +301,7 @@ AcpiExLoadTableOp (      }      *ReturnDesc = DdbHandle; -    return_ACPI_STATUS  (Status); +    return_ACPI_STATUS (Status);  } diff --git a/source/components/executer/exconvrt.c b/source/components/executer/exconvrt.c index 81cde05cb4a1..21ab5dd4ad22 100644 --- a/source/components/executer/exconvrt.c +++ b/source/components/executer/exconvrt.c @@ -199,7 +199,7 @@ AcpiExConvertToInteger (      /* Save the Result */ -    AcpiExTruncateFor32bitTable (ReturnDesc); +    (void) AcpiExTruncateFor32bitTable (ReturnDesc);      *ResultDesc = ReturnDesc;      return_ACPI_STATUS (AE_OK);  } diff --git a/source/components/executer/exdump.c b/source/components/executer/exdump.c index 5e13849a7db3..171ab7d6d8e8 100644 --- a/source/components/executer/exdump.c +++ b/source/components/executer/exdump.c @@ -483,7 +483,9 @@ AcpiExDumpOperand (      ACPI_FUNCTION_NAME (ExDumpOperand) -    if (!((ACPI_LV_EXEC & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer))) +    /* Check if debug output enabled */ + +    if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_EXEC, _COMPONENT))      {          return;      } @@ -873,7 +875,9 @@ AcpiExDumpNamespaceNode (      if (!Flags)      { -        if (!((ACPI_LV_OBJECTS & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer))) +        /* Check if debug output enabled */ + +        if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))          {              return;          } @@ -1080,7 +1084,9 @@ AcpiExDumpObjectDescriptor (      if (!Flags)      { -        if (!((ACPI_LV_OBJECTS & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer))) +        /* Check if debug output enabled */ + +        if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_OBJECTS, _COMPONENT))          {              return_VOID;          } diff --git a/source/components/executer/exprep.c b/source/components/executer/exprep.c index 2f62e9db4257..a183c041ea0f 100644 --- a/source/components/executer/exprep.c +++ b/source/components/executer/exprep.c @@ -292,7 +292,7 @@ AcpiExDecodeFieldAccess (          ACPI_ERROR ((AE_INFO,              "Unknown field access type 0x%X",              Access)); -        return_UINT32 (0); +        return_VALUE (0);      }      if (ObjDesc->Common.Type == ACPI_TYPE_BUFFER_FIELD) @@ -306,7 +306,7 @@ AcpiExDecodeFieldAccess (      }      *ReturnByteAlignment = ByteAlignment; -    return_UINT32 (BitLength); +    return_VALUE (BitLength);  } diff --git a/source/components/executer/exstore.c b/source/components/executer/exstore.c index 283cff59864f..2eb089783445 100644 --- a/source/components/executer/exstore.c +++ b/source/components/executer/exstore.c @@ -515,13 +515,28 @@ AcpiExStoreObjectToNode (      default:          ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, -            "Storing %s (%p) directly into node (%p) with no implicit conversion\n", -            AcpiUtGetObjectTypeName (SourceDesc), SourceDesc, Node)); +            "Storing [%s] (%p) directly into node [%s] (%p)" +            " with no implicit conversion\n", +            AcpiUtGetObjectTypeName (SourceDesc), SourceDesc, +            AcpiUtGetObjectTypeName (TargetDesc), Node)); -        /* No conversions for all other types. Just attach the source object */ +        /* +         * No conversions for all other types. Directly store a copy of +         * the source object. NOTE: This is a departure from the ACPI +         * spec, which states "If conversion is impossible, abort the +         * running control method". +         * +         * This code implements "If conversion is impossible, treat the +         * Store operation as a CopyObject". +         */ +        Status = AcpiUtCopyIobjectToIobject (SourceDesc, &NewDesc, WalkState); +        if (ACPI_FAILURE (Status)) +        { +            return_ACPI_STATUS (Status); +        } -        Status = AcpiNsAttachObject (Node, SourceDesc, -                    SourceDesc->Common.Type); +        Status = AcpiNsAttachObject (Node, NewDesc, NewDesc->Common.Type); +        AcpiUtRemoveReference (NewDesc);          break;      } diff --git a/source/components/executer/exstoren.c b/source/components/executer/exstoren.c index 84699b67adf2..7bdaf7c595c0 100644 --- a/source/components/executer/exstoren.c +++ b/source/components/executer/exstoren.c @@ -269,7 +269,7 @@ AcpiExStoreObjectToObject (          /* Truncate value if we are executing from a 32-bit ACPI table */ -        AcpiExTruncateFor32bitTable (DestDesc); +        (void) AcpiExTruncateFor32bitTable (DestDesc);          break;      case ACPI_TYPE_STRING: diff --git a/source/components/executer/exutils.c b/source/components/executer/exutils.c index 12befff2e7e6..c0259fdaabf4 100644 --- a/source/components/executer/exutils.c +++ b/source/components/executer/exutils.c @@ -229,14 +229,14 @@ AcpiExRelinquishInterpreter (   *   * PARAMETERS:  ObjDesc         - Object to be truncated   * - * RETURN:      none + * RETURN:      TRUE if a truncation was performed, FALSE otherwise.   *   * DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is   *              32-bit, as determined by the revision of the DSDT.   *   ******************************************************************************/ -void +BOOLEAN  AcpiExTruncateFor32bitTable (      ACPI_OPERAND_OBJECT     *ObjDesc)  { @@ -246,23 +246,27 @@ AcpiExTruncateFor32bitTable (      /*       * Object must be a valid number and we must be executing -     * a control method. NS node could be there for AML_INT_NAMEPATH_OP. +     * a control method. Object could be NS node for AML_INT_NAMEPATH_OP.       */      if ((!ObjDesc) ||          (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) ||          (ObjDesc->Common.Type != ACPI_TYPE_INTEGER))      { -        return; +        return (FALSE);      } -    if (AcpiGbl_IntegerByteWidth == 4) +    if ((AcpiGbl_IntegerByteWidth == 4) && +        (ObjDesc->Integer.Value > (UINT64) ACPI_UINT32_MAX))      {          /* -         * We are running a method that exists in a 32-bit ACPI table. +         * We are executing in a 32-bit ACPI table.           * Truncate the value to 32 bits by zeroing out the upper 32-bit field           */          ObjDesc->Integer.Value &= (UINT64) ACPI_UINT32_MAX; +        return (TRUE);      } + +    return (FALSE);  } @@ -387,7 +391,7 @@ AcpiExDigitsNeeded (      if (Value == 0)      { -        return_UINT32 (1); +        return_VALUE (1);      }      CurrentValue = Value; @@ -401,7 +405,7 @@ AcpiExDigitsNeeded (          NumDigits++;      } -    return_UINT32 (NumDigits); +    return_VALUE (NumDigits);  } diff --git a/source/components/hardware/hwacpi.c b/source/components/hardware/hwacpi.c index 9f9fec329046..72e287abcc13 100644 --- a/source/components/hardware/hwacpi.c +++ b/source/components/hardware/hwacpi.c @@ -141,13 +141,13 @@ AcpiHwSetMode (      Retry = 3000;      while (Retry)      { -        if (AcpiHwGetMode() == Mode) +        if (AcpiHwGetMode () == Mode)          {              ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Mode %X successfully enabled\n",                  Mode));              return_ACPI_STATUS (AE_OK);          } -        AcpiOsStall(1000); +        AcpiOsStall (ACPI_USEC_PER_MSEC);          Retry--;      } @@ -186,22 +186,22 @@ AcpiHwGetMode (       */      if (!AcpiGbl_FADT.SmiCommand)      { -        return_UINT32 (ACPI_SYS_MODE_ACPI); +        return_VALUE (ACPI_SYS_MODE_ACPI);      }      Status = AcpiReadBitRegister (ACPI_BITREG_SCI_ENABLE, &Value);      if (ACPI_FAILURE (Status))      { -        return_UINT32 (ACPI_SYS_MODE_LEGACY); +        return_VALUE (ACPI_SYS_MODE_LEGACY);      }      if (Value)      { -        return_UINT32 (ACPI_SYS_MODE_ACPI); +        return_VALUE (ACPI_SYS_MODE_ACPI);      }      else      { -        return_UINT32 (ACPI_SYS_MODE_LEGACY); +        return_VALUE (ACPI_SYS_MODE_LEGACY);      }  } diff --git a/source/components/hardware/hwsleep.c b/source/components/hardware/hwsleep.c index d3817554225a..4d47ef8a33a2 100644 --- a/source/components/hardware/hwsleep.c +++ b/source/components/hardware/hwsleep.c @@ -179,7 +179,7 @@ AcpiHwLegacySleep (           * to still read the right value. Ideally, this block would go           * away entirely.           */ -        AcpiOsStall (10000000); +        AcpiOsStall (10 * ACPI_USEC_PER_SEC);          Status = AcpiHwRegisterWrite (ACPI_REGISTER_PM1_CONTROL,                      SleepEnableRegInfo->AccessBitMask); diff --git a/source/components/hardware/hwtimer.c b/source/components/hardware/hwtimer.c index 44de309456c7..79caa70a5241 100644 --- a/source/components/hardware/hwtimer.c +++ b/source/components/hardware/hwtimer.c @@ -203,10 +203,11 @@ AcpiGetTimerDuration (      /*       * Compute Duration (Requires a 64-bit multiply and divide):       * -     * TimeElapsed = (DeltaTicks * 1000000) / PM_TIMER_FREQUENCY; +     * TimeElapsed (microseconds) = +     *  (DeltaTicks * ACPI_USEC_PER_SEC) / ACPI_PM_TIMER_FREQUENCY;       */ -    Status = AcpiUtShortDivide (((UINT64) DeltaTicks) * 1000000, -                PM_TIMER_FREQUENCY, &Quotient, NULL); +    Status = AcpiUtShortDivide (((UINT64) DeltaTicks) * ACPI_USEC_PER_SEC, +                ACPI_PM_TIMER_FREQUENCY, &Quotient, NULL);      *TimeElapsed = (UINT32) Quotient;      return_ACPI_STATUS (Status); diff --git a/source/components/hardware/hwxface.c b/source/components/hardware/hwxface.c index e4f8c802c455..1a1322be6292 100644 --- a/source/components/hardware/hwxface.c +++ b/source/components/hardware/hwxface.c @@ -377,7 +377,7 @@ ACPI_EXPORT_SYMBOL (AcpiReadBitRegister)   *   * PARAMETERS:  RegisterId      - ID of ACPI Bit Register to access   *              Value           - Value to write to the register, in bit - *                                position zero. The bit is automaticallly + *                                position zero. The bit is automatically   *                                shifted to the correct position.   *   * RETURN:      Status diff --git a/source/components/hardware/hwxfsleep.c b/source/components/hardware/hwxfsleep.c index c75308443a2e..affa8d35f5ea 100644 --- a/source/components/hardware/hwxfsleep.c +++ b/source/components/hardware/hwxfsleep.c @@ -227,7 +227,7 @@ AcpiEnterSleepStateS4bios (                  (UINT32) AcpiGbl_FADT.S4BiosRequest, 8);      do { -        AcpiOsStall(1000); +        AcpiOsStall (ACPI_USEC_PER_MSEC);          Status = AcpiReadBitRegister (ACPI_BITREG_WAKE_STATUS, &InValue);          if (ACPI_FAILURE (Status))          { diff --git a/source/components/namespace/nsdump.c b/source/components/namespace/nsdump.c index ef2aac5e5e05..7907f5f8d8f1 100644 --- a/source/components/namespace/nsdump.c +++ b/source/components/namespace/nsdump.c @@ -46,6 +46,7 @@  #include "acpi.h"  #include "accommon.h"  #include "acnamesp.h" +#include "acoutput.h"  #define _COMPONENT          ACPI_NAMESPACE @@ -92,7 +93,9 @@ AcpiNsPrintPathname (      ACPI_FUNCTION_NAME (NsPrintPathname); -    if (!(AcpiDbgLevel & ACPI_LV_NAMES) || !(AcpiDbgLayer & ACPI_NAMESPACE)) +    /* Check if debug output enabled */ + +    if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_NAMES, ACPI_NAMESPACE))      {          return;      } @@ -151,7 +154,7 @@ AcpiNsDumpPathname (      /* Do this only if the requested debug level and component are enabled */ -    if (!(AcpiDbgLevel & Level) || !(AcpiDbgLayer & Component)) +    if (!ACPI_IS_DEBUG_ENABLED (Level, Component))      {          return_VOID;      } diff --git a/source/components/namespace/nsinit.c b/source/components/namespace/nsinit.c index a24a67ae3c23..438014e6fa80 100644 --- a/source/components/namespace/nsinit.c +++ b/source/components/namespace/nsinit.c @@ -104,7 +104,7 @@ AcpiNsInitializeObjects (      ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,          "**** Starting initialization of namespace objects ****\n"));      ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, -        "Completing Region/Field/Buffer/Package initialization:")); +        "Completing Region/Field/Buffer/Package initialization:\n"));      /* Set all init info to zero */ @@ -121,7 +121,7 @@ AcpiNsInitializeObjects (      }      ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, -        "\nInitialized %u/%u Regions %u/%u Fields %u/%u " +        "    Initialized %u/%u Regions %u/%u Fields %u/%u "          "Buffers %u/%u Packages (%u nodes)\n",          Info.OpRegionInit,  Info.OpRegionCount,          Info.FieldInit,     Info.FieldCount, @@ -172,7 +172,7 @@ AcpiNsInitializeDevices (      ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,          "Initializing Device/Processor/Thermal objects " -        "by executing _INI methods:")); +        "and executing _INI/_STA methods:\n"));      /* Tree analysis: find all subtrees that contain _INI methods */ @@ -230,7 +230,7 @@ AcpiNsInitializeDevices (      }      ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, -        "\nExecuted %u _INI methods requiring %u _STA executions " +        "    Executed %u _INI methods requiring %u _STA executions "          "(examined %u objects)\n",          Info.Num_INI, Info.Num_STA, Info.DeviceCount)); @@ -381,15 +381,6 @@ AcpiNsInitOneObject (      }      /* -     * Print a dot for each object unless we are going to print the entire -     * pathname -     */ -    if (!(AcpiDbgLevel & ACPI_LV_INIT_NAMES)) -    { -        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, ".")); -    } - -    /*       * We ignore errors from above, and always return OK, since we don't want       * to abort the walk on any single error.       */ @@ -627,12 +618,6 @@ AcpiNsInitOneDevice (      if (ACPI_SUCCESS (Status))      {          WalkInfo->Num_INI++; - -        if ((AcpiDbgLevel <= ACPI_LV_ALL_EXCEPTIONS) && -            (!(AcpiDbgLevel & ACPI_LV_INFO))) -        { -            ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, ".")); -        }      }  #ifdef ACPI_DEBUG_OUTPUT diff --git a/source/components/namespace/nspredef.c b/source/components/namespace/nspredef.c index cb3a99103313..c50e2bcf9ba0 100644 --- a/source/components/namespace/nspredef.c +++ b/source/components/namespace/nspredef.c @@ -78,35 +78,6 @@  /* Local prototypes */  static ACPI_STATUS -AcpiNsCheckPackage ( -    ACPI_PREDEFINED_DATA        *Data, -    ACPI_OPERAND_OBJECT         **ReturnObjectPtr); - -static ACPI_STATUS -AcpiNsCheckPackageList ( -    ACPI_PREDEFINED_DATA        *Data, -    const ACPI_PREDEFINED_INFO  *Package, -    ACPI_OPERAND_OBJECT         **Elements, -    UINT32                      Count); - -static ACPI_STATUS -AcpiNsCheckPackageElements ( -    ACPI_PREDEFINED_DATA        *Data, -    ACPI_OPERAND_OBJECT         **Elements, -    UINT8                       Type1, -    UINT32                      Count1, -    UINT8                       Type2, -    UINT32                      Count2, -    UINT32                      StartIndex); - -static ACPI_STATUS -AcpiNsCheckObjectType ( -    ACPI_PREDEFINED_DATA        *Data, -    ACPI_OPERAND_OBJECT         **ReturnObjectPtr, -    UINT32                      ExpectedBtypes, -    UINT32                      PackageIndex); - -static ACPI_STATUS  AcpiNsCheckReference (      ACPI_PREDEFINED_DATA        *Data,      ACPI_OPERAND_OBJECT         *ReturnObject); @@ -450,574 +421,6 @@ AcpiNsCheckForPredefinedName (  /*******************************************************************************   * - * FUNCTION:    AcpiNsCheckPackage - * - * PARAMETERS:  Data            - Pointer to validation data structure - *              ReturnObjectPtr - Pointer to the object returned from the - *                                evaluation of a method or object - * - * RETURN:      Status - * - * DESCRIPTION: Check a returned package object for the correct count and - *              correct type of all sub-objects. - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiNsCheckPackage ( -    ACPI_PREDEFINED_DATA        *Data, -    ACPI_OPERAND_OBJECT         **ReturnObjectPtr) -{ -    ACPI_OPERAND_OBJECT         *ReturnObject = *ReturnObjectPtr; -    const ACPI_PREDEFINED_INFO  *Package; -    ACPI_OPERAND_OBJECT         **Elements; -    ACPI_STATUS                 Status = AE_OK; -    UINT32                      ExpectedCount; -    UINT32                      Count; -    UINT32                      i; - - -    ACPI_FUNCTION_NAME (NsCheckPackage); - - -    /* The package info for this name is in the next table entry */ - -    Package = Data->Predefined + 1; - -    ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, -        "%s Validating return Package of Type %X, Count %X\n", -        Data->Pathname, Package->RetInfo.Type, ReturnObject->Package.Count)); - -    /* -     * For variable-length Packages, we can safely remove all embedded -     * and trailing NULL package elements -     */ -    AcpiNsRemoveNullElements (Data, Package->RetInfo.Type, ReturnObject); - -    /* Extract package count and elements array */ - -    Elements = ReturnObject->Package.Elements; -    Count = ReturnObject->Package.Count; - -    /* The package must have at least one element, else invalid */ - -    if (!Count) -    { -        ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, -            "Return Package has no elements (empty)")); - -        return (AE_AML_OPERAND_VALUE); -    } - -    /* -     * Decode the type of the expected package contents -     * -     * PTYPE1 packages contain no subpackages -     * PTYPE2 packages contain sub-packages -     */ -    switch (Package->RetInfo.Type) -    { -    case ACPI_PTYPE1_FIXED: - -        /* -         * The package count is fixed and there are no sub-packages -         * -         * If package is too small, exit. -         * If package is larger than expected, issue warning but continue -         */ -        ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; -        if (Count < ExpectedCount) -        { -            goto PackageTooSmall; -        } -        else if (Count > ExpectedCount) -        { -            ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, -                "%s: Return Package is larger than needed - " -                "found %u, expected %u\n", -                Data->Pathname, Count, ExpectedCount)); -        } - -        /* Validate all elements of the returned package */ - -        Status = AcpiNsCheckPackageElements (Data, Elements, -                    Package->RetInfo.ObjectType1, Package->RetInfo.Count1, -                    Package->RetInfo.ObjectType2, Package->RetInfo.Count2, 0); -        break; - - -    case ACPI_PTYPE1_VAR: - -        /* -         * The package count is variable, there are no sub-packages, and all -         * elements must be of the same type -         */ -        for (i = 0; i < Count; i++) -        { -            Status = AcpiNsCheckObjectType (Data, Elements, -                        Package->RetInfo.ObjectType1, i); -            if (ACPI_FAILURE (Status)) -            { -                return (Status); -            } -            Elements++; -        } -        break; - - -    case ACPI_PTYPE1_OPTION: - -        /* -         * The package count is variable, there are no sub-packages. There are -         * a fixed number of required elements, and a variable number of -         * optional elements. -         * -         * Check if package is at least as large as the minimum required -         */ -        ExpectedCount = Package->RetInfo3.Count; -        if (Count < ExpectedCount) -        { -            goto PackageTooSmall; -        } - -        /* Variable number of sub-objects */ - -        for (i = 0; i < Count; i++) -        { -            if (i < Package->RetInfo3.Count) -            { -                /* These are the required package elements (0, 1, or 2) */ - -                Status = AcpiNsCheckObjectType (Data, Elements, -                            Package->RetInfo3.ObjectType[i], i); -                if (ACPI_FAILURE (Status)) -                { -                    return (Status); -                } -            } -            else -            { -                /* These are the optional package elements */ - -                Status = AcpiNsCheckObjectType (Data, Elements, -                            Package->RetInfo3.TailObjectType, i); -                if (ACPI_FAILURE (Status)) -                { -                    return (Status); -                } -            } -            Elements++; -        } -        break; - - -    case ACPI_PTYPE2_REV_FIXED: - -        /* First element is the (Integer) revision */ - -        Status = AcpiNsCheckObjectType (Data, Elements, -                    ACPI_RTYPE_INTEGER, 0); -        if (ACPI_FAILURE (Status)) -        { -            return (Status); -        } - -        Elements++; -        Count--; - -        /* Examine the sub-packages */ - -        Status = AcpiNsCheckPackageList (Data, Package, Elements, Count); -        break; - - -    case ACPI_PTYPE2_PKG_COUNT: - -        /* First element is the (Integer) count of sub-packages to follow */ - -        Status = AcpiNsCheckObjectType (Data, Elements, -                    ACPI_RTYPE_INTEGER, 0); -        if (ACPI_FAILURE (Status)) -        { -            return (Status); -        } - -        /* -         * Count cannot be larger than the parent package length, but allow it -         * to be smaller. The >= accounts for the Integer above. -         */ -        ExpectedCount = (UINT32) (*Elements)->Integer.Value; -        if (ExpectedCount >= Count) -        { -            goto PackageTooSmall; -        } - -        Count = ExpectedCount; -        Elements++; - -        /* Examine the sub-packages */ - -        Status = AcpiNsCheckPackageList (Data, Package, Elements, Count); -        break; - - -    case ACPI_PTYPE2: -    case ACPI_PTYPE2_FIXED: -    case ACPI_PTYPE2_MIN: -    case ACPI_PTYPE2_COUNT: -    case ACPI_PTYPE2_FIX_VAR: - -        /* -         * These types all return a single Package that consists of a -         * variable number of sub-Packages. -         * -         * First, ensure that the first element is a sub-Package. If not, -         * the BIOS may have incorrectly returned the object as a single -         * package instead of a Package of Packages (a common error if -         * there is only one entry). We may be able to repair this by -         * wrapping the returned Package with a new outer Package. -         */ -        if (*Elements && ((*Elements)->Common.Type != ACPI_TYPE_PACKAGE)) -        { -            /* Create the new outer package and populate it */ - -            Status = AcpiNsWrapWithPackage (Data, ReturnObject, ReturnObjectPtr); -            if (ACPI_FAILURE (Status)) -            { -                return (Status); -            } - -            /* Update locals to point to the new package (of 1 element) */ - -            ReturnObject = *ReturnObjectPtr; -            Elements = ReturnObject->Package.Elements; -            Count = 1; -        } - -        /* Examine the sub-packages */ - -        Status = AcpiNsCheckPackageList (Data, Package, Elements, Count); -        break; - - -    default: - -        /* Should not get here if predefined info table is correct */ - -        ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, -            "Invalid internal return type in table entry: %X", -            Package->RetInfo.Type)); - -        return (AE_AML_INTERNAL); -    } - -    return (Status); - - -PackageTooSmall: - -    /* Error exit for the case with an incorrect package count */ - -    ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, -        "Return Package is too small - found %u elements, expected %u", -        Count, ExpectedCount)); - -    return (AE_AML_OPERAND_VALUE); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiNsCheckPackageList - * - * PARAMETERS:  Data            - Pointer to validation data structure - *              Package         - Pointer to package-specific info for method - *              Elements        - Element list of parent package. All elements - *                                of this list should be of type Package. - *              Count           - Count of subpackages - * - * RETURN:      Status - * - * DESCRIPTION: Examine a list of subpackages - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiNsCheckPackageList ( -    ACPI_PREDEFINED_DATA        *Data, -    const ACPI_PREDEFINED_INFO  *Package, -    ACPI_OPERAND_OBJECT         **Elements, -    UINT32                      Count) -{ -    ACPI_OPERAND_OBJECT         *SubPackage; -    ACPI_OPERAND_OBJECT         **SubElements; -    ACPI_STATUS                 Status; -    UINT32                      ExpectedCount; -    UINT32                      i; -    UINT32                      j; - - -    /* -     * Validate each sub-Package in the parent Package -     * -     * NOTE: assumes list of sub-packages contains no NULL elements. -     * Any NULL elements should have been removed by earlier call -     * to AcpiNsRemoveNullElements. -     */ -    for (i = 0; i < Count; i++) -    { -        SubPackage = *Elements; -        SubElements = SubPackage->Package.Elements; -        Data->ParentPackage = SubPackage; - -        /* Each sub-object must be of type Package */ - -        Status = AcpiNsCheckObjectType (Data, &SubPackage, -                    ACPI_RTYPE_PACKAGE, i); -        if (ACPI_FAILURE (Status)) -        { -            return (Status); -        } - -        /* Examine the different types of expected sub-packages */ - -        Data->ParentPackage = SubPackage; -        switch (Package->RetInfo.Type) -        { -        case ACPI_PTYPE2: -        case ACPI_PTYPE2_PKG_COUNT: -        case ACPI_PTYPE2_REV_FIXED: - -            /* Each subpackage has a fixed number of elements */ - -            ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; -            if (SubPackage->Package.Count < ExpectedCount) -            { -                goto PackageTooSmall; -            } - -            Status = AcpiNsCheckPackageElements (Data, SubElements, -                        Package->RetInfo.ObjectType1, -                        Package->RetInfo.Count1, -                        Package->RetInfo.ObjectType2, -                        Package->RetInfo.Count2, 0); -            if (ACPI_FAILURE (Status)) -            { -                return (Status); -            } -            break; - - -        case ACPI_PTYPE2_FIX_VAR: -            /* -             * Each subpackage has a fixed number of elements and an -             * optional element -             */ -            ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; -            if (SubPackage->Package.Count < ExpectedCount) -            { -                goto PackageTooSmall; -            } - -            Status = AcpiNsCheckPackageElements (Data, SubElements, -                        Package->RetInfo.ObjectType1, -                        Package->RetInfo.Count1, -                        Package->RetInfo.ObjectType2, -                        SubPackage->Package.Count - Package->RetInfo.Count1, 0); -            if (ACPI_FAILURE (Status)) -            { -                return (Status); -            } -            break; - - -        case ACPI_PTYPE2_FIXED: - -            /* Each sub-package has a fixed length */ - -            ExpectedCount = Package->RetInfo2.Count; -            if (SubPackage->Package.Count < ExpectedCount) -            { -                goto PackageTooSmall; -            } - -            /* Check the type of each sub-package element */ - -            for (j = 0; j < ExpectedCount; j++) -            { -                Status = AcpiNsCheckObjectType (Data, &SubElements[j], -                            Package->RetInfo2.ObjectType[j], j); -                if (ACPI_FAILURE (Status)) -                { -                    return (Status); -                } -            } -            break; - - -        case ACPI_PTYPE2_MIN: - -            /* Each sub-package has a variable but minimum length */ - -            ExpectedCount = Package->RetInfo.Count1; -            if (SubPackage->Package.Count < ExpectedCount) -            { -                goto PackageTooSmall; -            } - -            /* Check the type of each sub-package element */ - -            Status = AcpiNsCheckPackageElements (Data, SubElements, -                        Package->RetInfo.ObjectType1, -                        SubPackage->Package.Count, 0, 0, 0); -            if (ACPI_FAILURE (Status)) -            { -                return (Status); -            } -            break; - - -        case ACPI_PTYPE2_COUNT: - -            /* -             * First element is the (Integer) count of elements, including -             * the count field (the ACPI name is NumElements) -             */ -            Status = AcpiNsCheckObjectType (Data, SubElements, -                        ACPI_RTYPE_INTEGER, 0); -            if (ACPI_FAILURE (Status)) -            { -                return (Status); -            } - -            /* -             * Make sure package is large enough for the Count and is -             * is as large as the minimum size -             */ -            ExpectedCount = (UINT32) (*SubElements)->Integer.Value; -            if (SubPackage->Package.Count < ExpectedCount) -            { -                goto PackageTooSmall; -            } -            if (SubPackage->Package.Count < Package->RetInfo.Count1) -            { -                ExpectedCount = Package->RetInfo.Count1; -                goto PackageTooSmall; -            } -            if (ExpectedCount == 0) -            { -                /* -                 * Either the NumEntries element was originally zero or it was -                 * a NULL element and repaired to an Integer of value zero. -                 * In either case, repair it by setting NumEntries to be the -                 * actual size of the subpackage. -                 */ -                ExpectedCount = SubPackage->Package.Count; -                (*SubElements)->Integer.Value = ExpectedCount; -            } - -            /* Check the type of each sub-package element */ - -            Status = AcpiNsCheckPackageElements (Data, (SubElements + 1), -                        Package->RetInfo.ObjectType1, -                        (ExpectedCount - 1), 0, 0, 1); -            if (ACPI_FAILURE (Status)) -            { -                return (Status); -            } -            break; - - -        default: /* Should not get here, type was validated by caller */ - -            return (AE_AML_INTERNAL); -        } - -        Elements++; -    } - -    return (AE_OK); - - -PackageTooSmall: - -    /* The sub-package count was smaller than required */ - -    ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, -        "Return Sub-Package[%u] is too small - found %u elements, expected %u", -        i, SubPackage->Package.Count, ExpectedCount)); - -    return (AE_AML_OPERAND_VALUE); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiNsCheckPackageElements - * - * PARAMETERS:  Data            - Pointer to validation data structure - *              Elements        - Pointer to the package elements array - *              Type1           - Object type for first group - *              Count1          - Count for first group - *              Type2           - Object type for second group - *              Count2          - Count for second group - *              StartIndex      - Start of the first group of elements - * - * RETURN:      Status - * - * DESCRIPTION: Check that all elements of a package are of the correct object - *              type. Supports up to two groups of different object types. - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiNsCheckPackageElements ( -    ACPI_PREDEFINED_DATA        *Data, -    ACPI_OPERAND_OBJECT         **Elements, -    UINT8                       Type1, -    UINT32                      Count1, -    UINT8                       Type2, -    UINT32                      Count2, -    UINT32                      StartIndex) -{ -    ACPI_OPERAND_OBJECT         **ThisElement = Elements; -    ACPI_STATUS                 Status; -    UINT32                      i; - - -    /* -     * Up to two groups of package elements are supported by the data -     * structure. All elements in each group must be of the same type. -     * The second group can have a count of zero. -     */ -    for (i = 0; i < Count1; i++) -    { -        Status = AcpiNsCheckObjectType (Data, ThisElement, -                    Type1, i + StartIndex); -        if (ACPI_FAILURE (Status)) -        { -            return (Status); -        } -        ThisElement++; -    } - -    for (i = 0; i < Count2; i++) -    { -        Status = AcpiNsCheckObjectType (Data, ThisElement, -                    Type2, (i + Count1 + StartIndex)); -        if (ACPI_FAILURE (Status)) -        { -            return (Status); -        } -        ThisElement++; -    } - -    return (AE_OK); -} - - -/******************************************************************************* - *   * FUNCTION:    AcpiNsCheckObjectType   *   * PARAMETERS:  Data            - Pointer to validation data structure @@ -1035,7 +438,7 @@ AcpiNsCheckPackageElements (   *   ******************************************************************************/ -static ACPI_STATUS +ACPI_STATUS  AcpiNsCheckObjectType (      ACPI_PREDEFINED_DATA        *Data,      ACPI_OPERAND_OBJECT         **ReturnObjectPtr, diff --git a/source/components/namespace/nsprepkg.c b/source/components/namespace/nsprepkg.c new file mode 100644 index 000000000000..b37a93bfecf4 --- /dev/null +++ b/source/components/namespace/nsprepkg.c @@ -0,0 +1,639 @@ +/****************************************************************************** + * + * Module Name: nsprepkg - Validation of package objects for predefined names + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2012, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions, and the following disclaimer, + *    without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + *    substantially similar to the "NO WARRANTY" disclaimer below + *    ("Disclaimer") and any redistribution must be conditioned upon + *    including a substantially similar Disclaimer requirement for further + *    binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + *    of any contributors may be used to endorse or promote products derived + *    from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + */ + +#include "acpi.h" +#include "accommon.h" +#include "acnamesp.h" +#include "acpredef.h" + + +#define _COMPONENT          ACPI_NAMESPACE +        ACPI_MODULE_NAME    ("nsprepkg") + + +/* Local prototypes */ + +static ACPI_STATUS +AcpiNsCheckPackageList ( +    ACPI_PREDEFINED_DATA        *Data, +    const ACPI_PREDEFINED_INFO  *Package, +    ACPI_OPERAND_OBJECT         **Elements, +    UINT32                      Count); + +static ACPI_STATUS +AcpiNsCheckPackageElements ( +    ACPI_PREDEFINED_DATA        *Data, +    ACPI_OPERAND_OBJECT         **Elements, +    UINT8                       Type1, +    UINT32                      Count1, +    UINT8                       Type2, +    UINT32                      Count2, +    UINT32                      StartIndex); + + +/******************************************************************************* + * + * FUNCTION:    AcpiNsCheckPackage + * + * PARAMETERS:  Data                - Pointer to validation data structure + *              ReturnObjectPtr     - Pointer to the object returned from the + *                                    evaluation of a method or object + * + * RETURN:      Status + * + * DESCRIPTION: Check a returned package object for the correct count and + *              correct type of all sub-objects. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiNsCheckPackage ( +    ACPI_PREDEFINED_DATA        *Data, +    ACPI_OPERAND_OBJECT         **ReturnObjectPtr) +{ +    ACPI_OPERAND_OBJECT         *ReturnObject = *ReturnObjectPtr; +    const ACPI_PREDEFINED_INFO  *Package; +    ACPI_OPERAND_OBJECT         **Elements; +    ACPI_STATUS                 Status = AE_OK; +    UINT32                      ExpectedCount; +    UINT32                      Count; +    UINT32                      i; + + +    ACPI_FUNCTION_NAME (NsCheckPackage); + + +    /* The package info for this name is in the next table entry */ + +    Package = Data->Predefined + 1; + +    ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, +        "%s Validating return Package of Type %X, Count %X\n", +        Data->Pathname, Package->RetInfo.Type, ReturnObject->Package.Count)); + +    /* +     * For variable-length Packages, we can safely remove all embedded +     * and trailing NULL package elements +     */ +    AcpiNsRemoveNullElements (Data, Package->RetInfo.Type, ReturnObject); + +    /* Extract package count and elements array */ + +    Elements = ReturnObject->Package.Elements; +    Count = ReturnObject->Package.Count; + +    /* The package must have at least one element, else invalid */ + +    if (!Count) +    { +        ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, +            "Return Package has no elements (empty)")); + +        return (AE_AML_OPERAND_VALUE); +    } + +    /* +     * Decode the type of the expected package contents +     * +     * PTYPE1 packages contain no subpackages +     * PTYPE2 packages contain sub-packages +     */ +    switch (Package->RetInfo.Type) +    { +    case ACPI_PTYPE1_FIXED: + +        /* +         * The package count is fixed and there are no sub-packages +         * +         * If package is too small, exit. +         * If package is larger than expected, issue warning but continue +         */ +        ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; +        if (Count < ExpectedCount) +        { +            goto PackageTooSmall; +        } +        else if (Count > ExpectedCount) +        { +            ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, +                "%s: Return Package is larger than needed - " +                "found %u, expected %u\n", +                Data->Pathname, Count, ExpectedCount)); +        } + +        /* Validate all elements of the returned package */ + +        Status = AcpiNsCheckPackageElements (Data, Elements, +                    Package->RetInfo.ObjectType1, Package->RetInfo.Count1, +                    Package->RetInfo.ObjectType2, Package->RetInfo.Count2, 0); +        break; + + +    case ACPI_PTYPE1_VAR: + +        /* +         * The package count is variable, there are no sub-packages, and all +         * elements must be of the same type +         */ +        for (i = 0; i < Count; i++) +        { +            Status = AcpiNsCheckObjectType (Data, Elements, +                        Package->RetInfo.ObjectType1, i); +            if (ACPI_FAILURE (Status)) +            { +                return (Status); +            } +            Elements++; +        } +        break; + + +    case ACPI_PTYPE1_OPTION: + +        /* +         * The package count is variable, there are no sub-packages. There are +         * a fixed number of required elements, and a variable number of +         * optional elements. +         * +         * Check if package is at least as large as the minimum required +         */ +        ExpectedCount = Package->RetInfo3.Count; +        if (Count < ExpectedCount) +        { +            goto PackageTooSmall; +        } + +        /* Variable number of sub-objects */ + +        for (i = 0; i < Count; i++) +        { +            if (i < Package->RetInfo3.Count) +            { +                /* These are the required package elements (0, 1, or 2) */ + +                Status = AcpiNsCheckObjectType (Data, Elements, +                            Package->RetInfo3.ObjectType[i], i); +                if (ACPI_FAILURE (Status)) +                { +                    return (Status); +                } +            } +            else +            { +                /* These are the optional package elements */ + +                Status = AcpiNsCheckObjectType (Data, Elements, +                            Package->RetInfo3.TailObjectType, i); +                if (ACPI_FAILURE (Status)) +                { +                    return (Status); +                } +            } +            Elements++; +        } +        break; + + +    case ACPI_PTYPE2_REV_FIXED: + +        /* First element is the (Integer) revision */ + +        Status = AcpiNsCheckObjectType (Data, Elements, +                    ACPI_RTYPE_INTEGER, 0); +        if (ACPI_FAILURE (Status)) +        { +            return (Status); +        } + +        Elements++; +        Count--; + +        /* Examine the sub-packages */ + +        Status = AcpiNsCheckPackageList (Data, Package, Elements, Count); +        break; + + +    case ACPI_PTYPE2_PKG_COUNT: + +        /* First element is the (Integer) count of sub-packages to follow */ + +        Status = AcpiNsCheckObjectType (Data, Elements, +                    ACPI_RTYPE_INTEGER, 0); +        if (ACPI_FAILURE (Status)) +        { +            return (Status); +        } + +        /* +         * Count cannot be larger than the parent package length, but allow it +         * to be smaller. The >= accounts for the Integer above. +         */ +        ExpectedCount = (UINT32) (*Elements)->Integer.Value; +        if (ExpectedCount >= Count) +        { +            goto PackageTooSmall; +        } + +        Count = ExpectedCount; +        Elements++; + +        /* Examine the sub-packages */ + +        Status = AcpiNsCheckPackageList (Data, Package, Elements, Count); +        break; + + +    case ACPI_PTYPE2: +    case ACPI_PTYPE2_FIXED: +    case ACPI_PTYPE2_MIN: +    case ACPI_PTYPE2_COUNT: +    case ACPI_PTYPE2_FIX_VAR: + +        /* +         * These types all return a single Package that consists of a +         * variable number of sub-Packages. +         * +         * First, ensure that the first element is a sub-Package. If not, +         * the BIOS may have incorrectly returned the object as a single +         * package instead of a Package of Packages (a common error if +         * there is only one entry). We may be able to repair this by +         * wrapping the returned Package with a new outer Package. +         */ +        if (*Elements && ((*Elements)->Common.Type != ACPI_TYPE_PACKAGE)) +        { +            /* Create the new outer package and populate it */ + +            Status = AcpiNsWrapWithPackage (Data, ReturnObject, ReturnObjectPtr); +            if (ACPI_FAILURE (Status)) +            { +                return (Status); +            } + +            /* Update locals to point to the new package (of 1 element) */ + +            ReturnObject = *ReturnObjectPtr; +            Elements = ReturnObject->Package.Elements; +            Count = 1; +        } + +        /* Examine the sub-packages */ + +        Status = AcpiNsCheckPackageList (Data, Package, Elements, Count); +        break; + + +    default: + +        /* Should not get here if predefined info table is correct */ + +        ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, +            "Invalid internal return type in table entry: %X", +            Package->RetInfo.Type)); + +        return (AE_AML_INTERNAL); +    } + +    return (Status); + + +PackageTooSmall: + +    /* Error exit for the case with an incorrect package count */ + +    ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, +        "Return Package is too small - found %u elements, expected %u", +        Count, ExpectedCount)); + +    return (AE_AML_OPERAND_VALUE); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiNsCheckPackageList + * + * PARAMETERS:  Data            - Pointer to validation data structure + *              Package         - Pointer to package-specific info for method + *              Elements        - Element list of parent package. All elements + *                                of this list should be of type Package. + *              Count           - Count of subpackages + * + * RETURN:      Status + * + * DESCRIPTION: Examine a list of subpackages + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiNsCheckPackageList ( +    ACPI_PREDEFINED_DATA        *Data, +    const ACPI_PREDEFINED_INFO  *Package, +    ACPI_OPERAND_OBJECT         **Elements, +    UINT32                      Count) +{ +    ACPI_OPERAND_OBJECT         *SubPackage; +    ACPI_OPERAND_OBJECT         **SubElements; +    ACPI_STATUS                 Status; +    UINT32                      ExpectedCount; +    UINT32                      i; +    UINT32                      j; + + +    /* +     * Validate each sub-Package in the parent Package +     * +     * NOTE: assumes list of sub-packages contains no NULL elements. +     * Any NULL elements should have been removed by earlier call +     * to AcpiNsRemoveNullElements. +     */ +    for (i = 0; i < Count; i++) +    { +        SubPackage = *Elements; +        SubElements = SubPackage->Package.Elements; +        Data->ParentPackage = SubPackage; + +        /* Each sub-object must be of type Package */ + +        Status = AcpiNsCheckObjectType (Data, &SubPackage, +                    ACPI_RTYPE_PACKAGE, i); +        if (ACPI_FAILURE (Status)) +        { +            return (Status); +        } + +        /* Examine the different types of expected sub-packages */ + +        Data->ParentPackage = SubPackage; +        switch (Package->RetInfo.Type) +        { +        case ACPI_PTYPE2: +        case ACPI_PTYPE2_PKG_COUNT: +        case ACPI_PTYPE2_REV_FIXED: + +            /* Each subpackage has a fixed number of elements */ + +            ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; +            if (SubPackage->Package.Count < ExpectedCount) +            { +                goto PackageTooSmall; +            } + +            Status = AcpiNsCheckPackageElements (Data, SubElements, +                        Package->RetInfo.ObjectType1, +                        Package->RetInfo.Count1, +                        Package->RetInfo.ObjectType2, +                        Package->RetInfo.Count2, 0); +            if (ACPI_FAILURE (Status)) +            { +                return (Status); +            } +            break; + + +        case ACPI_PTYPE2_FIX_VAR: +            /* +             * Each subpackage has a fixed number of elements and an +             * optional element +             */ +            ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; +            if (SubPackage->Package.Count < ExpectedCount) +            { +                goto PackageTooSmall; +            } + +            Status = AcpiNsCheckPackageElements (Data, SubElements, +                        Package->RetInfo.ObjectType1, +                        Package->RetInfo.Count1, +                        Package->RetInfo.ObjectType2, +                        SubPackage->Package.Count - Package->RetInfo.Count1, 0); +            if (ACPI_FAILURE (Status)) +            { +                return (Status); +            } +            break; + + +        case ACPI_PTYPE2_FIXED: + +            /* Each sub-package has a fixed length */ + +            ExpectedCount = Package->RetInfo2.Count; +            if (SubPackage->Package.Count < ExpectedCount) +            { +                goto PackageTooSmall; +            } + +            /* Check the type of each sub-package element */ + +            for (j = 0; j < ExpectedCount; j++) +            { +                Status = AcpiNsCheckObjectType (Data, &SubElements[j], +                            Package->RetInfo2.ObjectType[j], j); +                if (ACPI_FAILURE (Status)) +                { +                    return (Status); +                } +            } +            break; + + +        case ACPI_PTYPE2_MIN: + +            /* Each sub-package has a variable but minimum length */ + +            ExpectedCount = Package->RetInfo.Count1; +            if (SubPackage->Package.Count < ExpectedCount) +            { +                goto PackageTooSmall; +            } + +            /* Check the type of each sub-package element */ + +            Status = AcpiNsCheckPackageElements (Data, SubElements, +                        Package->RetInfo.ObjectType1, +                        SubPackage->Package.Count, 0, 0, 0); +            if (ACPI_FAILURE (Status)) +            { +                return (Status); +            } +            break; + + +        case ACPI_PTYPE2_COUNT: + +            /* +             * First element is the (Integer) count of elements, including +             * the count field (the ACPI name is NumElements) +             */ +            Status = AcpiNsCheckObjectType (Data, SubElements, +                        ACPI_RTYPE_INTEGER, 0); +            if (ACPI_FAILURE (Status)) +            { +                return (Status); +            } + +            /* +             * Make sure package is large enough for the Count and is +             * is as large as the minimum size +             */ +            ExpectedCount = (UINT32) (*SubElements)->Integer.Value; +            if (SubPackage->Package.Count < ExpectedCount) +            { +                goto PackageTooSmall; +            } +            if (SubPackage->Package.Count < Package->RetInfo.Count1) +            { +                ExpectedCount = Package->RetInfo.Count1; +                goto PackageTooSmall; +            } +            if (ExpectedCount == 0) +            { +                /* +                 * Either the NumEntries element was originally zero or it was +                 * a NULL element and repaired to an Integer of value zero. +                 * In either case, repair it by setting NumEntries to be the +                 * actual size of the subpackage. +                 */ +                ExpectedCount = SubPackage->Package.Count; +                (*SubElements)->Integer.Value = ExpectedCount; +            } + +            /* Check the type of each sub-package element */ + +            Status = AcpiNsCheckPackageElements (Data, (SubElements + 1), +                        Package->RetInfo.ObjectType1, +                        (ExpectedCount - 1), 0, 0, 1); +            if (ACPI_FAILURE (Status)) +            { +                return (Status); +            } +            break; + + +        default: /* Should not get here, type was validated by caller */ + +            return (AE_AML_INTERNAL); +        } + +        Elements++; +    } + +    return (AE_OK); + + +PackageTooSmall: + +    /* The sub-package count was smaller than required */ + +    ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, +        "Return Sub-Package[%u] is too small - found %u elements, expected %u", +        i, SubPackage->Package.Count, ExpectedCount)); + +    return (AE_AML_OPERAND_VALUE); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiNsCheckPackageElements + * + * PARAMETERS:  Data            - Pointer to validation data structure + *              Elements        - Pointer to the package elements array + *              Type1           - Object type for first group + *              Count1          - Count for first group + *              Type2           - Object type for second group + *              Count2          - Count for second group + *              StartIndex      - Start of the first group of elements + * + * RETURN:      Status + * + * DESCRIPTION: Check that all elements of a package are of the correct object + *              type. Supports up to two groups of different object types. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiNsCheckPackageElements ( +    ACPI_PREDEFINED_DATA        *Data, +    ACPI_OPERAND_OBJECT         **Elements, +    UINT8                       Type1, +    UINT32                      Count1, +    UINT8                       Type2, +    UINT32                      Count2, +    UINT32                      StartIndex) +{ +    ACPI_OPERAND_OBJECT         **ThisElement = Elements; +    ACPI_STATUS                 Status; +    UINT32                      i; + + +    /* +     * Up to two groups of package elements are supported by the data +     * structure. All elements in each group must be of the same type. +     * The second group can have a count of zero. +     */ +    for (i = 0; i < Count1; i++) +    { +        Status = AcpiNsCheckObjectType (Data, ThisElement, +                    Type1, i + StartIndex); +        if (ACPI_FAILURE (Status)) +        { +            return (Status); +        } +        ThisElement++; +    } + +    for (i = 0; i < Count2; i++) +    { +        Status = AcpiNsCheckObjectType (Data, ThisElement, +                    Type2, (i + Count1 + StartIndex)); +        if (ACPI_FAILURE (Status)) +        { +            return (Status); +        } +        ThisElement++; +    } + +    return (AE_OK); +} diff --git a/source/components/namespace/nsutils.c b/source/components/namespace/nsutils.c index 68a3f9c2a622..31d4d95f42af 100644 --- a/source/components/namespace/nsutils.c +++ b/source/components/namespace/nsutils.c @@ -54,10 +54,6 @@  /* Local prototypes */ -static BOOLEAN -AcpiNsValidPathSeparator ( -    char                    Sep); -  #ifdef ACPI_OBSOLETE_FUNCTIONS  ACPI_NAME  AcpiNsFindParentName ( @@ -112,48 +108,6 @@ AcpiNsPrintNodePathname (  /*******************************************************************************   * - * FUNCTION:    AcpiNsValidRootPrefix - * - * PARAMETERS:  Prefix          - Character to be checked - * - * RETURN:      TRUE if a valid prefix - * - * DESCRIPTION: Check if a character is a valid ACPI Root prefix - * - ******************************************************************************/ - -BOOLEAN -AcpiNsValidRootPrefix ( -    char                    Prefix) -{ - -    return ((BOOLEAN) (Prefix == '\\')); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiNsValidPathSeparator - * - * PARAMETERS:  Sep         - Character to be checked - * - * RETURN:      TRUE if a valid path separator - * - * DESCRIPTION: Check if a character is a valid ACPI path separator - * - ******************************************************************************/ - -static BOOLEAN -AcpiNsValidPathSeparator ( -    char                    Sep) -{ - -    return ((BOOLEAN) (Sep == '.')); -} - - -/******************************************************************************* - *   * FUNCTION:    AcpiNsGetType   *   * PARAMETERS:  Node        - Parent Node to be examined @@ -174,10 +128,10 @@ AcpiNsGetType (      if (!Node)      {          ACPI_WARNING ((AE_INFO, "Null Node parameter")); -        return_UINT32 (ACPI_TYPE_ANY); +        return_VALUE (ACPI_TYPE_ANY);      } -    return_UINT32 ((ACPI_OBJECT_TYPE) Node->Type); +    return_VALUE (Node->Type);  } @@ -206,10 +160,10 @@ AcpiNsLocal (          /* Type code out of range  */          ACPI_WARNING ((AE_INFO, "Invalid Object Type 0x%X", Type)); -        return_UINT32 (ACPI_NS_NORMAL); +        return_VALUE (ACPI_NS_NORMAL);      } -    return_UINT32 ((UINT32) AcpiGbl_NsProperties[Type] & ACPI_NS_LOCAL); +    return_VALUE (AcpiGbl_NsProperties[Type] & ACPI_NS_LOCAL);  } @@ -250,14 +204,14 @@ AcpiNsGetInternalNameLength (       *       * strlen() + 1 covers the first NameSeg, which has no path separator       */ -    if (AcpiNsValidRootPrefix (*NextExternalChar)) +    if (ACPI_IS_ROOT_PREFIX (*NextExternalChar))      {          Info->FullyQualified = TRUE;          NextExternalChar++;          /* Skip redundant RootPrefix, like \\_SB.PCI0.SBRG.EC0 */ -        while (AcpiNsValidRootPrefix (*NextExternalChar)) +        while (ACPI_IS_ROOT_PREFIX (*NextExternalChar))          {              NextExternalChar++;          } @@ -266,7 +220,7 @@ AcpiNsGetInternalNameLength (      {          /* Handle Carat prefixes */ -        while (*NextExternalChar == '^') +        while (ACPI_IS_PARENT_PREFIX (*NextExternalChar))          {              Info->NumCarats++;              NextExternalChar++; @@ -283,7 +237,7 @@ AcpiNsGetInternalNameLength (          Info->NumSegments = 1;          for (i = 0; NextExternalChar[i]; i++)          { -            if (AcpiNsValidPathSeparator (NextExternalChar[i])) +            if (ACPI_IS_PATH_SEPARATOR (NextExternalChar[i]))              {                  Info->NumSegments++;              } @@ -328,7 +282,7 @@ AcpiNsBuildInternalName (      if (Info->FullyQualified)      { -        InternalName[0] = '\\'; +        InternalName[0] = AML_ROOT_PREFIX;          if (NumSegments <= 1)          { @@ -357,7 +311,7 @@ AcpiNsBuildInternalName (          {              for (i = 0; i < Info->NumCarats; i++)              { -                InternalName[i] = '^'; +                InternalName[i] = AML_PARENT_PREFIX;              }          } @@ -384,7 +338,7 @@ AcpiNsBuildInternalName (      {          for (i = 0; i < ACPI_NAME_SIZE; i++)          { -            if (AcpiNsValidPathSeparator (*ExternalName) || +            if (ACPI_IS_PATH_SEPARATOR (*ExternalName) ||                 (*ExternalName == 0))              {                  /* Pad the segment with underscore(s) if segment is short */ @@ -402,7 +356,7 @@ AcpiNsBuildInternalName (          /* Now we must have a path separator, or the pathname is bad */ -        if (!AcpiNsValidPathSeparator (*ExternalName) && +        if (!ACPI_IS_PATH_SEPARATOR (*ExternalName) &&              (*ExternalName != 0))          {              return_ACPI_STATUS (AE_BAD_PATHNAME); @@ -542,14 +496,14 @@ AcpiNsExternalizeName (      switch (InternalName[0])      { -    case '\\': +    case AML_ROOT_PREFIX:          PrefixLength = 1;          break; -    case '^': +    case AML_PARENT_PREFIX:          for (i = 0; i < InternalNameLength; i++)          { -            if (InternalName[i] == '^') +            if (ACPI_IS_PARENT_PREFIX (InternalName[i]))              {                  PrefixLength = i + 1;              } @@ -829,6 +783,8 @@ AcpiNsGetNode (      ACPI_FUNCTION_TRACE_PTR (NsGetNode, ACPI_CAST_PTR (char, Pathname)); +    /* Simplest case is a null pathname */ +      if (!Pathname)      {          *ReturnNode = PrefixNode; @@ -839,6 +795,14 @@ AcpiNsGetNode (          return_ACPI_STATUS (AE_OK);      } +    /* Quick check for a reference to the root */ + +    if (ACPI_IS_ROOT_PREFIX (Pathname[0]) && (!Pathname[1])) +    { +        *ReturnNode = AcpiGbl_RootNode; +        return_ACPI_STATUS (AE_OK); +    } +      /* Convert path to internal representation */      Status = AcpiNsInternalizeName (Pathname, &InternalPath); diff --git a/source/components/namespace/nsxfeval.c b/source/components/namespace/nsxfeval.c index fcd6fb758758..a1cc59174584 100644 --- a/source/components/namespace/nsxfeval.c +++ b/source/components/namespace/nsxfeval.c @@ -255,7 +255,7 @@ AcpiEvaluateObject (       * 3) Valid handle       */      if ((Pathname) && -        (AcpiNsValidRootPrefix (Pathname[0]))) +        (ACPI_IS_ROOT_PREFIX (Pathname[0])))      {          /* The path is fully qualified, just evaluate by name */ diff --git a/source/components/namespace/nsxfname.c b/source/components/namespace/nsxfname.c index 8b4d686065df..bafe3127123a 100644 --- a/source/components/namespace/nsxfname.c +++ b/source/components/namespace/nsxfname.c @@ -120,7 +120,7 @@ AcpiGetHandle (       *       * Error for <null Parent + relative path>       */ -    if (AcpiNsValidRootPrefix (Pathname[0])) +    if (ACPI_IS_ROOT_PREFIX (Pathname[0]))      {          /* Pathname is fully qualified (starts with '\') */ diff --git a/source/components/parser/psargs.c b/source/components/parser/psargs.c index 74d0cc8eac1e..d4fd1fa690f7 100644 --- a/source/components/parser/psargs.c +++ b/source/components/parser/psargs.c @@ -118,7 +118,7 @@ AcpiPsGetNextPackageLength (      /* Byte 0 is a special case, either bits [0:3] or [0:5] are used */      PackageLength |= (Aml[0] & ByteZeroMask); -    return_UINT32 (PackageLength); +    return_VALUE (PackageLength);  } @@ -182,7 +182,8 @@ AcpiPsGetNextNamestring (      /* Point past any namestring prefix characters (backslash or carat) */ -    while (AcpiPsIsPrefixChar (*End)) +    while (ACPI_IS_ROOT_PREFIX (*End) || +           ACPI_IS_PARENT_PREFIX (*End))      {          End++;      } @@ -868,7 +869,8 @@ AcpiPsGetNextArg (          Subop = AcpiPsPeekOpcode (ParserState);          if (Subop == 0                  ||              AcpiPsIsLeadingChar (Subop) || -            AcpiPsIsPrefixChar (Subop)) +            ACPI_IS_ROOT_PREFIX (Subop) || +            ACPI_IS_PARENT_PREFIX (Subop))          {              /* NullName or NameString */ diff --git a/source/components/parser/psloop.c b/source/components/parser/psloop.c index e63dd04e071f..18a319c06f9a 100644 --- a/source/components/parser/psloop.c +++ b/source/components/parser/psloop.c @@ -59,46 +59,15 @@  #define _COMPONENT          ACPI_PARSER          ACPI_MODULE_NAME    ("psloop") -static UINT32               AcpiGbl_Depth = 0; -  /* Local prototypes */  static ACPI_STATUS -AcpiPsGetAmlOpcode ( -    ACPI_WALK_STATE         *WalkState); - -static ACPI_STATUS -AcpiPsBuildNamedOp ( -    ACPI_WALK_STATE         *WalkState, -    UINT8                   *AmlOpStart, -    ACPI_PARSE_OBJECT       *UnnamedOp, -    ACPI_PARSE_OBJECT       **Op); - -static ACPI_STATUS -AcpiPsCreateOp ( -    ACPI_WALK_STATE         *WalkState, -    UINT8                   *AmlOpStart, -    ACPI_PARSE_OBJECT       **NewOp); - -static ACPI_STATUS  AcpiPsGetArguments (      ACPI_WALK_STATE         *WalkState,      UINT8                   *AmlOpStart,      ACPI_PARSE_OBJECT       *Op); -static ACPI_STATUS -AcpiPsCompleteOp ( -    ACPI_WALK_STATE         *WalkState, -    ACPI_PARSE_OBJECT       **Op, -    ACPI_STATUS             Status); - -static ACPI_STATUS -AcpiPsCompleteFinalOp ( -    ACPI_WALK_STATE         *WalkState, -    ACPI_PARSE_OBJECT       *Op, -    ACPI_STATUS             Status); -  static void  AcpiPsLinkModuleCode (      ACPI_PARSE_OBJECT       *ParentOp, @@ -109,341 +78,6 @@ AcpiPsLinkModuleCode (  /*******************************************************************************   * - * FUNCTION:    AcpiPsGetAmlOpcode - * - * PARAMETERS:  WalkState           - Current state - * - * RETURN:      Status - * - * DESCRIPTION: Extract the next AML opcode from the input stream. - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiPsGetAmlOpcode ( -    ACPI_WALK_STATE         *WalkState) -{ - -    ACPI_FUNCTION_TRACE_PTR (PsGetAmlOpcode, WalkState); - - -    WalkState->AmlOffset = (UINT32) ACPI_PTR_DIFF (WalkState->ParserState.Aml, -                                WalkState->ParserState.AmlStart); -    WalkState->Opcode = AcpiPsPeekOpcode (&(WalkState->ParserState)); - -    /* -     * First cut to determine what we have found: -     * 1) A valid AML opcode -     * 2) A name string -     * 3) An unknown/invalid opcode -     */ -    WalkState->OpInfo = AcpiPsGetOpcodeInfo (WalkState->Opcode); - -    switch (WalkState->OpInfo->Class) -    { -    case AML_CLASS_ASCII: -    case AML_CLASS_PREFIX: -        /* -         * Starts with a valid prefix or ASCII char, this is a name -         * string. Convert the bare name string to a namepath. -         */ -        WalkState->Opcode = AML_INT_NAMEPATH_OP; -        WalkState->ArgTypes = ARGP_NAMESTRING; -        break; - -    case AML_CLASS_UNKNOWN: - -        /* The opcode is unrecognized. Complain and skip unknown opcodes */ - -        if (WalkState->PassNumber == 2) -        { -            ACPI_ERROR ((AE_INFO, -                "Unknown opcode 0x%.2X at table offset 0x%.4X, ignoring", -                WalkState->Opcode, -                (UINT32) (WalkState->AmlOffset + sizeof (ACPI_TABLE_HEADER)))); - -            ACPI_DUMP_BUFFER (WalkState->ParserState.Aml - 16, 48); - -#ifdef ACPI_ASL_COMPILER -            /* -             * This is executed for the disassembler only. Output goes -             * to the disassembled ASL output file. -             */ -            AcpiOsPrintf ( -                "/*\nError: Unknown opcode 0x%.2X at table offset 0x%.4X, context:\n", -                WalkState->Opcode, -                (UINT32) (WalkState->AmlOffset + sizeof (ACPI_TABLE_HEADER))); - -            /* Dump the context surrounding the invalid opcode */ - -            AcpiUtDumpBuffer (((UINT8 *) WalkState->ParserState.Aml - 16), -                48, DB_BYTE_DISPLAY, -                WalkState->AmlOffset + sizeof (ACPI_TABLE_HEADER) - 16); -            AcpiOsPrintf (" */\n"); -#endif -        } - -        /* Increment past one-byte or two-byte opcode */ - -        WalkState->ParserState.Aml++; -        if (WalkState->Opcode > 0xFF) /* Can only happen if first byte is 0x5B */ -        { -            WalkState->ParserState.Aml++; -        } - -        return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE); - -    default: - -        /* Found opcode info, this is a normal opcode */ - -        WalkState->ParserState.Aml += AcpiPsGetOpcodeSize (WalkState->Opcode); -        WalkState->ArgTypes = WalkState->OpInfo->ParseArgs; -        break; -    } - -    return_ACPI_STATUS (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiPsBuildNamedOp - * - * PARAMETERS:  WalkState           - Current state - *              AmlOpStart          - Begin of named Op in AML - *              UnnamedOp           - Early Op (not a named Op) - *              Op                  - Returned Op - * - * RETURN:      Status - * - * DESCRIPTION: Parse a named Op - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiPsBuildNamedOp ( -    ACPI_WALK_STATE         *WalkState, -    UINT8                   *AmlOpStart, -    ACPI_PARSE_OBJECT       *UnnamedOp, -    ACPI_PARSE_OBJECT       **Op) -{ -    ACPI_STATUS             Status = AE_OK; -    ACPI_PARSE_OBJECT       *Arg = NULL; - - -    ACPI_FUNCTION_TRACE_PTR (PsBuildNamedOp, WalkState); - - -    UnnamedOp->Common.Value.Arg = NULL; -    UnnamedOp->Common.ArgListLength = 0; -    UnnamedOp->Common.AmlOpcode = WalkState->Opcode; - -    /* -     * Get and append arguments until we find the node that contains -     * the name (the type ARGP_NAME). -     */ -    while (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) && -          (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) != ARGP_NAME)) -    { -        Status = AcpiPsGetNextArg (WalkState, &(WalkState->ParserState), -                    GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), &Arg); -        if (ACPI_FAILURE (Status)) -        { -            return_ACPI_STATUS (Status); -        } - -        AcpiPsAppendArg (UnnamedOp, Arg); -        INCREMENT_ARG_LIST (WalkState->ArgTypes); -    } - -    /* -     * Make sure that we found a NAME and didn't run out of arguments -     */ -    if (!GET_CURRENT_ARG_TYPE (WalkState->ArgTypes)) -    { -        return_ACPI_STATUS (AE_AML_NO_OPERAND); -    } - -    /* We know that this arg is a name, move to next arg */ - -    INCREMENT_ARG_LIST (WalkState->ArgTypes); - -    /* -     * Find the object. This will either insert the object into -     * the namespace or simply look it up -     */ -    WalkState->Op = NULL; - -    Status = WalkState->DescendingCallback (WalkState, Op); -    if (ACPI_FAILURE (Status)) -    { -        ACPI_EXCEPTION ((AE_INFO, Status, "During name lookup/catalog")); -        return_ACPI_STATUS (Status); -    } - -    if (!*Op) -    { -        return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE); -    } - -    Status = AcpiPsNextParseState (WalkState, *Op, Status); -    if (ACPI_FAILURE (Status)) -    { -        if (Status == AE_CTRL_PENDING) -        { -            return_ACPI_STATUS (AE_CTRL_PARSE_PENDING); -        } -        return_ACPI_STATUS (Status); -    } - -    AcpiPsAppendArg (*Op, UnnamedOp->Common.Value.Arg); -    AcpiGbl_Depth++; - -    if ((*Op)->Common.AmlOpcode == AML_REGION_OP || -        (*Op)->Common.AmlOpcode == AML_DATA_REGION_OP) -    { -        /* -         * Defer final parsing of an OperationRegion body, because we don't -         * have enough info in the first pass to parse it correctly (i.e., -         * there may be method calls within the TermArg elements of the body.) -         * -         * However, we must continue parsing because the opregion is not a -         * standalone package -- we don't know where the end is at this point. -         * -         * (Length is unknown until parse of the body complete) -         */ -        (*Op)->Named.Data = AmlOpStart; -        (*Op)->Named.Length = 0; -    } - -    return_ACPI_STATUS (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiPsCreateOp - * - * PARAMETERS:  WalkState           - Current state - *              AmlOpStart          - Op start in AML - *              NewOp               - Returned Op - * - * RETURN:      Status - * - * DESCRIPTION: Get Op from AML - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiPsCreateOp ( -    ACPI_WALK_STATE         *WalkState, -    UINT8                   *AmlOpStart, -    ACPI_PARSE_OBJECT       **NewOp) -{ -    ACPI_STATUS             Status = AE_OK; -    ACPI_PARSE_OBJECT       *Op; -    ACPI_PARSE_OBJECT       *NamedOp = NULL; -    ACPI_PARSE_OBJECT       *ParentScope; -    UINT8                   ArgumentCount; -    const ACPI_OPCODE_INFO  *OpInfo; - - -    ACPI_FUNCTION_TRACE_PTR (PsCreateOp, WalkState); - - -    Status = AcpiPsGetAmlOpcode (WalkState); -    if (Status == AE_CTRL_PARSE_CONTINUE) -    { -        return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE); -    } - -    /* Create Op structure and append to parent's argument list */ - -    WalkState->OpInfo = AcpiPsGetOpcodeInfo (WalkState->Opcode); -    Op = AcpiPsAllocOp (WalkState->Opcode); -    if (!Op) -    { -        return_ACPI_STATUS (AE_NO_MEMORY); -    } - -    if (WalkState->OpInfo->Flags & AML_NAMED) -    { -        Status = AcpiPsBuildNamedOp (WalkState, AmlOpStart, Op, &NamedOp); -        AcpiPsFreeOp (Op); -        if (ACPI_FAILURE (Status)) -        { -            return_ACPI_STATUS (Status); -        } - -        *NewOp = NamedOp; -        return_ACPI_STATUS (AE_OK); -    } - -    /* Not a named opcode, just allocate Op and append to parent */ - -    if (WalkState->OpInfo->Flags & AML_CREATE) -    { -        /* -         * Backup to beginning of CreateXXXfield declaration -         * BodyLength is unknown until we parse the body -         */ -        Op->Named.Data = AmlOpStart; -        Op->Named.Length = 0; -    } - -    if (WalkState->Opcode == AML_BANK_FIELD_OP) -    { -        /* -         * Backup to beginning of BankField declaration -         * BodyLength is unknown until we parse the body -         */ -        Op->Named.Data = AmlOpStart; -        Op->Named.Length = 0; -    } - -    ParentScope = AcpiPsGetParentScope (&(WalkState->ParserState)); -    AcpiPsAppendArg (ParentScope, Op); - -    if (ParentScope) -    { -        OpInfo = AcpiPsGetOpcodeInfo (ParentScope->Common.AmlOpcode); -        if (OpInfo->Flags & AML_HAS_TARGET) -        { -            ArgumentCount = AcpiPsGetArgumentCount (OpInfo->Type); -            if (ParentScope->Common.ArgListLength > ArgumentCount) -            { -                Op->Common.Flags |= ACPI_PARSEOP_TARGET; -            } -        } -        else if (ParentScope->Common.AmlOpcode == AML_INCREMENT_OP) -        { -            Op->Common.Flags |= ACPI_PARSEOP_TARGET; -        } -    } - -    if (WalkState->DescendingCallback != NULL) -    { -        /* -         * Find the object. This will either insert the object into -         * the namespace or simply look it up -         */ -        WalkState->Op = *NewOp = Op; - -        Status = WalkState->DescendingCallback (WalkState, &Op); -        Status = AcpiPsNextParseState (WalkState, Op, Status); -        if (Status == AE_CTRL_PENDING) -        { -            Status = AE_CTRL_PARSE_PENDING; -        } -    } - -    return_ACPI_STATUS (Status); -} - - -/******************************************************************************* - *   * FUNCTION:    AcpiPsGetArguments   *   * PARAMETERS:  WalkState           - Current state @@ -746,298 +380,6 @@ AcpiPsLinkModuleCode (      }  } - -/******************************************************************************* - * - * FUNCTION:    AcpiPsCompleteOp - * - * PARAMETERS:  WalkState           - Current state - *              Op                  - Returned Op - *              Status              - Parse status before complete Op - * - * RETURN:      Status - * - * DESCRIPTION: Complete Op - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiPsCompleteOp ( -    ACPI_WALK_STATE         *WalkState, -    ACPI_PARSE_OBJECT       **Op, -    ACPI_STATUS             Status) -{ -    ACPI_STATUS             Status2; - - -    ACPI_FUNCTION_TRACE_PTR (PsCompleteOp, WalkState); - - -    /* -     * Finished one argument of the containing scope -     */ -    WalkState->ParserState.Scope->ParseScope.ArgCount--; - -    /* Close this Op (will result in parse subtree deletion) */ - -    Status2 = AcpiPsCompleteThisOp (WalkState, *Op); -    if (ACPI_FAILURE (Status2)) -    { -        return_ACPI_STATUS (Status2); -    } - -    *Op = NULL; - -    switch (Status) -    { -    case AE_OK: -        break; - - -    case AE_CTRL_TRANSFER: - -        /* We are about to transfer to a called method */ - -        WalkState->PrevOp = NULL; -        WalkState->PrevArgTypes = WalkState->ArgTypes; -        return_ACPI_STATUS (Status); - - -    case AE_CTRL_END: - -        AcpiPsPopScope (&(WalkState->ParserState), Op, -            &WalkState->ArgTypes, &WalkState->ArgCount); - -        if (*Op) -        { -            WalkState->Op = *Op; -            WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode); -            WalkState->Opcode = (*Op)->Common.AmlOpcode; - -            Status = WalkState->AscendingCallback (WalkState); -            Status = AcpiPsNextParseState (WalkState, *Op, Status); - -            Status2 = AcpiPsCompleteThisOp (WalkState, *Op); -            if (ACPI_FAILURE (Status2)) -            { -                return_ACPI_STATUS (Status2); -            } -        } - -        Status = AE_OK; -        break; - - -    case AE_CTRL_BREAK: -    case AE_CTRL_CONTINUE: - -        /* Pop off scopes until we find the While */ - -        while (!(*Op) || ((*Op)->Common.AmlOpcode != AML_WHILE_OP)) -        { -            AcpiPsPopScope (&(WalkState->ParserState), Op, -                &WalkState->ArgTypes, &WalkState->ArgCount); -        } - -        /* Close this iteration of the While loop */ - -        WalkState->Op = *Op; -        WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode); -        WalkState->Opcode = (*Op)->Common.AmlOpcode; - -        Status = WalkState->AscendingCallback (WalkState); -        Status = AcpiPsNextParseState (WalkState, *Op, Status); - -        Status2 = AcpiPsCompleteThisOp (WalkState, *Op); -        if (ACPI_FAILURE (Status2)) -        { -            return_ACPI_STATUS (Status2); -        } - -        Status = AE_OK; -        break; - - -    case AE_CTRL_TERMINATE: - -        /* Clean up */ -        do -        { -            if (*Op) -            { -                Status2 = AcpiPsCompleteThisOp (WalkState, *Op); -                if (ACPI_FAILURE (Status2)) -                { -                    return_ACPI_STATUS (Status2); -                } - -                AcpiUtDeleteGenericState ( -                    AcpiUtPopGenericState (&WalkState->ControlState)); -            } - -            AcpiPsPopScope (&(WalkState->ParserState), Op, -                &WalkState->ArgTypes, &WalkState->ArgCount); - -        } while (*Op); - -        return_ACPI_STATUS (AE_OK); - - -    default:  /* All other non-AE_OK status */ - -        do -        { -            if (*Op) -            { -                Status2 = AcpiPsCompleteThisOp (WalkState, *Op); -                if (ACPI_FAILURE (Status2)) -                { -                    return_ACPI_STATUS (Status2); -                } -            } - -            AcpiPsPopScope (&(WalkState->ParserState), Op, -                &WalkState->ArgTypes, &WalkState->ArgCount); - -        } while (*Op); - - -#if 0 -        /* -         * TBD: Cleanup parse ops on error -         */ -        if (*Op == NULL) -        { -            AcpiPsPopScope (ParserState, Op, -                &WalkState->ArgTypes, &WalkState->ArgCount); -        } -#endif -        WalkState->PrevOp = NULL; -        WalkState->PrevArgTypes = WalkState->ArgTypes; -        return_ACPI_STATUS (Status); -    } - -    /* This scope complete? */ - -    if (AcpiPsHasCompletedScope (&(WalkState->ParserState))) -    { -        AcpiPsPopScope (&(WalkState->ParserState), Op, -            &WalkState->ArgTypes, &WalkState->ArgCount); -        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", *Op)); -    } -    else -    { -        *Op = NULL; -    } - -    return_ACPI_STATUS (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiPsCompleteFinalOp - * - * PARAMETERS:  WalkState           - Current state - *              Op                  - Current Op - *              Status              - Current parse status before complete last - *                                    Op - * - * RETURN:      Status - * - * DESCRIPTION: Complete last Op. - * - ******************************************************************************/ - -static ACPI_STATUS -AcpiPsCompleteFinalOp ( -    ACPI_WALK_STATE         *WalkState, -    ACPI_PARSE_OBJECT       *Op, -    ACPI_STATUS             Status) -{ -    ACPI_STATUS             Status2; - - -    ACPI_FUNCTION_TRACE_PTR (PsCompleteFinalOp, WalkState); - - -    /* -     * Complete the last Op (if not completed), and clear the scope stack. -     * It is easily possible to end an AML "package" with an unbounded number -     * of open scopes (such as when several ASL blocks are closed with -     * sequential closing braces). We want to terminate each one cleanly. -     */ -    ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "AML package complete at Op %p\n", Op)); -    do -    { -        if (Op) -        { -            if (WalkState->AscendingCallback != NULL) -            { -                WalkState->Op = Op; -                WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); -                WalkState->Opcode = Op->Common.AmlOpcode; - -                Status = WalkState->AscendingCallback (WalkState); -                Status = AcpiPsNextParseState (WalkState, Op, Status); -                if (Status == AE_CTRL_PENDING) -                { -                    Status = AcpiPsCompleteOp (WalkState, &Op, AE_OK); -                    if (ACPI_FAILURE (Status)) -                    { -                        return_ACPI_STATUS (Status); -                    } -                } - -                if (Status == AE_CTRL_TERMINATE) -                { -                    Status = AE_OK; - -                    /* Clean up */ -                    do -                    { -                        if (Op) -                        { -                            Status2 = AcpiPsCompleteThisOp (WalkState, Op); -                            if (ACPI_FAILURE (Status2)) -                            { -                                return_ACPI_STATUS (Status2); -                            } -                        } - -                        AcpiPsPopScope (&(WalkState->ParserState), &Op, -                            &WalkState->ArgTypes, &WalkState->ArgCount); - -                    } while (Op); - -                    return_ACPI_STATUS (Status); -                } - -                else if (ACPI_FAILURE (Status)) -                { -                    /* First error is most important */ - -                    (void) AcpiPsCompleteThisOp (WalkState, Op); -                    return_ACPI_STATUS (Status); -                } -            } - -            Status2 = AcpiPsCompleteThisOp (WalkState, Op); -            if (ACPI_FAILURE (Status2)) -            { -                return_ACPI_STATUS (Status2); -            } -        } - -        AcpiPsPopScope (&(WalkState->ParserState), &Op, &WalkState->ArgTypes, -            &WalkState->ArgCount); - -    } while (Op); - -    return_ACPI_STATUS (Status); -} - -  /*******************************************************************************   *   * FUNCTION:    AcpiPsParseLoop @@ -1225,11 +567,6 @@ AcpiPsParseLoop (          WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);          if (WalkState->OpInfo->Flags & AML_NAMED)          { -            if (AcpiGbl_Depth) -            { -                AcpiGbl_Depth--; -            } -              if (Op->Common.AmlOpcode == AML_REGION_OP ||                  Op->Common.AmlOpcode == AML_DATA_REGION_OP)              { diff --git a/source/components/parser/psobject.c b/source/components/parser/psobject.c new file mode 100644 index 000000000000..c0b1fae30abd --- /dev/null +++ b/source/components/parser/psobject.c @@ -0,0 +1,683 @@ +/****************************************************************************** + * + * Module Name: psobject - Support for parse objects + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2012, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions, and the following disclaimer, + *    without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + *    substantially similar to the "NO WARRANTY" disclaimer below + *    ("Disclaimer") and any redistribution must be conditioned upon + *    including a substantially similar Disclaimer requirement for further + *    binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + *    of any contributors may be used to endorse or promote products derived + *    from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + */ + + +#include "acpi.h" +#include "accommon.h" +#include "acparser.h" +#include "amlcode.h" + +#define _COMPONENT          ACPI_PARSER +        ACPI_MODULE_NAME    ("psobject") + + +/* Local prototypes */ + +static ACPI_STATUS +AcpiPsGetAmlOpcode ( +    ACPI_WALK_STATE         *WalkState); + + +/******************************************************************************* + * + * FUNCTION:    AcpiPsGetAmlOpcode + * + * PARAMETERS:  WalkState           - Current state + * + * RETURN:      Status + * + * DESCRIPTION: Extract the next AML opcode from the input stream. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiPsGetAmlOpcode ( +    ACPI_WALK_STATE         *WalkState) +{ + +    ACPI_FUNCTION_TRACE_PTR (PsGetAmlOpcode, WalkState); + + +    WalkState->AmlOffset = (UINT32) ACPI_PTR_DIFF (WalkState->ParserState.Aml, +                                WalkState->ParserState.AmlStart); +    WalkState->Opcode = AcpiPsPeekOpcode (&(WalkState->ParserState)); + +    /* +     * First cut to determine what we have found: +     * 1) A valid AML opcode +     * 2) A name string +     * 3) An unknown/invalid opcode +     */ +    WalkState->OpInfo = AcpiPsGetOpcodeInfo (WalkState->Opcode); + +    switch (WalkState->OpInfo->Class) +    { +    case AML_CLASS_ASCII: +    case AML_CLASS_PREFIX: +        /* +         * Starts with a valid prefix or ASCII char, this is a name +         * string. Convert the bare name string to a namepath. +         */ +        WalkState->Opcode = AML_INT_NAMEPATH_OP; +        WalkState->ArgTypes = ARGP_NAMESTRING; +        break; + +    case AML_CLASS_UNKNOWN: + +        /* The opcode is unrecognized. Complain and skip unknown opcodes */ + +        if (WalkState->PassNumber == 2) +        { +            ACPI_ERROR ((AE_INFO, +                "Unknown opcode 0x%.2X at table offset 0x%.4X, ignoring", +                WalkState->Opcode, +                (UINT32) (WalkState->AmlOffset + sizeof (ACPI_TABLE_HEADER)))); + +            ACPI_DUMP_BUFFER ((WalkState->ParserState.Aml - 16), 48); + +#ifdef ACPI_ASL_COMPILER +            /* +             * This is executed for the disassembler only. Output goes +             * to the disassembled ASL output file. +             */ +            AcpiOsPrintf ( +                "/*\nError: Unknown opcode 0x%.2X at table offset 0x%.4X, context:\n", +                WalkState->Opcode, +                (UINT32) (WalkState->AmlOffset + sizeof (ACPI_TABLE_HEADER))); + +            /* Dump the context surrounding the invalid opcode */ + +            AcpiUtDumpBuffer (((UINT8 *) WalkState->ParserState.Aml - 16), +                48, DB_BYTE_DISPLAY, +                (WalkState->AmlOffset + sizeof (ACPI_TABLE_HEADER) - 16)); +            AcpiOsPrintf (" */\n"); +#endif +        } + +        /* Increment past one-byte or two-byte opcode */ + +        WalkState->ParserState.Aml++; +        if (WalkState->Opcode > 0xFF) /* Can only happen if first byte is 0x5B */ +        { +            WalkState->ParserState.Aml++; +        } + +        return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE); + +    default: + +        /* Found opcode info, this is a normal opcode */ + +        WalkState->ParserState.Aml += AcpiPsGetOpcodeSize (WalkState->Opcode); +        WalkState->ArgTypes = WalkState->OpInfo->ParseArgs; +        break; +    } + +    return_ACPI_STATUS (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiPsBuildNamedOp + * + * PARAMETERS:  WalkState           - Current state + *              AmlOpStart          - Begin of named Op in AML + *              UnnamedOp           - Early Op (not a named Op) + *              Op                  - Returned Op + * + * RETURN:      Status + * + * DESCRIPTION: Parse a named Op + * + ******************************************************************************/ + +ACPI_STATUS +AcpiPsBuildNamedOp ( +    ACPI_WALK_STATE         *WalkState, +    UINT8                   *AmlOpStart, +    ACPI_PARSE_OBJECT       *UnnamedOp, +    ACPI_PARSE_OBJECT       **Op) +{ +    ACPI_STATUS             Status = AE_OK; +    ACPI_PARSE_OBJECT       *Arg = NULL; + + +    ACPI_FUNCTION_TRACE_PTR (PsBuildNamedOp, WalkState); + + +    UnnamedOp->Common.Value.Arg = NULL; +    UnnamedOp->Common.ArgListLength = 0; +    UnnamedOp->Common.AmlOpcode = WalkState->Opcode; + +    /* +     * Get and append arguments until we find the node that contains +     * the name (the type ARGP_NAME). +     */ +    while (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) && +          (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) != ARGP_NAME)) +    { +        Status = AcpiPsGetNextArg (WalkState, &(WalkState->ParserState), +                    GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), &Arg); +        if (ACPI_FAILURE (Status)) +        { +            return_ACPI_STATUS (Status); +        } + +        AcpiPsAppendArg (UnnamedOp, Arg); +        INCREMENT_ARG_LIST (WalkState->ArgTypes); +    } + +    /* +     * Make sure that we found a NAME and didn't run out of arguments +     */ +    if (!GET_CURRENT_ARG_TYPE (WalkState->ArgTypes)) +    { +        return_ACPI_STATUS (AE_AML_NO_OPERAND); +    } + +    /* We know that this arg is a name, move to next arg */ + +    INCREMENT_ARG_LIST (WalkState->ArgTypes); + +    /* +     * Find the object. This will either insert the object into +     * the namespace or simply look it up +     */ +    WalkState->Op = NULL; + +    Status = WalkState->DescendingCallback (WalkState, Op); +    if (ACPI_FAILURE (Status)) +    { +        ACPI_EXCEPTION ((AE_INFO, Status, "During name lookup/catalog")); +        return_ACPI_STATUS (Status); +    } + +    if (!*Op) +    { +        return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE); +    } + +    Status = AcpiPsNextParseState (WalkState, *Op, Status); +    if (ACPI_FAILURE (Status)) +    { +        if (Status == AE_CTRL_PENDING) +        { +            return_ACPI_STATUS (AE_CTRL_PARSE_PENDING); +        } +        return_ACPI_STATUS (Status); +    } + +    AcpiPsAppendArg (*Op, UnnamedOp->Common.Value.Arg); + +    if ((*Op)->Common.AmlOpcode == AML_REGION_OP || +        (*Op)->Common.AmlOpcode == AML_DATA_REGION_OP) +    { +        /* +         * Defer final parsing of an OperationRegion body, because we don't +         * have enough info in the first pass to parse it correctly (i.e., +         * there may be method calls within the TermArg elements of the body.) +         * +         * However, we must continue parsing because the opregion is not a +         * standalone package -- we don't know where the end is at this point. +         * +         * (Length is unknown until parse of the body complete) +         */ +        (*Op)->Named.Data = AmlOpStart; +        (*Op)->Named.Length = 0; +    } + +    return_ACPI_STATUS (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiPsCreateOp + * + * PARAMETERS:  WalkState           - Current state + *              AmlOpStart          - Op start in AML + *              NewOp               - Returned Op + * + * RETURN:      Status + * + * DESCRIPTION: Get Op from AML + * + ******************************************************************************/ + +ACPI_STATUS +AcpiPsCreateOp ( +    ACPI_WALK_STATE         *WalkState, +    UINT8                   *AmlOpStart, +    ACPI_PARSE_OBJECT       **NewOp) +{ +    ACPI_STATUS             Status = AE_OK; +    ACPI_PARSE_OBJECT       *Op; +    ACPI_PARSE_OBJECT       *NamedOp = NULL; +    ACPI_PARSE_OBJECT       *ParentScope; +    UINT8                   ArgumentCount; +    const ACPI_OPCODE_INFO  *OpInfo; + + +    ACPI_FUNCTION_TRACE_PTR (PsCreateOp, WalkState); + + +    Status = AcpiPsGetAmlOpcode (WalkState); +    if (Status == AE_CTRL_PARSE_CONTINUE) +    { +        return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE); +    } + +    /* Create Op structure and append to parent's argument list */ + +    WalkState->OpInfo = AcpiPsGetOpcodeInfo (WalkState->Opcode); +    Op = AcpiPsAllocOp (WalkState->Opcode); +    if (!Op) +    { +        return_ACPI_STATUS (AE_NO_MEMORY); +    } + +    if (WalkState->OpInfo->Flags & AML_NAMED) +    { +        Status = AcpiPsBuildNamedOp (WalkState, AmlOpStart, Op, &NamedOp); +        AcpiPsFreeOp (Op); +        if (ACPI_FAILURE (Status)) +        { +            return_ACPI_STATUS (Status); +        } + +        *NewOp = NamedOp; +        return_ACPI_STATUS (AE_OK); +    } + +    /* Not a named opcode, just allocate Op and append to parent */ + +    if (WalkState->OpInfo->Flags & AML_CREATE) +    { +        /* +         * Backup to beginning of CreateXXXfield declaration +         * BodyLength is unknown until we parse the body +         */ +        Op->Named.Data = AmlOpStart; +        Op->Named.Length = 0; +    } + +    if (WalkState->Opcode == AML_BANK_FIELD_OP) +    { +        /* +         * Backup to beginning of BankField declaration +         * BodyLength is unknown until we parse the body +         */ +        Op->Named.Data = AmlOpStart; +        Op->Named.Length = 0; +    } + +    ParentScope = AcpiPsGetParentScope (&(WalkState->ParserState)); +    AcpiPsAppendArg (ParentScope, Op); + +    if (ParentScope) +    { +        OpInfo = AcpiPsGetOpcodeInfo (ParentScope->Common.AmlOpcode); +        if (OpInfo->Flags & AML_HAS_TARGET) +        { +            ArgumentCount = AcpiPsGetArgumentCount (OpInfo->Type); +            if (ParentScope->Common.ArgListLength > ArgumentCount) +            { +                Op->Common.Flags |= ACPI_PARSEOP_TARGET; +            } +        } +        else if (ParentScope->Common.AmlOpcode == AML_INCREMENT_OP) +        { +            Op->Common.Flags |= ACPI_PARSEOP_TARGET; +        } +    } + +    if (WalkState->DescendingCallback != NULL) +    { +        /* +         * Find the object. This will either insert the object into +         * the namespace or simply look it up +         */ +        WalkState->Op = *NewOp = Op; + +        Status = WalkState->DescendingCallback (WalkState, &Op); +        Status = AcpiPsNextParseState (WalkState, Op, Status); +        if (Status == AE_CTRL_PENDING) +        { +            Status = AE_CTRL_PARSE_PENDING; +        } +    } + +    return_ACPI_STATUS (Status); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiPsCompleteOp + * + * PARAMETERS:  WalkState           - Current state + *              Op                  - Returned Op + *              Status              - Parse status before complete Op + * + * RETURN:      Status + * + * DESCRIPTION: Complete Op + * + ******************************************************************************/ + +ACPI_STATUS +AcpiPsCompleteOp ( +    ACPI_WALK_STATE         *WalkState, +    ACPI_PARSE_OBJECT       **Op, +    ACPI_STATUS             Status) +{ +    ACPI_STATUS             Status2; + + +    ACPI_FUNCTION_TRACE_PTR (PsCompleteOp, WalkState); + + +    /* +     * Finished one argument of the containing scope +     */ +    WalkState->ParserState.Scope->ParseScope.ArgCount--; + +    /* Close this Op (will result in parse subtree deletion) */ + +    Status2 = AcpiPsCompleteThisOp (WalkState, *Op); +    if (ACPI_FAILURE (Status2)) +    { +        return_ACPI_STATUS (Status2); +    } + +    *Op = NULL; + +    switch (Status) +    { +    case AE_OK: +        break; + + +    case AE_CTRL_TRANSFER: + +        /* We are about to transfer to a called method */ + +        WalkState->PrevOp = NULL; +        WalkState->PrevArgTypes = WalkState->ArgTypes; +        return_ACPI_STATUS (Status); + + +    case AE_CTRL_END: + +        AcpiPsPopScope (&(WalkState->ParserState), Op, +            &WalkState->ArgTypes, &WalkState->ArgCount); + +        if (*Op) +        { +            WalkState->Op = *Op; +            WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode); +            WalkState->Opcode = (*Op)->Common.AmlOpcode; + +            Status = WalkState->AscendingCallback (WalkState); +            Status = AcpiPsNextParseState (WalkState, *Op, Status); + +            Status2 = AcpiPsCompleteThisOp (WalkState, *Op); +            if (ACPI_FAILURE (Status2)) +            { +                return_ACPI_STATUS (Status2); +            } +        } + +        Status = AE_OK; +        break; + + +    case AE_CTRL_BREAK: +    case AE_CTRL_CONTINUE: + +        /* Pop off scopes until we find the While */ + +        while (!(*Op) || ((*Op)->Common.AmlOpcode != AML_WHILE_OP)) +        { +            AcpiPsPopScope (&(WalkState->ParserState), Op, +                &WalkState->ArgTypes, &WalkState->ArgCount); +        } + +        /* Close this iteration of the While loop */ + +        WalkState->Op = *Op; +        WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode); +        WalkState->Opcode = (*Op)->Common.AmlOpcode; + +        Status = WalkState->AscendingCallback (WalkState); +        Status = AcpiPsNextParseState (WalkState, *Op, Status); + +        Status2 = AcpiPsCompleteThisOp (WalkState, *Op); +        if (ACPI_FAILURE (Status2)) +        { +            return_ACPI_STATUS (Status2); +        } + +        Status = AE_OK; +        break; + + +    case AE_CTRL_TERMINATE: + +        /* Clean up */ +        do +        { +            if (*Op) +            { +                Status2 = AcpiPsCompleteThisOp (WalkState, *Op); +                if (ACPI_FAILURE (Status2)) +                { +                    return_ACPI_STATUS (Status2); +                } + +                AcpiUtDeleteGenericState ( +                    AcpiUtPopGenericState (&WalkState->ControlState)); +            } + +            AcpiPsPopScope (&(WalkState->ParserState), Op, +                &WalkState->ArgTypes, &WalkState->ArgCount); + +        } while (*Op); + +        return_ACPI_STATUS (AE_OK); + + +    default:  /* All other non-AE_OK status */ + +        do +        { +            if (*Op) +            { +                Status2 = AcpiPsCompleteThisOp (WalkState, *Op); +                if (ACPI_FAILURE (Status2)) +                { +                    return_ACPI_STATUS (Status2); +                } +            } + +            AcpiPsPopScope (&(WalkState->ParserState), Op, +                &WalkState->ArgTypes, &WalkState->ArgCount); + +        } while (*Op); + + +#if 0 +        /* +         * TBD: Cleanup parse ops on error +         */ +        if (*Op == NULL) +        { +            AcpiPsPopScope (ParserState, Op, +                &WalkState->ArgTypes, &WalkState->ArgCount); +        } +#endif +        WalkState->PrevOp = NULL; +        WalkState->PrevArgTypes = WalkState->ArgTypes; +        return_ACPI_STATUS (Status); +    } + +    /* This scope complete? */ + +    if (AcpiPsHasCompletedScope (&(WalkState->ParserState))) +    { +        AcpiPsPopScope (&(WalkState->ParserState), Op, +            &WalkState->ArgTypes, &WalkState->ArgCount); +        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", *Op)); +    } +    else +    { +        *Op = NULL; +    } + +    return_ACPI_STATUS (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiPsCompleteFinalOp + * + * PARAMETERS:  WalkState           - Current state + *              Op                  - Current Op + *              Status              - Current parse status before complete last + *                                    Op + * + * RETURN:      Status + * + * DESCRIPTION: Complete last Op. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiPsCompleteFinalOp ( +    ACPI_WALK_STATE         *WalkState, +    ACPI_PARSE_OBJECT       *Op, +    ACPI_STATUS             Status) +{ +    ACPI_STATUS             Status2; + + +    ACPI_FUNCTION_TRACE_PTR (PsCompleteFinalOp, WalkState); + + +    /* +     * Complete the last Op (if not completed), and clear the scope stack. +     * It is easily possible to end an AML "package" with an unbounded number +     * of open scopes (such as when several ASL blocks are closed with +     * sequential closing braces). We want to terminate each one cleanly. +     */ +    ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "AML package complete at Op %p\n", Op)); +    do +    { +        if (Op) +        { +            if (WalkState->AscendingCallback != NULL) +            { +                WalkState->Op = Op; +                WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); +                WalkState->Opcode = Op->Common.AmlOpcode; + +                Status = WalkState->AscendingCallback (WalkState); +                Status = AcpiPsNextParseState (WalkState, Op, Status); +                if (Status == AE_CTRL_PENDING) +                { +                    Status = AcpiPsCompleteOp (WalkState, &Op, AE_OK); +                    if (ACPI_FAILURE (Status)) +                    { +                        return_ACPI_STATUS (Status); +                    } +                } + +                if (Status == AE_CTRL_TERMINATE) +                { +                    Status = AE_OK; + +                    /* Clean up */ +                    do +                    { +                        if (Op) +                        { +                            Status2 = AcpiPsCompleteThisOp (WalkState, Op); +                            if (ACPI_FAILURE (Status2)) +                            { +                                return_ACPI_STATUS (Status2); +                            } +                        } + +                        AcpiPsPopScope (&(WalkState->ParserState), &Op, +                            &WalkState->ArgTypes, &WalkState->ArgCount); + +                    } while (Op); + +                    return_ACPI_STATUS (Status); +                } + +                else if (ACPI_FAILURE (Status)) +                { +                    /* First error is most important */ + +                    (void) AcpiPsCompleteThisOp (WalkState, Op); +                    return_ACPI_STATUS (Status); +                } +            } + +            Status2 = AcpiPsCompleteThisOp (WalkState, Op); +            if (ACPI_FAILURE (Status2)) +            { +                return_ACPI_STATUS (Status2); +            } +        } + +        AcpiPsPopScope (&(WalkState->ParserState), &Op, &WalkState->ArgTypes, +            &WalkState->ArgCount); + +    } while (Op); + +    return_ACPI_STATUS (Status); +} diff --git a/source/components/parser/psopcode.c b/source/components/parser/psopcode.c index 139c93466837..3df1c13bdec7 100644 --- a/source/components/parser/psopcode.c +++ b/source/components/parser/psopcode.c @@ -44,7 +44,6 @@  #include "acpi.h"  #include "accommon.h" -#include "acparser.h"  #include "acopcode.h"  #include "amlcode.h" @@ -53,9 +52,6 @@          ACPI_MODULE_NAME    ("psopcode") -static const UINT8          AcpiGbl_ArgumentCount[] = {0,1,1,1,1,2,2,2,2,3,3,6}; - -  /*******************************************************************************   *   * NAME:        AcpiGbl_AmlOpInfo @@ -342,181 +338,3 @@ const ACPI_OPCODE_INFO    AcpiGbl_AmlOpInfo[AML_NUM_OPCODES] =  /*! [End] no source code translation !*/  }; - -/* - * This table is directly indexed by the opcodes, and returns an - * index into the table above - */ -static const UINT8 AcpiGbl_ShortOpIndex[256] = -{ -/*              0     1     2     3     4     5     6     7  */ -/*              8     9     A     B     C     D     E     F  */ -/* 0x00 */    0x00, 0x01, _UNK, _UNK, _UNK, _UNK, 0x02, _UNK, -/* 0x08 */    0x03, _UNK, 0x04, 0x05, 0x06, 0x07, 0x6E, _UNK, -/* 0x10 */    0x08, 0x09, 0x0a, 0x6F, 0x0b, _UNK, _UNK, _UNK, -/* 0x18 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x20 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x28 */    _UNK, _UNK, _UNK, _UNK, _UNK, 0x63, _PFX, _PFX, -/* 0x30 */    0x67, 0x66, 0x68, 0x65, 0x69, 0x64, 0x6A, 0x7D, -/* 0x38 */    0x7F, 0x80, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x40 */    _UNK, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, -/* 0x48 */    _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, -/* 0x50 */    _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, -/* 0x58 */    _ASC, _ASC, _ASC, _UNK, _PFX, _UNK, _PFX, _ASC, -/* 0x60 */    0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, -/* 0x68 */    0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, _UNK, -/* 0x70 */    0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, -/* 0x78 */    0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, -/* 0x80 */    0x2b, 0x2c, 0x2d, 0x2e, 0x70, 0x71, 0x2f, 0x30, -/* 0x88 */    0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x72, -/* 0x90 */    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x73, 0x74, -/* 0x98 */    0x75, 0x76, _UNK, _UNK, 0x77, 0x78, 0x79, 0x7A, -/* 0xA0 */    0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x60, 0x61, -/* 0xA8 */    0x62, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xB0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xB8 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xC0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xC8 */    _UNK, _UNK, _UNK, _UNK, 0x44, _UNK, _UNK, _UNK, -/* 0xD0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xD8 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xE0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xE8 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xF0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xF8 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x45, -}; - -/* - * This table is indexed by the second opcode of the extended opcode - * pair. It returns an index into the opcode table (AcpiGbl_AmlOpInfo) - */ -static const UINT8 AcpiGbl_LongOpIndex[NUM_EXTENDED_OPCODE] = -{ -/*              0     1     2     3     4     5     6     7  */ -/*              8     9     A     B     C     D     E     F  */ -/* 0x00 */    _UNK, 0x46, 0x47, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x08 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x10 */    _UNK, _UNK, 0x48, 0x49, _UNK, _UNK, _UNK, _UNK, -/* 0x18 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x7B, -/* 0x20 */    0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, -/* 0x28 */    0x52, 0x53, 0x54, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x30 */    0x55, 0x56, 0x57, 0x7e, _UNK, _UNK, _UNK, _UNK, -/* 0x38 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x40 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x48 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x50 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x58 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x60 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x68 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x70 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x78 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x80 */    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, -/* 0x88 */    0x7C, -}; - - -/******************************************************************************* - * - * FUNCTION:    AcpiPsGetOpcodeInfo - * - * PARAMETERS:  Opcode              - The AML opcode - * - * RETURN:      A pointer to the info about the opcode. - * - * DESCRIPTION: Find AML opcode description based on the opcode. - *              NOTE: This procedure must ALWAYS return a valid pointer! - * - ******************************************************************************/ - -const ACPI_OPCODE_INFO * -AcpiPsGetOpcodeInfo ( -    UINT16                  Opcode) -{ -    ACPI_FUNCTION_NAME (PsGetOpcodeInfo); - - -    /* -     * Detect normal 8-bit opcode or extended 16-bit opcode -     */ -    if (!(Opcode & 0xFF00)) -    { -        /* Simple (8-bit) opcode: 0-255, can't index beyond table  */ - -        return (&AcpiGbl_AmlOpInfo [AcpiGbl_ShortOpIndex [(UINT8) Opcode]]); -    } - -    if (((Opcode & 0xFF00) == AML_EXTENDED_OPCODE) && -        (((UINT8) Opcode) <= MAX_EXTENDED_OPCODE)) -    { -        /* Valid extended (16-bit) opcode */ - -        return (&AcpiGbl_AmlOpInfo [AcpiGbl_LongOpIndex [(UINT8) Opcode]]); -    } - -    /* Unknown AML opcode */ - -    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, -        "Unknown AML opcode [%4.4X]\n", Opcode)); - -    return (&AcpiGbl_AmlOpInfo [_UNK]); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiPsGetOpcodeName - * - * PARAMETERS:  Opcode              - The AML opcode - * - * RETURN:      A pointer to the name of the opcode (ASCII String) - *              Note: Never returns NULL. - * - * DESCRIPTION: Translate an opcode into a human-readable string - * - ******************************************************************************/ - -char * -AcpiPsGetOpcodeName ( -    UINT16                  Opcode) -{ -#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT) - -    const ACPI_OPCODE_INFO  *Op; - - -    Op = AcpiPsGetOpcodeInfo (Opcode); - -    /* Always guaranteed to return a valid pointer */ - -    return (Op->Name); - -#else -    return ("OpcodeName unavailable"); - -#endif -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiPsGetArgumentCount - * - * PARAMETERS:  OpType              - Type associated with the AML opcode - * - * RETURN:      Argument count - * - * DESCRIPTION: Obtain the number of expected arguments for an AML opcode - * - ******************************************************************************/ - -UINT8 -AcpiPsGetArgumentCount ( -    UINT32                  OpType) -{ - -    if (OpType <= AML_TYPE_EXEC_6A_0T_1R) -    { -        return (AcpiGbl_ArgumentCount[OpType]); -    } - -    return (0); -} diff --git a/source/components/parser/psopinfo.c b/source/components/parser/psopinfo.c new file mode 100644 index 000000000000..18f7a5103ef0 --- /dev/null +++ b/source/components/parser/psopinfo.c @@ -0,0 +1,238 @@ +/****************************************************************************** + * + * Module Name: psopinfo - AML opcode information functions and dispatch tables + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2012, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions, and the following disclaimer, + *    without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + *    substantially similar to the "NO WARRANTY" disclaimer below + *    ("Disclaimer") and any redistribution must be conditioned upon + *    including a substantially similar Disclaimer requirement for further + *    binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + *    of any contributors may be used to endorse or promote products derived + *    from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + */ + + +#include "acpi.h" +#include "accommon.h" +#include "acparser.h" +#include "acopcode.h" +#include "amlcode.h" + + +#define _COMPONENT          ACPI_PARSER +        ACPI_MODULE_NAME    ("psopinfo") + + +extern const UINT8      AcpiGbl_ShortOpIndex[]; +extern const UINT8      AcpiGbl_LongOpIndex[]; + +static const UINT8      AcpiGbl_ArgumentCount[] = {0,1,1,1,1,2,2,2,2,3,3,6}; + + +/******************************************************************************* + * + * FUNCTION:    AcpiPsGetOpcodeInfo + * + * PARAMETERS:  Opcode              - The AML opcode + * + * RETURN:      A pointer to the info about the opcode. + * + * DESCRIPTION: Find AML opcode description based on the opcode. + *              NOTE: This procedure must ALWAYS return a valid pointer! + * + ******************************************************************************/ + +const ACPI_OPCODE_INFO * +AcpiPsGetOpcodeInfo ( +    UINT16                  Opcode) +{ +    ACPI_FUNCTION_NAME (PsGetOpcodeInfo); + + +    /* +     * Detect normal 8-bit opcode or extended 16-bit opcode +     */ +    if (!(Opcode & 0xFF00)) +    { +        /* Simple (8-bit) opcode: 0-255, can't index beyond table  */ + +        return (&AcpiGbl_AmlOpInfo [AcpiGbl_ShortOpIndex [(UINT8) Opcode]]); +    } + +    if (((Opcode & 0xFF00) == AML_EXTENDED_OPCODE) && +        (((UINT8) Opcode) <= MAX_EXTENDED_OPCODE)) +    { +        /* Valid extended (16-bit) opcode */ + +        return (&AcpiGbl_AmlOpInfo [AcpiGbl_LongOpIndex [(UINT8) Opcode]]); +    } + +    /* Unknown AML opcode */ + +    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, +        "Unknown AML opcode [%4.4X]\n", Opcode)); + +    return (&AcpiGbl_AmlOpInfo [_UNK]); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiPsGetOpcodeName + * + * PARAMETERS:  Opcode              - The AML opcode + * + * RETURN:      A pointer to the name of the opcode (ASCII String) + *              Note: Never returns NULL. + * + * DESCRIPTION: Translate an opcode into a human-readable string + * + ******************************************************************************/ + +char * +AcpiPsGetOpcodeName ( +    UINT16                  Opcode) +{ +#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT) + +    const ACPI_OPCODE_INFO  *Op; + + +    Op = AcpiPsGetOpcodeInfo (Opcode); + +    /* Always guaranteed to return a valid pointer */ + +    return (Op->Name); + +#else +    return ("OpcodeName unavailable"); + +#endif +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiPsGetArgumentCount + * + * PARAMETERS:  OpType              - Type associated with the AML opcode + * + * RETURN:      Argument count + * + * DESCRIPTION: Obtain the number of expected arguments for an AML opcode + * + ******************************************************************************/ + +UINT8 +AcpiPsGetArgumentCount ( +    UINT32                  OpType) +{ + +    if (OpType <= AML_TYPE_EXEC_6A_0T_1R) +    { +        return (AcpiGbl_ArgumentCount[OpType]); +    } + +    return (0); +} + + +/* + * This table is directly indexed by the opcodes It returns + * an index into the opcode table (AcpiGbl_AmlOpInfo) + */ +const UINT8 AcpiGbl_ShortOpIndex[256] = +{ +/*              0     1     2     3     4     5     6     7  */ +/*              8     9     A     B     C     D     E     F  */ +/* 0x00 */    0x00, 0x01, _UNK, _UNK, _UNK, _UNK, 0x02, _UNK, +/* 0x08 */    0x03, _UNK, 0x04, 0x05, 0x06, 0x07, 0x6E, _UNK, +/* 0x10 */    0x08, 0x09, 0x0a, 0x6F, 0x0b, _UNK, _UNK, _UNK, +/* 0x18 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x20 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x28 */    _UNK, _UNK, _UNK, _UNK, _UNK, 0x63, _PFX, _PFX, +/* 0x30 */    0x67, 0x66, 0x68, 0x65, 0x69, 0x64, 0x6A, 0x7D, +/* 0x38 */    0x7F, 0x80, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x40 */    _UNK, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, +/* 0x48 */    _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, +/* 0x50 */    _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, +/* 0x58 */    _ASC, _ASC, _ASC, _UNK, _PFX, _UNK, _PFX, _ASC, +/* 0x60 */    0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, +/* 0x68 */    0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, _UNK, +/* 0x70 */    0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, +/* 0x78 */    0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, +/* 0x80 */    0x2b, 0x2c, 0x2d, 0x2e, 0x70, 0x71, 0x2f, 0x30, +/* 0x88 */    0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x72, +/* 0x90 */    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x73, 0x74, +/* 0x98 */    0x75, 0x76, _UNK, _UNK, 0x77, 0x78, 0x79, 0x7A, +/* 0xA0 */    0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x60, 0x61, +/* 0xA8 */    0x62, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0xB0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0xB8 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0xC0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0xC8 */    _UNK, _UNK, _UNK, _UNK, 0x44, _UNK, _UNK, _UNK, +/* 0xD0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0xD8 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0xE0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0xE8 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0xF0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0xF8 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x45, +}; + +/* + * This table is indexed by the second opcode of the extended opcode + * pair. It returns an index into the opcode table (AcpiGbl_AmlOpInfo) + */ +const UINT8 AcpiGbl_LongOpIndex[NUM_EXTENDED_OPCODE] = +{ +/*              0     1     2     3     4     5     6     7  */ +/*              8     9     A     B     C     D     E     F  */ +/* 0x00 */    _UNK, 0x46, 0x47, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x08 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x10 */    _UNK, _UNK, 0x48, 0x49, _UNK, _UNK, _UNK, _UNK, +/* 0x18 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x7B, +/* 0x20 */    0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, +/* 0x28 */    0x52, 0x53, 0x54, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x30 */    0x55, 0x56, 0x57, 0x7e, _UNK, _UNK, _UNK, _UNK, +/* 0x38 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x40 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x48 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x50 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x58 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x60 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x68 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x70 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x78 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, +/* 0x80 */    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, +/* 0x88 */    0x7C, +}; diff --git a/source/components/parser/psutils.c b/source/components/parser/psutils.c index c72173fba275..08c2fe22056e 100644 --- a/source/components/parser/psutils.c +++ b/source/components/parser/psutils.c @@ -238,17 +238,6 @@ AcpiPsIsLeadingChar (  /* - * Is "c" a namestring prefix character? - */ -BOOLEAN -AcpiPsIsPrefixChar ( -    UINT32                  c) -{ -    return ((BOOLEAN) (c == '\\' || c == '^')); -} - - -/*   * Get op's name (4-byte name segment) or 0 if unnamed   */  UINT32 diff --git a/source/components/resources/rsdump.c b/source/components/resources/rsdump.c index 8ac320c78151..94411ea8742b 100644 --- a/source/components/resources/rsdump.c +++ b/source/components/resources/rsdump.c @@ -119,315 +119,16 @@ AcpiRsDumpDescriptor (      ACPI_RSDUMP_INFO *Table); -#define ACPI_RSD_OFFSET(f)          (UINT8) ACPI_OFFSET (ACPI_RESOURCE_DATA,f) -#define ACPI_PRT_OFFSET(f)          (UINT8) ACPI_OFFSET (ACPI_PCI_ROUTING_TABLE,f) -#define ACPI_RSD_TABLE_SIZE(name)   (sizeof(name) / sizeof (ACPI_RSDUMP_INFO)) - - -/******************************************************************************* - * - * Resource Descriptor info tables - * - * Note: The first table entry must be a Title or Literal and must contain - * the table length (number of table entries) - * - ******************************************************************************/ - -ACPI_RSDUMP_INFO        AcpiRsDumpIrq[7] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpIrq),                "IRQ",                      NULL}, -    {ACPI_RSD_UINT8 ,   ACPI_RSD_OFFSET (Irq.DescriptorLength),             "Descriptor Length",        NULL}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Irq.Triggering),                   "Triggering",               AcpiGbl_HeDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Irq.Polarity),                     "Polarity",                 AcpiGbl_LlDecode}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Irq.Sharable),                     "Sharing",                  AcpiGbl_ShrDecode}, -    {ACPI_RSD_UINT8 ,   ACPI_RSD_OFFSET (Irq.InterruptCount),               "Interrupt Count",          NULL}, -    {ACPI_RSD_SHORTLIST,ACPI_RSD_OFFSET (Irq.Interrupts[0]),                "Interrupt List",           NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpDma[6] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpDma),                "DMA",                      NULL}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Dma.Type),                         "Speed",                    AcpiGbl_TypDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Dma.BusMaster),                    "Mastering",                AcpiGbl_BmDecode}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Dma.Transfer),                     "Transfer Type",            AcpiGbl_SizDecode}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Dma.ChannelCount),                 "Channel Count",            NULL}, -    {ACPI_RSD_SHORTLIST,ACPI_RSD_OFFSET (Dma.Channels[0]),                  "Channel List",             NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpStartDpf[4] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpStartDpf),           "Start-Dependent-Functions",NULL}, -    {ACPI_RSD_UINT8 ,   ACPI_RSD_OFFSET (StartDpf.DescriptorLength),        "Descriptor Length",        NULL}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (StartDpf.CompatibilityPriority),   "Compatibility Priority",   AcpiGbl_ConfigDecode}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (StartDpf.PerformanceRobustness),   "Performance/Robustness",   AcpiGbl_ConfigDecode} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpEndDpf[1] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpEndDpf),             "End-Dependent-Functions",  NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpIo[6] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpIo),                 "I/O",                      NULL}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Io.IoDecode),                      "Address Decoding",         AcpiGbl_IoDecode}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Io.Minimum),                       "Address Minimum",          NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Io.Maximum),                       "Address Maximum",          NULL}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Io.Alignment),                     "Alignment",                NULL}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Io.AddressLength),                 "Address Length",           NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpFixedIo[3] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpFixedIo),            "Fixed I/O",                NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (FixedIo.Address),                  "Address",                  NULL}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (FixedIo.AddressLength),            "Address Length",           NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpVendor[3] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpVendor),             "Vendor Specific",          NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Vendor.ByteLength),                "Length",                   NULL}, -    {ACPI_RSD_LONGLIST, ACPI_RSD_OFFSET (Vendor.ByteData[0]),               "Vendor Data",              NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpEndTag[1] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpEndTag),             "EndTag",                   NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpMemory24[6] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpMemory24),           "24-Bit Memory Range",      NULL}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Memory24.WriteProtect),            "Write Protect",            AcpiGbl_RwDecode}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Memory24.Minimum),                 "Address Minimum",          NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Memory24.Maximum),                 "Address Maximum",          NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Memory24.Alignment),               "Alignment",                NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Memory24.AddressLength),           "Address Length",           NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpMemory32[6] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpMemory32),           "32-Bit Memory Range",      NULL}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Memory32.WriteProtect),            "Write Protect",            AcpiGbl_RwDecode}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Memory32.Minimum),                 "Address Minimum",          NULL}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Memory32.Maximum),                 "Address Maximum",          NULL}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Memory32.Alignment),               "Alignment",                NULL}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Memory32.AddressLength),           "Address Length",           NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpFixedMemory32[4] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpFixedMemory32),      "32-Bit Fixed Memory Range",NULL}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (FixedMemory32.WriteProtect),       "Write Protect",            AcpiGbl_RwDecode}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (FixedMemory32.Address),            "Address",                  NULL}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (FixedMemory32.AddressLength),      "Address Length",           NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpAddress16[8] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress16),          "16-Bit WORD Address Space",NULL}, -    {ACPI_RSD_ADDRESS,  0,                                                  NULL,                       NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.Granularity),            "Granularity",              NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.Minimum),                "Address Minimum",          NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.Maximum),                "Address Maximum",          NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.TranslationOffset),      "Translation Offset",       NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.AddressLength),          "Address Length",           NULL}, -    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Address16.ResourceSource),         NULL,                       NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpAddress32[8] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress32),         "32-Bit DWORD Address Space", NULL}, -    {ACPI_RSD_ADDRESS,  0,                                                  NULL,                       NULL}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.Granularity),            "Granularity",              NULL}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.Minimum),                "Address Minimum",          NULL}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.Maximum),                "Address Maximum",          NULL}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.TranslationOffset),      "Translation Offset",       NULL}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.AddressLength),          "Address Length",           NULL}, -    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Address32.ResourceSource),         NULL,                       NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpAddress64[8] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress64),          "64-Bit QWORD Address Space", NULL}, -    {ACPI_RSD_ADDRESS,  0,                                                  NULL,                       NULL}, -    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.Granularity),            "Granularity",              NULL}, -    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.Minimum),                "Address Minimum",          NULL}, -    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.Maximum),                "Address Maximum",          NULL}, -    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.TranslationOffset),      "Translation Offset",       NULL}, -    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.AddressLength),          "Address Length",           NULL}, -    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Address64.ResourceSource),         NULL,                       NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpExtAddress64[8] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpExtAddress64),       "64-Bit Extended Address Space", NULL}, -    {ACPI_RSD_ADDRESS,  0,                                                  NULL,                       NULL}, -    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.Granularity),         "Granularity",              NULL}, -    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.Minimum),             "Address Minimum",          NULL}, -    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.Maximum),             "Address Maximum",          NULL}, -    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.TranslationOffset),   "Translation Offset",       NULL}, -    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.AddressLength),       "Address Length",           NULL}, -    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.TypeSpecific),        "Type-Specific Attribute",  NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpExtIrq[8] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpExtIrq),             "Extended IRQ",             NULL}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.ProducerConsumer),     "Type",                     AcpiGbl_ConsumeDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.Triggering),           "Triggering",               AcpiGbl_HeDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.Polarity),             "Polarity",                 AcpiGbl_LlDecode}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.Sharable),             "Sharing",                  AcpiGbl_ShrDecode}, -    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (ExtendedIrq.ResourceSource),       NULL,                       NULL}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (ExtendedIrq.InterruptCount),       "Interrupt Count",          NULL}, -    {ACPI_RSD_DWORDLIST,ACPI_RSD_OFFSET (ExtendedIrq.Interrupts[0]),        "Interrupt List",           NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpGenericReg[6] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpGenericReg),         "Generic Register",         NULL}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (GenericReg.SpaceId),               "Space ID",                 NULL}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (GenericReg.BitWidth),              "Bit Width",                NULL}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (GenericReg.BitOffset),             "Bit Offset",               NULL}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (GenericReg.AccessSize),            "Access Size",              NULL}, -    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (GenericReg.Address),               "Address",                  NULL} -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpGpio[16] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpGpio),               "GPIO",                     NULL}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Gpio.RevisionId),                  "RevisionId",               NULL}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Gpio.ConnectionType),              "ConnectionType",           AcpiGbl_CtDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Gpio.ProducerConsumer),            "ProducerConsumer",         AcpiGbl_ConsumeDecode}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Gpio.PinConfig),                   "PinConfig",                AcpiGbl_PpcDecode}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Gpio.Sharable),                    "Sharing",                  AcpiGbl_ShrDecode}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Gpio.IoRestriction),               "IoRestriction",            AcpiGbl_IorDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Gpio.Triggering),                  "Triggering",               AcpiGbl_HeDecode}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Gpio.Polarity),                    "Polarity",                 AcpiGbl_LlDecode}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Gpio.DriveStrength),               "DriveStrength",            NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Gpio.DebounceTimeout),             "DebounceTimeout",          NULL}, -    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Gpio.ResourceSource),              "ResourceSource",           NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Gpio.PinTableLength),              "PinTableLength",           NULL}, -    {ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET (Gpio.PinTable),                    "PinTable",                 NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Gpio.VendorLength),                "VendorLength",             NULL}, -    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (Gpio.VendorData),                 "VendorData",               NULL}, -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpFixedDma[4] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpFixedDma),           "FixedDma",                 NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (FixedDma.RequestLines),            "RequestLines",             NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (FixedDma.Channels),                "Channels",                 NULL}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (FixedDma.Width),                   "TransferWidth",            AcpiGbl_DtsDecode}, -}; - -#define ACPI_RS_DUMP_COMMON_SERIAL_BUS \ -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (CommonSerialBus.RevisionId),       "RevisionId",               NULL}, \ -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (CommonSerialBus.Type),             "Type",                     AcpiGbl_SbtDecode}, \ -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (CommonSerialBus.ProducerConsumer), "ProducerConsumer",         AcpiGbl_ConsumeDecode}, \ -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (CommonSerialBus.SlaveMode),        "SlaveMode",                AcpiGbl_SmDecode}, \ -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (CommonSerialBus.TypeRevisionId),   "TypeRevisionId",           NULL}, \ -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (CommonSerialBus.TypeDataLength),   "TypeDataLength",           NULL}, \ -    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (CommonSerialBus.ResourceSource),   "ResourceSource",           NULL}, \ -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (CommonSerialBus.VendorLength),     "VendorLength",             NULL}, \ -    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (CommonSerialBus.VendorData),      "VendorData",               NULL}, - -ACPI_RSDUMP_INFO        AcpiRsDumpCommonSerialBus[10] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpCommonSerialBus),    "Common Serial Bus",        NULL}, -    ACPI_RS_DUMP_COMMON_SERIAL_BUS -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpI2cSerialBus[13] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpI2cSerialBus),       "I2C Serial Bus",           NULL}, -    ACPI_RS_DUMP_COMMON_SERIAL_BUS -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (I2cSerialBus.AccessMode),          "AccessMode",               AcpiGbl_AmDecode}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (I2cSerialBus.ConnectionSpeed),     "ConnectionSpeed",          NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (I2cSerialBus.SlaveAddress),        "SlaveAddress",             NULL}, -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpSpiSerialBus[17] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpSpiSerialBus),       "Spi Serial Bus",           NULL}, -    ACPI_RS_DUMP_COMMON_SERIAL_BUS -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (SpiSerialBus.WireMode),            "WireMode",                 AcpiGbl_WmDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (SpiSerialBus.DevicePolarity),      "DevicePolarity",           AcpiGbl_DpDecode}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (SpiSerialBus.DataBitLength),       "DataBitLength",            NULL}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (SpiSerialBus.ClockPhase),          "ClockPhase",               AcpiGbl_CphDecode}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (SpiSerialBus.ClockPolarity),       "ClockPolarity",            AcpiGbl_CpoDecode}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (SpiSerialBus.DeviceSelection),     "DeviceSelection",          NULL}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (SpiSerialBus.ConnectionSpeed),     "ConnectionSpeed",          NULL}, -}; - -ACPI_RSDUMP_INFO        AcpiRsDumpUartSerialBus[19] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpUartSerialBus),       "Uart Serial Bus",         NULL}, -    ACPI_RS_DUMP_COMMON_SERIAL_BUS -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (UartSerialBus.FlowControl),         "FlowControl",             AcpiGbl_FcDecode}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (UartSerialBus.StopBits),            "StopBits",                AcpiGbl_SbDecode}, -    {ACPI_RSD_3BITFLAG, ACPI_RSD_OFFSET (UartSerialBus.DataBits),            "DataBits",                AcpiGbl_BpbDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (UartSerialBus.Endian),              "Endian",                  AcpiGbl_EdDecode}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (UartSerialBus.Parity),              "Parity",                  AcpiGbl_PtDecode}, -    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (UartSerialBus.LinesEnabled),        "LinesEnabled",            NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (UartSerialBus.RxFifoSize),          "RxFifoSize",              NULL}, -    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (UartSerialBus.TxFifoSize),          "TxFifoSize",              NULL}, -    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (UartSerialBus.DefaultBaudRate),     "ConnectionSpeed",         NULL}, -}; - -/* - * Tables used for common address descriptor flag fields - */ -static ACPI_RSDUMP_INFO AcpiRsDumpGeneralFlags[5] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpGeneralFlags),       NULL,                       NULL}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.ProducerConsumer),         "Consumer/Producer",        AcpiGbl_ConsumeDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Decode),                   "Address Decode",           AcpiGbl_DecDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.MinAddressFixed),          "Min Relocatability",       AcpiGbl_MinDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.MaxAddressFixed),          "Max Relocatability",       AcpiGbl_MaxDecode} -}; - -static ACPI_RSDUMP_INFO AcpiRsDumpMemoryFlags[5] = -{ -    {ACPI_RSD_LITERAL,  ACPI_RSD_TABLE_SIZE (AcpiRsDumpMemoryFlags),        "Resource Type",            (void *) "Memory Range"}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.WriteProtect),    "Write Protect",            AcpiGbl_RwDecode}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.Caching),         "Caching",                  AcpiGbl_MemDecode}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.RangeType),       "Range Type",               AcpiGbl_MtpDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.Translation),     "Translation",              AcpiGbl_TtpDecode} -}; - -static ACPI_RSDUMP_INFO AcpiRsDumpIoFlags[4] = -{ -    {ACPI_RSD_LITERAL,  ACPI_RSD_TABLE_SIZE (AcpiRsDumpIoFlags),            "Resource Type",            (void *) "I/O Range"}, -    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Address.Info.Io.RangeType),        "Range Type",               AcpiGbl_RngDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Io.Translation),      "Translation",              AcpiGbl_TtpDecode}, -    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Io.TranslationType),  "Translation Type",         AcpiGbl_TrsDecode} -}; - - -/* - * Table used to dump _PRT contents - */ -static ACPI_RSDUMP_INFO   AcpiRsDumpPrt[5] = -{ -    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPrt),                NULL,                       NULL}, -    {ACPI_RSD_UINT64,   ACPI_PRT_OFFSET (Address),                          "Address",                  NULL}, -    {ACPI_RSD_UINT32,   ACPI_PRT_OFFSET (Pin),                              "Pin",                      NULL}, -    {ACPI_RSD_STRING,   ACPI_PRT_OFFSET (Source[0]),                        "Source",                   NULL}, -    {ACPI_RSD_UINT32,   ACPI_PRT_OFFSET (SourceIndex),                      "Source Index",             NULL} -}; - -  /*******************************************************************************   *   * FUNCTION:    AcpiRsDumpDescriptor   * - * PARAMETERS:  Resource + * PARAMETERS:  Resource            - Buffer containing the resource + *              Table               - Table entry to decode the resource   *   * RETURN:      None   * - * DESCRIPTION: + * DESCRIPTION: Dump a resource descriptor based on a dump table entry.   *   ******************************************************************************/ @@ -712,7 +413,9 @@ AcpiRsDumpResourceList (      ACPI_FUNCTION_ENTRY (); -    if (!(AcpiDbgLevel & ACPI_LV_RESOURCES) || !( _COMPONENT & AcpiDbgLayer)) +    /* Check if debug output enabled */ + +    if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_RESOURCES, _COMPONENT))      {          return;      } @@ -781,7 +484,9 @@ AcpiRsDumpIrqList (      ACPI_FUNCTION_ENTRY (); -    if (!(AcpiDbgLevel & ACPI_LV_RESOURCES) || !( _COMPONENT & AcpiDbgLayer)) +    /* Check if debug output enabled */ + +    if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_RESOURCES, _COMPONENT))      {          return;      } diff --git a/source/components/resources/rsdumpinfo.c b/source/components/resources/rsdumpinfo.c new file mode 100644 index 000000000000..467a2f7d1652 --- /dev/null +++ b/source/components/resources/rsdumpinfo.c @@ -0,0 +1,357 @@ +/******************************************************************************* + * + * Module Name: rsdumpinfo - Tables used to display resource descriptors. + * + ******************************************************************************/ + +/* + * Copyright (C) 2000 - 2012, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions, and the following disclaimer, + *    without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + *    substantially similar to the "NO WARRANTY" disclaimer below + *    ("Disclaimer") and any redistribution must be conditioned upon + *    including a substantially similar Disclaimer requirement for further + *    binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + *    of any contributors may be used to endorse or promote products derived + *    from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + */ + + +#define __RSDUMPINFO_C__ + +#include "acpi.h" +#include "accommon.h" +#include "acresrc.h" + +#define _COMPONENT          ACPI_RESOURCES +        ACPI_MODULE_NAME    ("rsdumpinfo") + + +#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) + + +#define ACPI_RSD_OFFSET(f)          (UINT8) ACPI_OFFSET (ACPI_RESOURCE_DATA,f) +#define ACPI_PRT_OFFSET(f)          (UINT8) ACPI_OFFSET (ACPI_PCI_ROUTING_TABLE,f) +#define ACPI_RSD_TABLE_SIZE(name)   (sizeof(name) / sizeof (ACPI_RSDUMP_INFO)) + + +/******************************************************************************* + * + * Resource Descriptor info tables + * + * Note: The first table entry must be a Title or Literal and must contain + * the table length (number of table entries) + * + ******************************************************************************/ + +ACPI_RSDUMP_INFO        AcpiRsDumpIrq[7] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpIrq),                "IRQ",                      NULL}, +    {ACPI_RSD_UINT8 ,   ACPI_RSD_OFFSET (Irq.DescriptorLength),             "Descriptor Length",        NULL}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Irq.Triggering),                   "Triggering",               AcpiGbl_HeDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Irq.Polarity),                     "Polarity",                 AcpiGbl_LlDecode}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Irq.Sharable),                     "Sharing",                  AcpiGbl_ShrDecode}, +    {ACPI_RSD_UINT8 ,   ACPI_RSD_OFFSET (Irq.InterruptCount),               "Interrupt Count",          NULL}, +    {ACPI_RSD_SHORTLIST,ACPI_RSD_OFFSET (Irq.Interrupts[0]),                "Interrupt List",           NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpDma[6] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpDma),                "DMA",                      NULL}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Dma.Type),                         "Speed",                    AcpiGbl_TypDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Dma.BusMaster),                    "Mastering",                AcpiGbl_BmDecode}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Dma.Transfer),                     "Transfer Type",            AcpiGbl_SizDecode}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Dma.ChannelCount),                 "Channel Count",            NULL}, +    {ACPI_RSD_SHORTLIST,ACPI_RSD_OFFSET (Dma.Channels[0]),                  "Channel List",             NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpStartDpf[4] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpStartDpf),           "Start-Dependent-Functions",NULL}, +    {ACPI_RSD_UINT8 ,   ACPI_RSD_OFFSET (StartDpf.DescriptorLength),        "Descriptor Length",        NULL}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (StartDpf.CompatibilityPriority),   "Compatibility Priority",   AcpiGbl_ConfigDecode}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (StartDpf.PerformanceRobustness),   "Performance/Robustness",   AcpiGbl_ConfigDecode} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpEndDpf[1] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpEndDpf),             "End-Dependent-Functions",  NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpIo[6] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpIo),                 "I/O",                      NULL}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Io.IoDecode),                      "Address Decoding",         AcpiGbl_IoDecode}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Io.Minimum),                       "Address Minimum",          NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Io.Maximum),                       "Address Maximum",          NULL}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Io.Alignment),                     "Alignment",                NULL}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Io.AddressLength),                 "Address Length",           NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpFixedIo[3] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpFixedIo),            "Fixed I/O",                NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (FixedIo.Address),                  "Address",                  NULL}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (FixedIo.AddressLength),            "Address Length",           NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpVendor[3] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpVendor),             "Vendor Specific",          NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Vendor.ByteLength),                "Length",                   NULL}, +    {ACPI_RSD_LONGLIST, ACPI_RSD_OFFSET (Vendor.ByteData[0]),               "Vendor Data",              NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpEndTag[1] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpEndTag),             "EndTag",                   NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpMemory24[6] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpMemory24),           "24-Bit Memory Range",      NULL}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Memory24.WriteProtect),            "Write Protect",            AcpiGbl_RwDecode}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Memory24.Minimum),                 "Address Minimum",          NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Memory24.Maximum),                 "Address Maximum",          NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Memory24.Alignment),               "Alignment",                NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Memory24.AddressLength),           "Address Length",           NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpMemory32[6] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpMemory32),           "32-Bit Memory Range",      NULL}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Memory32.WriteProtect),            "Write Protect",            AcpiGbl_RwDecode}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Memory32.Minimum),                 "Address Minimum",          NULL}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Memory32.Maximum),                 "Address Maximum",          NULL}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Memory32.Alignment),               "Alignment",                NULL}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Memory32.AddressLength),           "Address Length",           NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpFixedMemory32[4] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpFixedMemory32),      "32-Bit Fixed Memory Range",NULL}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (FixedMemory32.WriteProtect),       "Write Protect",            AcpiGbl_RwDecode}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (FixedMemory32.Address),            "Address",                  NULL}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (FixedMemory32.AddressLength),      "Address Length",           NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpAddress16[8] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress16),          "16-Bit WORD Address Space",NULL}, +    {ACPI_RSD_ADDRESS,  0,                                                  NULL,                       NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.Granularity),            "Granularity",              NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.Minimum),                "Address Minimum",          NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.Maximum),                "Address Maximum",          NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.TranslationOffset),      "Translation Offset",       NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.AddressLength),          "Address Length",           NULL}, +    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Address16.ResourceSource),         NULL,                       NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpAddress32[8] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress32),         "32-Bit DWORD Address Space", NULL}, +    {ACPI_RSD_ADDRESS,  0,                                                  NULL,                       NULL}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.Granularity),            "Granularity",              NULL}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.Minimum),                "Address Minimum",          NULL}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.Maximum),                "Address Maximum",          NULL}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.TranslationOffset),      "Translation Offset",       NULL}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.AddressLength),          "Address Length",           NULL}, +    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Address32.ResourceSource),         NULL,                       NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpAddress64[8] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress64),          "64-Bit QWORD Address Space", NULL}, +    {ACPI_RSD_ADDRESS,  0,                                                  NULL,                       NULL}, +    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.Granularity),            "Granularity",              NULL}, +    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.Minimum),                "Address Minimum",          NULL}, +    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.Maximum),                "Address Maximum",          NULL}, +    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.TranslationOffset),      "Translation Offset",       NULL}, +    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.AddressLength),          "Address Length",           NULL}, +    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Address64.ResourceSource),         NULL,                       NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpExtAddress64[8] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpExtAddress64),       "64-Bit Extended Address Space", NULL}, +    {ACPI_RSD_ADDRESS,  0,                                                  NULL,                       NULL}, +    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.Granularity),         "Granularity",              NULL}, +    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.Minimum),             "Address Minimum",          NULL}, +    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.Maximum),             "Address Maximum",          NULL}, +    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.TranslationOffset),   "Translation Offset",       NULL}, +    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.AddressLength),       "Address Length",           NULL}, +    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.TypeSpecific),        "Type-Specific Attribute",  NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpExtIrq[8] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpExtIrq),             "Extended IRQ",             NULL}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.ProducerConsumer),     "Type",                     AcpiGbl_ConsumeDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.Triggering),           "Triggering",               AcpiGbl_HeDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.Polarity),             "Polarity",                 AcpiGbl_LlDecode}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.Sharable),             "Sharing",                  AcpiGbl_ShrDecode}, +    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (ExtendedIrq.ResourceSource),       NULL,                       NULL}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (ExtendedIrq.InterruptCount),       "Interrupt Count",          NULL}, +    {ACPI_RSD_DWORDLIST,ACPI_RSD_OFFSET (ExtendedIrq.Interrupts[0]),        "Interrupt List",           NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpGenericReg[6] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpGenericReg),         "Generic Register",         NULL}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (GenericReg.SpaceId),               "Space ID",                 NULL}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (GenericReg.BitWidth),              "Bit Width",                NULL}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (GenericReg.BitOffset),             "Bit Offset",               NULL}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (GenericReg.AccessSize),            "Access Size",              NULL}, +    {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (GenericReg.Address),               "Address",                  NULL} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpGpio[16] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpGpio),               "GPIO",                     NULL}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Gpio.RevisionId),                  "RevisionId",               NULL}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Gpio.ConnectionType),              "ConnectionType",           AcpiGbl_CtDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Gpio.ProducerConsumer),            "ProducerConsumer",         AcpiGbl_ConsumeDecode}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Gpio.PinConfig),                   "PinConfig",                AcpiGbl_PpcDecode}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Gpio.Sharable),                    "Sharing",                  AcpiGbl_ShrDecode}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Gpio.IoRestriction),               "IoRestriction",            AcpiGbl_IorDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Gpio.Triggering),                  "Triggering",               AcpiGbl_HeDecode}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Gpio.Polarity),                    "Polarity",                 AcpiGbl_LlDecode}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Gpio.DriveStrength),               "DriveStrength",            NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Gpio.DebounceTimeout),             "DebounceTimeout",          NULL}, +    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Gpio.ResourceSource),              "ResourceSource",           NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Gpio.PinTableLength),              "PinTableLength",           NULL}, +    {ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET (Gpio.PinTable),                    "PinTable",                 NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Gpio.VendorLength),                "VendorLength",             NULL}, +    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (Gpio.VendorData),                 "VendorData",               NULL}, +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpFixedDma[4] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpFixedDma),           "FixedDma",                 NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (FixedDma.RequestLines),            "RequestLines",             NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (FixedDma.Channels),                "Channels",                 NULL}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (FixedDma.Width),                   "TransferWidth",            AcpiGbl_DtsDecode}, +}; + +#define ACPI_RS_DUMP_COMMON_SERIAL_BUS \ +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (CommonSerialBus.RevisionId),       "RevisionId",               NULL}, \ +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (CommonSerialBus.Type),             "Type",                     AcpiGbl_SbtDecode}, \ +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (CommonSerialBus.ProducerConsumer), "ProducerConsumer",         AcpiGbl_ConsumeDecode}, \ +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (CommonSerialBus.SlaveMode),        "SlaveMode",                AcpiGbl_SmDecode}, \ +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (CommonSerialBus.TypeRevisionId),   "TypeRevisionId",           NULL}, \ +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (CommonSerialBus.TypeDataLength),   "TypeDataLength",           NULL}, \ +    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (CommonSerialBus.ResourceSource),   "ResourceSource",           NULL}, \ +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (CommonSerialBus.VendorLength),     "VendorLength",             NULL}, \ +    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (CommonSerialBus.VendorData),      "VendorData",               NULL}, + +ACPI_RSDUMP_INFO        AcpiRsDumpCommonSerialBus[10] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpCommonSerialBus),    "Common Serial Bus",        NULL}, +    ACPI_RS_DUMP_COMMON_SERIAL_BUS +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpI2cSerialBus[13] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpI2cSerialBus),       "I2C Serial Bus",           NULL}, +    ACPI_RS_DUMP_COMMON_SERIAL_BUS +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (I2cSerialBus.AccessMode),          "AccessMode",               AcpiGbl_AmDecode}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (I2cSerialBus.ConnectionSpeed),     "ConnectionSpeed",          NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (I2cSerialBus.SlaveAddress),        "SlaveAddress",             NULL}, +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpSpiSerialBus[17] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpSpiSerialBus),       "Spi Serial Bus",           NULL}, +    ACPI_RS_DUMP_COMMON_SERIAL_BUS +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (SpiSerialBus.WireMode),            "WireMode",                 AcpiGbl_WmDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (SpiSerialBus.DevicePolarity),      "DevicePolarity",           AcpiGbl_DpDecode}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (SpiSerialBus.DataBitLength),       "DataBitLength",            NULL}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (SpiSerialBus.ClockPhase),          "ClockPhase",               AcpiGbl_CphDecode}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (SpiSerialBus.ClockPolarity),       "ClockPolarity",            AcpiGbl_CpoDecode}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (SpiSerialBus.DeviceSelection),     "DeviceSelection",          NULL}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (SpiSerialBus.ConnectionSpeed),     "ConnectionSpeed",          NULL}, +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpUartSerialBus[19] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpUartSerialBus),       "Uart Serial Bus",         NULL}, +    ACPI_RS_DUMP_COMMON_SERIAL_BUS +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (UartSerialBus.FlowControl),         "FlowControl",             AcpiGbl_FcDecode}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (UartSerialBus.StopBits),            "StopBits",                AcpiGbl_SbDecode}, +    {ACPI_RSD_3BITFLAG, ACPI_RSD_OFFSET (UartSerialBus.DataBits),            "DataBits",                AcpiGbl_BpbDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (UartSerialBus.Endian),              "Endian",                  AcpiGbl_EdDecode}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (UartSerialBus.Parity),              "Parity",                  AcpiGbl_PtDecode}, +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (UartSerialBus.LinesEnabled),        "LinesEnabled",            NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (UartSerialBus.RxFifoSize),          "RxFifoSize",              NULL}, +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (UartSerialBus.TxFifoSize),          "TxFifoSize",              NULL}, +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (UartSerialBus.DefaultBaudRate),     "ConnectionSpeed",         NULL}, +}; + +/* + * Tables used for common address descriptor flag fields + */ +ACPI_RSDUMP_INFO        AcpiRsDumpGeneralFlags[5] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpGeneralFlags),       NULL,                       NULL}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.ProducerConsumer),         "Consumer/Producer",        AcpiGbl_ConsumeDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Decode),                   "Address Decode",           AcpiGbl_DecDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.MinAddressFixed),          "Min Relocatability",       AcpiGbl_MinDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.MaxAddressFixed),          "Max Relocatability",       AcpiGbl_MaxDecode} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpMemoryFlags[5] = +{ +    {ACPI_RSD_LITERAL,  ACPI_RSD_TABLE_SIZE (AcpiRsDumpMemoryFlags),        "Resource Type",            (void *) "Memory Range"}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.WriteProtect),    "Write Protect",            AcpiGbl_RwDecode}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.Caching),         "Caching",                  AcpiGbl_MemDecode}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.RangeType),       "Range Type",               AcpiGbl_MtpDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.Translation),     "Translation",              AcpiGbl_TtpDecode} +}; + +ACPI_RSDUMP_INFO        AcpiRsDumpIoFlags[4] = +{ +    {ACPI_RSD_LITERAL,  ACPI_RSD_TABLE_SIZE (AcpiRsDumpIoFlags),            "Resource Type",            (void *) "I/O Range"}, +    {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Address.Info.Io.RangeType),        "Range Type",               AcpiGbl_RngDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Io.Translation),      "Translation",              AcpiGbl_TtpDecode}, +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Io.TranslationType),  "Translation Type",         AcpiGbl_TrsDecode} +}; + + +/* + * Table used to dump _PRT contents + */ +ACPI_RSDUMP_INFO        AcpiRsDumpPrt[5] = +{ +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPrt),                NULL,                       NULL}, +    {ACPI_RSD_UINT64,   ACPI_PRT_OFFSET (Address),                          "Address",                  NULL}, +    {ACPI_RSD_UINT32,   ACPI_PRT_OFFSET (Pin),                              "Pin",                      NULL}, +    {ACPI_RSD_STRING,   ACPI_PRT_OFFSET (Source[0]),                        "Source",                   NULL}, +    {ACPI_RSD_UINT32,   ACPI_PRT_OFFSET (SourceIndex),                      "Source Index",             NULL} +}; + +#endif diff --git a/source/components/resources/rsirq.c b/source/components/resources/rsirq.c index c2a88ee89a14..5c745503e2f3 100644 --- a/source/components/resources/rsirq.c +++ b/source/components/resources/rsirq.c @@ -57,7 +57,7 @@   *   ******************************************************************************/ -ACPI_RSCONVERT_INFO     AcpiRsGetIrq[8] = +ACPI_RSCONVERT_INFO     AcpiRsGetIrq[9] =  {      {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_IRQ,                          ACPI_RS_SIZE (ACPI_RESOURCE_IRQ), @@ -85,7 +85,7 @@ ACPI_RSCONVERT_INFO     AcpiRsGetIrq[8] =      {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_AML_LENGTH, 0, 3}, -    /* Get flags: Triggering[0], Polarity[3], Sharing[4] */ +    /* Get flags: Triggering[0], Polarity[3], Sharing[4], Wake[5] */      {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Triggering),                          AML_OFFSET (Irq.Flags), @@ -97,7 +97,11 @@ ACPI_RSCONVERT_INFO     AcpiRsGetIrq[8] =      {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Sharable),                          AML_OFFSET (Irq.Flags), -                        4} +                        4}, + +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.WakeCapable), +                        AML_OFFSET (Irq.Flags), +                        5}  }; @@ -107,7 +111,7 @@ ACPI_RSCONVERT_INFO     AcpiRsGetIrq[8] =   *   ******************************************************************************/ -ACPI_RSCONVERT_INFO     AcpiRsSetIrq[13] = +ACPI_RSCONVERT_INFO     AcpiRsSetIrq[14] =  {      /* Start with a default descriptor of length 3 */ @@ -121,7 +125,7 @@ ACPI_RSCONVERT_INFO     AcpiRsSetIrq[13] =                          AML_OFFSET (Irq.IrqMask),                          ACPI_RS_OFFSET (Data.Irq.InterruptCount)}, -    /* Set the flags byte */ +    /* Set flags: Triggering[0], Polarity[3], Sharing[4], Wake[5] */      {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Triggering),                          AML_OFFSET (Irq.Flags), @@ -135,6 +139,10 @@ ACPI_RSCONVERT_INFO     AcpiRsSetIrq[13] =                          AML_OFFSET (Irq.Flags),                          4}, +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.WakeCapable), +                        AML_OFFSET (Irq.Flags), +                        5}, +      /*       * All done if the output descriptor length is required to be 3       * (i.e., optimization to 2 bytes cannot be attempted) @@ -189,7 +197,7 @@ ACPI_RSCONVERT_INFO     AcpiRsSetIrq[13] =   *   ******************************************************************************/ -ACPI_RSCONVERT_INFO     AcpiRsConvertExtIrq[9] = +ACPI_RSCONVERT_INFO     AcpiRsConvertExtIrq[10] =  {      {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_EXTENDED_IRQ,                          ACPI_RS_SIZE (ACPI_RESOURCE_EXTENDED_IRQ), @@ -199,8 +207,10 @@ ACPI_RSCONVERT_INFO     AcpiRsConvertExtIrq[9] =                          sizeof (AML_RESOURCE_EXTENDED_IRQ),                          0}, -    /* Flag bits */ - +    /* +     * Flags: Producer/Consumer[0], Triggering[1], Polarity[2], +     *        Sharing[3], Wake[4] +     */      {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.ProducerConsumer),                          AML_OFFSET (ExtendedIrq.Flags),                          0}, @@ -217,6 +227,10 @@ ACPI_RSCONVERT_INFO     AcpiRsConvertExtIrq[9] =                          AML_OFFSET (ExtendedIrq.Flags),                          3}, +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.WakeCapable), +                        AML_OFFSET (ExtendedIrq.Flags), +                        4}, +      /* IRQ Table length (Byte4) */      {ACPI_RSC_COUNT,    ACPI_RS_OFFSET (Data.ExtendedIrq.InterruptCount), @@ -296,7 +310,6 @@ ACPI_RSCONVERT_INFO     AcpiRsConvertFixedDma[4] =       * RequestLines       * Channels       */ -      {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.FixedDma.RequestLines),                          AML_OFFSET (FixedDma.RequestLines),                          2}, @@ -304,5 +317,4 @@ ACPI_RSCONVERT_INFO     AcpiRsConvertFixedDma[4] =      {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.FixedDma.Width),                          AML_OFFSET (FixedDma.Width),                          1}, -  }; diff --git a/source/components/resources/rslist.c b/source/components/resources/rslist.c index a4f1daee1d3b..7de7f446915e 100644 --- a/source/components/resources/rslist.c +++ b/source/components/resources/rslist.c @@ -72,7 +72,7 @@ AcpiRsConvertAmlToResources (      UINT32                  Length,      UINT32                  Offset,      UINT8                   ResourceIndex, -    void                    *Context) +    void                    **Context)  {      ACPI_RESOURCE           **ResourcePtr = ACPI_CAST_INDIRECT_PTR (                                  ACPI_RESOURCE, Context); diff --git a/source/components/resources/rsserial.c b/source/components/resources/rsserial.c index 3a7784e96c8c..829d8b69627b 100644 --- a/source/components/resources/rsserial.c +++ b/source/components/resources/rsserial.c @@ -57,7 +57,7 @@   *   ******************************************************************************/ -ACPI_RSCONVERT_INFO     AcpiRsConvertGpio[17] = +ACPI_RSCONVERT_INFO     AcpiRsConvertGpio[18] =  {      {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_GPIO,                          ACPI_RS_SIZE (ACPI_RESOURCE_GPIO), @@ -80,10 +80,14 @@ ACPI_RSCONVERT_INFO     AcpiRsConvertGpio[17] =                          AML_OFFSET (Gpio.Flags),                          0}, -    {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Gpio.Sharable), +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Gpio.Sharable),                          AML_OFFSET (Gpio.IntFlags),                          3}, +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Gpio.WakeCapable), +                        AML_OFFSET (Gpio.IntFlags), +                        4}, +      {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Gpio.IoRestriction),                          AML_OFFSET (Gpio.IntFlags),                          0}, diff --git a/source/components/resources/rsutils.c b/source/components/resources/rsutils.c index aeac5e70b0bd..bcb35b4a3388 100644 --- a/source/components/resources/rsutils.c +++ b/source/components/resources/rsutils.c @@ -746,7 +746,8 @@ AcpiRsGetMethodData (      /* Execute the method, no parameters */ -    Status = AcpiUtEvaluateObject (Handle, Path, ACPI_BTYPE_BUFFER, &ObjDesc); +    Status = AcpiUtEvaluateObject (ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Handle), +        Path, ACPI_BTYPE_BUFFER, &ObjDesc);      if (ACPI_FAILURE (Status))      {          return_ACPI_STATUS (Status); diff --git a/source/components/resources/rsxface.c b/source/components/resources/rsxface.c index 8ff94db1ba00..50ce33855e71 100644 --- a/source/components/resources/rsxface.c +++ b/source/components/resources/rsxface.c @@ -474,7 +474,7 @@ ACPI_EXPORT_SYMBOL (AcpiResourceToAddress64)   *   * RETURN:      Status   * - * DESCRIPTION: Walk a resource template for the specified evice to find a + * DESCRIPTION: Walk a resource template for the specified device to find a   *              vendor-defined resource that matches the supplied UUID and   *              UUID subtype. Returns a ACPI_RESOURCE of type Vendor.   * @@ -586,63 +586,45 @@ AcpiRsMatchVendorResource (  /*******************************************************************************   * - * FUNCTION:    AcpiWalkResources + * FUNCTION:    AcpiWalkResourceBuffer   * - * PARAMETERS:  DeviceHandle    - Handle to the device object for the - *                                device we are querying - *              Name            - Method name of the resources we want. - *                                (METHOD_NAME__CRS, METHOD_NAME__PRS, or - *                                METHOD_NAME__AEI) + * PARAMETERS:  Buffer          - Formatted buffer returned by one of the + *                                various Get*Resource functions   *              UserFunction    - Called for each resource   *              Context         - Passed to UserFunction   *   * RETURN:      Status   * - * DESCRIPTION: Retrieves the current or possible resource list for the - *              specified device. The UserFunction is called once for - *              each resource in the list. + * DESCRIPTION: Walks the input resource template. The UserFunction is called + *              once for each resource in the list.   *   ******************************************************************************/  ACPI_STATUS -AcpiWalkResources ( -    ACPI_HANDLE                 DeviceHandle, -    char                        *Name, +AcpiWalkResourceBuffer ( +    ACPI_BUFFER                 *Buffer,      ACPI_WALK_RESOURCE_CALLBACK UserFunction,      void                        *Context)  { -    ACPI_STATUS                 Status; -    ACPI_BUFFER                 Buffer; +    ACPI_STATUS                 Status = AE_OK;      ACPI_RESOURCE               *Resource;      ACPI_RESOURCE               *ResourceEnd; -    ACPI_FUNCTION_TRACE (AcpiWalkResources); +    ACPI_FUNCTION_TRACE (AcpiWalkResourceBuffer);      /* Parameter validation */ -    if (!DeviceHandle || !UserFunction || !Name || -        (!ACPI_COMPARE_NAME (Name, METHOD_NAME__CRS) && -         !ACPI_COMPARE_NAME (Name, METHOD_NAME__PRS) && -         !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI))) +    if (!Buffer || !Buffer->Pointer || !UserFunction)      {          return_ACPI_STATUS (AE_BAD_PARAMETER);      } -    /* Get the _CRS/_PRS/_AEI resource list */ - -    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; -    Status = AcpiRsGetMethodData (DeviceHandle, Name, &Buffer); -    if (ACPI_FAILURE (Status)) -    { -        return_ACPI_STATUS (Status); -    } - -    /* Buffer now contains the resource list */ +    /* Buffer contains the resource list and length */ -    Resource = ACPI_CAST_PTR (ACPI_RESOURCE, Buffer.Pointer); -    ResourceEnd = ACPI_ADD_PTR (ACPI_RESOURCE, Buffer.Pointer, Buffer.Length); +    Resource = ACPI_CAST_PTR (ACPI_RESOURCE, Buffer->Pointer); +    ResourceEnd = ACPI_ADD_PTR (ACPI_RESOURCE, Buffer->Pointer, Buffer->Length);      /* Walk the resource list until the EndTag is found (or buffer end) */ @@ -682,6 +664,68 @@ AcpiWalkResources (          Resource = ACPI_NEXT_RESOURCE (Resource);      } +    return_ACPI_STATUS (Status); +} + +ACPI_EXPORT_SYMBOL (AcpiWalkResourceBuffer) + + +/******************************************************************************* + * + * FUNCTION:    AcpiWalkResources + * + * PARAMETERS:  DeviceHandle    - Handle to the device object for the + *                                device we are querying + *              Name            - Method name of the resources we want. + *                                (METHOD_NAME__CRS, METHOD_NAME__PRS, or + *                                METHOD_NAME__AEI) + *              UserFunction    - Called for each resource + *              Context         - Passed to UserFunction + * + * RETURN:      Status + * + * DESCRIPTION: Retrieves the current or possible resource list for the + *              specified device. The UserFunction is called once for + *              each resource in the list. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiWalkResources ( +    ACPI_HANDLE                 DeviceHandle, +    char                        *Name, +    ACPI_WALK_RESOURCE_CALLBACK UserFunction, +    void                        *Context) +{ +    ACPI_STATUS                 Status; +    ACPI_BUFFER                 Buffer; + + +    ACPI_FUNCTION_TRACE (AcpiWalkResources); + + +    /* Parameter validation */ + +    if (!DeviceHandle || !UserFunction || !Name || +        (!ACPI_COMPARE_NAME (Name, METHOD_NAME__CRS) && +         !ACPI_COMPARE_NAME (Name, METHOD_NAME__PRS) && +         !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI))) +    { +        return_ACPI_STATUS (AE_BAD_PARAMETER); +    } + +    /* Get the _CRS/_PRS/_AEI resource list */ + +    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; +    Status = AcpiRsGetMethodData (DeviceHandle, Name, &Buffer); +    if (ACPI_FAILURE (Status)) +    { +        return_ACPI_STATUS (Status); +    } + +    /* Walk the resource list and cleanup */ + +    Status = AcpiWalkResourceBuffer (&Buffer, UserFunction, Context);      ACPI_FREE (Buffer.Pointer);      return_ACPI_STATUS (Status);  } diff --git a/source/components/tables/tbxfload.c b/source/components/tables/tbxfload.c index ecf87733b4a0..ceb365bebd8c 100644 --- a/source/components/tables/tbxfload.c +++ b/source/components/tables/tbxfload.c @@ -199,7 +199,7 @@ AcpiTbLoadNamespace (          (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);      } -    ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI Tables successfully acquired\n")); +    ACPI_INFO ((AE_INFO, "All ACPI Tables successfully acquired"));  UnlockAndExit:      (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); diff --git a/source/components/utilities/utaddress.c b/source/components/utilities/utaddress.c index 0b357b681b51..dd971c417c3d 100644 --- a/source/components/utilities/utaddress.c +++ b/source/components/utilities/utaddress.c @@ -237,7 +237,7 @@ AcpiUtCheckAddressRange (      if ((SpaceId != ACPI_ADR_SPACE_SYSTEM_MEMORY) &&          (SpaceId != ACPI_ADR_SPACE_SYSTEM_IO))      { -        return_UINT32 (0); +        return_VALUE (0);      }      RangeInfo = AcpiGbl_AddressRangeList[SpaceId]; @@ -278,7 +278,7 @@ AcpiUtCheckAddressRange (          RangeInfo = RangeInfo->Next;      } -    return_UINT32 (OverlapCount); +    return_VALUE (OverlapCount);  } diff --git a/source/components/utilities/utdebug.c b/source/components/utilities/utdebug.c index ea38e98bd4fb..97a589b091da 100644 --- a/source/components/utilities/utdebug.c +++ b/source/components/utilities/utdebug.c @@ -189,11 +189,9 @@ AcpiDebugPrint (      va_list                 args; -    /* -     * Stay silent if the debug level or component ID is disabled -     */ -    if (!(RequestedDebugLevel & AcpiDbgLevel) || -        !(ComponentId & AcpiDbgLayer)) +    /* Check if debug output enabled */ + +    if (!ACPI_IS_DEBUG_ENABLED (RequestedDebugLevel, ComponentId))      {          return;      } @@ -268,8 +266,9 @@ AcpiDebugPrintRaw (      va_list                 args; -    if (!(RequestedDebugLevel & AcpiDbgLevel) || -        !(ComponentId & AcpiDbgLayer)) +    /* Check if debug output enabled */ + +    if (!ACPI_IS_DEBUG_ENABLED (RequestedDebugLevel, ComponentId))      {          return;      } @@ -309,9 +308,14 @@ AcpiUtTrace (      AcpiGbl_NestingLevel++;      AcpiUtTrackStackPtr (); -    AcpiDebugPrint (ACPI_LV_FUNCTIONS, -        LineNumber, FunctionName, ModuleName, ComponentId, -        "%s\n", AcpiGbl_FnEntryStr); +    /* Check if enabled up-front for performance */ + +    if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId)) +    { +        AcpiDebugPrint (ACPI_LV_FUNCTIONS, +            LineNumber, FunctionName, ModuleName, ComponentId, +            "%s\n", AcpiGbl_FnEntryStr); +    }  }  ACPI_EXPORT_SYMBOL (AcpiUtTrace) @@ -346,9 +350,14 @@ AcpiUtTracePtr (      AcpiGbl_NestingLevel++;      AcpiUtTrackStackPtr (); -    AcpiDebugPrint (ACPI_LV_FUNCTIONS, -        LineNumber, FunctionName, ModuleName, ComponentId, -        "%s %p\n", AcpiGbl_FnEntryStr, Pointer); +    /* Check if enabled up-front for performance */ + +    if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId)) +    { +        AcpiDebugPrint (ACPI_LV_FUNCTIONS, +            LineNumber, FunctionName, ModuleName, ComponentId, +            "%s %p\n", AcpiGbl_FnEntryStr, Pointer); +    }  } @@ -381,9 +390,14 @@ AcpiUtTraceStr (      AcpiGbl_NestingLevel++;      AcpiUtTrackStackPtr (); -    AcpiDebugPrint (ACPI_LV_FUNCTIONS, -        LineNumber, FunctionName, ModuleName, ComponentId, -        "%s %s\n", AcpiGbl_FnEntryStr, String); +    /* Check if enabled up-front for performance */ + +    if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId)) +    { +        AcpiDebugPrint (ACPI_LV_FUNCTIONS, +            LineNumber, FunctionName, ModuleName, ComponentId, +            "%s %s\n", AcpiGbl_FnEntryStr, String); +    }  } @@ -416,9 +430,14 @@ AcpiUtTraceU32 (      AcpiGbl_NestingLevel++;      AcpiUtTrackStackPtr (); -    AcpiDebugPrint (ACPI_LV_FUNCTIONS, -        LineNumber, FunctionName, ModuleName, ComponentId, -        "%s %08X\n", AcpiGbl_FnEntryStr, Integer); +    /* Check if enabled up-front for performance */ + +    if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId)) +    { +        AcpiDebugPrint (ACPI_LV_FUNCTIONS, +            LineNumber, FunctionName, ModuleName, ComponentId, +            "%s %08X\n", AcpiGbl_FnEntryStr, Integer); +    }  } @@ -446,9 +465,14 @@ AcpiUtExit (      UINT32                  ComponentId)  { -    AcpiDebugPrint (ACPI_LV_FUNCTIONS, -        LineNumber, FunctionName, ModuleName, ComponentId, -        "%s\n", AcpiGbl_FnExitStr); +    /* Check if enabled up-front for performance */ + +    if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId)) +    { +        AcpiDebugPrint (ACPI_LV_FUNCTIONS, +            LineNumber, FunctionName, ModuleName, ComponentId, +            "%s\n", AcpiGbl_FnExitStr); +    }      AcpiGbl_NestingLevel--;  } @@ -482,19 +506,24 @@ AcpiUtStatusExit (      ACPI_STATUS             Status)  { -    if (ACPI_SUCCESS (Status)) -    { -        AcpiDebugPrint (ACPI_LV_FUNCTIONS, -            LineNumber, FunctionName, ModuleName, ComponentId, -            "%s %s\n", AcpiGbl_FnExitStr, -            AcpiFormatException (Status)); -    } -    else +    /* Check if enabled up-front for performance */ + +    if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))      { -        AcpiDebugPrint (ACPI_LV_FUNCTIONS, -            LineNumber, FunctionName, ModuleName, ComponentId, -            "%s ****Exception****: %s\n", AcpiGbl_FnExitStr, -            AcpiFormatException (Status)); +        if (ACPI_SUCCESS (Status)) +        { +            AcpiDebugPrint (ACPI_LV_FUNCTIONS, +                LineNumber, FunctionName, ModuleName, ComponentId, +                "%s %s\n", AcpiGbl_FnExitStr, +                AcpiFormatException (Status)); +        } +        else +        { +            AcpiDebugPrint (ACPI_LV_FUNCTIONS, +                LineNumber, FunctionName, ModuleName, ComponentId, +                "%s ****Exception****: %s\n", AcpiGbl_FnExitStr, +                AcpiFormatException (Status)); +        }      }      AcpiGbl_NestingLevel--; @@ -529,10 +558,15 @@ AcpiUtValueExit (      UINT64                  Value)  { -    AcpiDebugPrint (ACPI_LV_FUNCTIONS, -        LineNumber, FunctionName, ModuleName, ComponentId, -        "%s %8.8X%8.8X\n", AcpiGbl_FnExitStr, -        ACPI_FORMAT_UINT64 (Value)); +    /* Check if enabled up-front for performance */ + +    if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId)) +    { +        AcpiDebugPrint (ACPI_LV_FUNCTIONS, +            LineNumber, FunctionName, ModuleName, ComponentId, +            "%s %8.8X%8.8X\n", AcpiGbl_FnExitStr, +            ACPI_FORMAT_UINT64 (Value)); +    }      AcpiGbl_NestingLevel--;  } @@ -566,9 +600,14 @@ AcpiUtPtrExit (      UINT8                   *Ptr)  { -    AcpiDebugPrint (ACPI_LV_FUNCTIONS, -        LineNumber, FunctionName, ModuleName, ComponentId, -        "%s %p\n", AcpiGbl_FnExitStr, Ptr); +    /* Check if enabled up-front for performance */ + +    if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId)) +    { +        AcpiDebugPrint (ACPI_LV_FUNCTIONS, +            LineNumber, FunctionName, ModuleName, ComponentId, +            "%s %p\n", AcpiGbl_FnExitStr, Ptr); +    }      AcpiGbl_NestingLevel--;  } diff --git a/source/components/utilities/utdelete.c b/source/components/utilities/utdelete.c index d526e0d27891..df2aa96d3dcd 100644 --- a/source/components/utilities/utdelete.c +++ b/source/components/utilities/utdelete.c @@ -368,7 +368,7 @@ AcpiUtDeleteInternalObjectList (      ACPI_OPERAND_OBJECT     **InternalObj; -    ACPI_FUNCTION_NAME (UtDeleteInternalObjectList); +    ACPI_FUNCTION_ENTRY ();      /* Walk the null-terminated internal list */ diff --git a/source/components/utilities/utmisc.c b/source/components/utilities/utmisc.c index c0c1f2063629..f75acd9fef5d 100644 --- a/source/components/utilities/utmisc.c +++ b/source/components/utilities/utmisc.c @@ -53,43 +53,6 @@          ACPI_MODULE_NAME    ("utmisc") -#if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP -/******************************************************************************* - * - * FUNCTION:    UtConvertBackslashes - * - * PARAMETERS:  Pathname        - File pathname string to be converted - * - * RETURN:      Modifies the input Pathname - * - * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within - *              the entire input file pathname string. - * - ******************************************************************************/ - -void -UtConvertBackslashes ( -    char                    *Pathname) -{ - -    if (!Pathname) -    { -        return; -    } - -    while (*Pathname) -    { -        if (*Pathname == '\\') -        { -            *Pathname = '/'; -        } - -        Pathname++; -    } -} -#endif - -  /*******************************************************************************   *   * FUNCTION:    AcpiUtIsPciRootBridge @@ -158,411 +121,6 @@ AcpiUtIsAmlTable (  /*******************************************************************************   * - * FUNCTION:    AcpiUtAllocateOwnerId - * - * PARAMETERS:  OwnerId         - Where the new owner ID is returned - * - * RETURN:      Status - * - * DESCRIPTION: Allocate a table or method owner ID. The owner ID is used to - *              track objects created by the table or method, to be deleted - *              when the method exits or the table is unloaded. - * - ******************************************************************************/ - -ACPI_STATUS -AcpiUtAllocateOwnerId ( -    ACPI_OWNER_ID           *OwnerId) -{ -    UINT32                  i; -    UINT32                  j; -    UINT32                  k; -    ACPI_STATUS             Status; - - -    ACPI_FUNCTION_TRACE (UtAllocateOwnerId); - - -    /* Guard against multiple allocations of ID to the same location */ - -    if (*OwnerId) -    { -        ACPI_ERROR ((AE_INFO, "Owner ID [0x%2.2X] already exists", *OwnerId)); -        return_ACPI_STATUS (AE_ALREADY_EXISTS); -    } - -    /* Mutex for the global ID mask */ - -    Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES); -    if (ACPI_FAILURE (Status)) -    { -        return_ACPI_STATUS (Status); -    } - -    /* -     * Find a free owner ID, cycle through all possible IDs on repeated -     * allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have -     * to be scanned twice. -     */ -    for (i = 0, j = AcpiGbl_LastOwnerIdIndex; -         i < (ACPI_NUM_OWNERID_MASKS + 1); -         i++, j++) -    { -        if (j >= ACPI_NUM_OWNERID_MASKS) -        { -            j = 0;  /* Wraparound to start of mask array */ -        } - -        for (k = AcpiGbl_NextOwnerIdOffset; k < 32; k++) -        { -            if (AcpiGbl_OwnerIdMask[j] == ACPI_UINT32_MAX) -            { -                /* There are no free IDs in this mask */ - -                break; -            } - -            if (!(AcpiGbl_OwnerIdMask[j] & (1 << k))) -            { -                /* -                 * Found a free ID. The actual ID is the bit index plus one, -                 * making zero an invalid Owner ID. Save this as the last ID -                 * allocated and update the global ID mask. -                 */ -                AcpiGbl_OwnerIdMask[j] |= (1 << k); - -                AcpiGbl_LastOwnerIdIndex = (UINT8) j; -                AcpiGbl_NextOwnerIdOffset = (UINT8) (k + 1); - -                /* -                 * Construct encoded ID from the index and bit position -                 * -                 * Note: Last [j].k (bit 255) is never used and is marked -                 * permanently allocated (prevents +1 overflow) -                 */ -                *OwnerId = (ACPI_OWNER_ID) ((k + 1) + ACPI_MUL_32 (j)); - -                ACPI_DEBUG_PRINT ((ACPI_DB_VALUES, -                    "Allocated OwnerId: %2.2X\n", (unsigned int) *OwnerId)); -                goto Exit; -            } -        } - -        AcpiGbl_NextOwnerIdOffset = 0; -    } - -    /* -     * All OwnerIds have been allocated. This typically should -     * not happen since the IDs are reused after deallocation. The IDs are -     * allocated upon table load (one per table) and method execution, and -     * they are released when a table is unloaded or a method completes -     * execution. -     * -     * If this error happens, there may be very deep nesting of invoked control -     * methods, or there may be a bug where the IDs are not released. -     */ -    Status = AE_OWNER_ID_LIMIT; -    ACPI_ERROR ((AE_INFO, -        "Could not allocate new OwnerId (255 max), AE_OWNER_ID_LIMIT")); - -Exit: -    (void) AcpiUtReleaseMutex (ACPI_MTX_CACHES); -    return_ACPI_STATUS (Status); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiUtReleaseOwnerId - * - * PARAMETERS:  OwnerIdPtr          - Pointer to a previously allocated OwnerID - * - * RETURN:      None. No error is returned because we are either exiting a - *              control method or unloading a table. Either way, we would - *              ignore any error anyway. - * - * DESCRIPTION: Release a table or method owner ID. Valid IDs are 1 - 255 - * - ******************************************************************************/ - -void -AcpiUtReleaseOwnerId ( -    ACPI_OWNER_ID           *OwnerIdPtr) -{ -    ACPI_OWNER_ID           OwnerId = *OwnerIdPtr; -    ACPI_STATUS             Status; -    UINT32                  Index; -    UINT32                  Bit; - - -    ACPI_FUNCTION_TRACE_U32 (UtReleaseOwnerId, OwnerId); - - -    /* Always clear the input OwnerId (zero is an invalid ID) */ - -    *OwnerIdPtr = 0; - -    /* Zero is not a valid OwnerID */ - -    if (OwnerId == 0) -    { -        ACPI_ERROR ((AE_INFO, "Invalid OwnerId: 0x%2.2X", OwnerId)); -        return_VOID; -    } - -    /* Mutex for the global ID mask */ - -    Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES); -    if (ACPI_FAILURE (Status)) -    { -        return_VOID; -    } - -    /* Normalize the ID to zero */ - -    OwnerId--; - -    /* Decode ID to index/offset pair */ - -    Index = ACPI_DIV_32 (OwnerId); -    Bit = 1 << ACPI_MOD_32 (OwnerId); - -    /* Free the owner ID only if it is valid */ - -    if (AcpiGbl_OwnerIdMask[Index] & Bit) -    { -        AcpiGbl_OwnerIdMask[Index] ^= Bit; -    } -    else -    { -        ACPI_ERROR ((AE_INFO, -            "Release of non-allocated OwnerId: 0x%2.2X", OwnerId + 1)); -    } - -    (void) AcpiUtReleaseMutex (ACPI_MTX_CACHES); -    return_VOID; -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiUtStrupr (strupr) - * - * PARAMETERS:  SrcString       - The source string to convert - * - * RETURN:      None - * - * DESCRIPTION: Convert string to uppercase - * - * NOTE: This is not a POSIX function, so it appears here, not in utclib.c - * - ******************************************************************************/ - -void -AcpiUtStrupr ( -    char                    *SrcString) -{ -    char                    *String; - - -    ACPI_FUNCTION_ENTRY (); - - -    if (!SrcString) -    { -        return; -    } - -    /* Walk entire string, uppercasing the letters */ - -    for (String = SrcString; *String; String++) -    { -        *String = (char) ACPI_TOUPPER (*String); -    } - -    return; -} - - -#ifdef ACPI_ASL_COMPILER -/******************************************************************************* - * - * FUNCTION:    AcpiUtStrlwr (strlwr) - * - * PARAMETERS:  SrcString       - The source string to convert - * - * RETURN:      None - * - * DESCRIPTION: Convert string to lowercase - * - * NOTE: This is not a POSIX function, so it appears here, not in utclib.c - * - ******************************************************************************/ - -void -AcpiUtStrlwr ( -    char                    *SrcString) -{ -    char                    *String; - - -    ACPI_FUNCTION_ENTRY (); - - -    if (!SrcString) -    { -        return; -    } - -    /* Walk entire string, lowercasing the letters */ - -    for (String = SrcString; *String; String++) -    { -        *String = (char) ACPI_TOLOWER (*String); -    } - -    return; -} - - -/****************************************************************************** - * - * FUNCTION:    AcpiUtStricmp - * - * PARAMETERS:  String1             - first string to compare - *              String2             - second string to compare - * - * RETURN:      int that signifies string relationship. Zero means strings - *              are equal. - * - * DESCRIPTION: Implementation of the non-ANSI stricmp function (compare - *              strings with no case sensitivity) - * - ******************************************************************************/ - -int -AcpiUtStricmp ( -    char                    *String1, -    char                    *String2) -{ -    int                     c1; -    int                     c2; - - -    do -    { -        c1 = tolower ((int) *String1); -        c2 = tolower ((int) *String2); - -        String1++; -        String2++; -    } -    while ((c1 == c2) && (c1)); - -    return (c1 - c2); -} -#endif - - -/******************************************************************************* - * - * FUNCTION:    AcpiUtPrintString - * - * PARAMETERS:  String          - Null terminated ASCII string - *              MaxLength       - Maximum output length - * - * RETURN:      None - * - * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape - *              sequences. - * - ******************************************************************************/ - -void -AcpiUtPrintString ( -    char                    *String, -    UINT8                   MaxLength) -{ -    UINT32                  i; - - -    if (!String) -    { -        AcpiOsPrintf ("<\"NULL STRING PTR\">"); -        return; -    } - -    AcpiOsPrintf ("\""); -    for (i = 0; String[i] && (i < MaxLength); i++) -    { -        /* Escape sequences */ - -        switch (String[i]) -        { -        case 0x07: -            AcpiOsPrintf ("\\a");       /* BELL */ -            break; - -        case 0x08: -            AcpiOsPrintf ("\\b");       /* BACKSPACE */ -            break; - -        case 0x0C: -            AcpiOsPrintf ("\\f");       /* FORMFEED */ -            break; - -        case 0x0A: -            AcpiOsPrintf ("\\n");       /* LINEFEED */ -            break; - -        case 0x0D: -            AcpiOsPrintf ("\\r");       /* CARRIAGE RETURN*/ -            break; - -        case 0x09: -            AcpiOsPrintf ("\\t");       /* HORIZONTAL TAB */ -            break; - -        case 0x0B: -            AcpiOsPrintf ("\\v");       /* VERTICAL TAB */ -            break; - -        case '\'':                      /* Single Quote */ -        case '\"':                      /* Double Quote */ -        case '\\':                      /* Backslash */ -            AcpiOsPrintf ("\\%c", (int) String[i]); -            break; - -        default: - -            /* Check for printable character or hex escape */ - -            if (ACPI_IS_PRINT (String[i])) -            { -                /* This is a normal character */ - -                AcpiOsPrintf ("%c", (int) String[i]); -            } -            else -            { -                /* All others will be Hex escapes */ - -                AcpiOsPrintf ("\\x%2.2X", (INT32) String[i]); -            } -            break; -        } -    } -    AcpiOsPrintf ("\""); - -    if (i == MaxLength && String[i]) -    { -        AcpiOsPrintf ("..."); -    } -} - - -/******************************************************************************* - *   * FUNCTION:    AcpiUtDwordByteSwap   *   * PARAMETERS:  Value           - Value to be converted @@ -642,444 +200,6 @@ AcpiUtSetIntegerWidth (  } -#ifdef ACPI_DEBUG_OUTPUT -/******************************************************************************* - * - * FUNCTION:    AcpiUtDisplayInitPathname - * - * PARAMETERS:  Type                - Object type of the node - *              ObjHandle           - Handle whose pathname will be displayed - *              Path                - Additional path string to be appended. - *                                      (NULL if no extra path) - * - * RETURN:      ACPI_STATUS - * - * DESCRIPTION: Display full pathname of an object, DEBUG ONLY - * - ******************************************************************************/ - -void -AcpiUtDisplayInitPathname ( -    UINT8                   Type, -    ACPI_NAMESPACE_NODE     *ObjHandle, -    char                    *Path) -{ -    ACPI_STATUS             Status; -    ACPI_BUFFER             Buffer; - - -    ACPI_FUNCTION_ENTRY (); - - -    /* Only print the path if the appropriate debug level is enabled */ - -    if (!(AcpiDbgLevel & ACPI_LV_INIT_NAMES)) -    { -        return; -    } - -    /* Get the full pathname to the node */ - -    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; -    Status = AcpiNsHandleToPathname (ObjHandle, &Buffer); -    if (ACPI_FAILURE (Status)) -    { -        return; -    } - -    /* Print what we're doing */ - -    switch (Type) -    { -    case ACPI_TYPE_METHOD: -        AcpiOsPrintf ("Executing    "); -        break; - -    default: -        AcpiOsPrintf ("Initializing "); -        break; -    } - -    /* Print the object type and pathname */ - -    AcpiOsPrintf ("%-12s  %s", -        AcpiUtGetTypeName (Type), (char *) Buffer.Pointer); - -    /* Extra path is used to append names like _STA, _INI, etc. */ - -    if (Path) -    { -        AcpiOsPrintf (".%s", Path); -    } -    AcpiOsPrintf ("\n"); - -    ACPI_FREE (Buffer.Pointer); -} -#endif - - -/******************************************************************************* - * - * FUNCTION:    AcpiUtValidAcpiChar - * - * PARAMETERS:  Char            - The character to be examined - *              Position        - Byte position (0-3) - * - * RETURN:      TRUE if the character is valid, FALSE otherwise - * - * DESCRIPTION: Check for a valid ACPI character. Must be one of: - *              1) Upper case alpha - *              2) numeric - *              3) underscore - * - *              We allow a '!' as the last character because of the ASF! table - * - ******************************************************************************/ - -BOOLEAN -AcpiUtValidAcpiChar ( -    char                    Character, -    UINT32                  Position) -{ - -    if (!((Character >= 'A' && Character <= 'Z') || -          (Character >= '0' && Character <= '9') || -          (Character == '_'))) -    { -        /* Allow a '!' in the last position */ - -        if (Character == '!' && Position == 3) -        { -            return (TRUE); -        } - -        return (FALSE); -    } - -    return (TRUE); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiUtValidAcpiName - * - * PARAMETERS:  Name            - The name to be examined - * - * RETURN:      TRUE if the name is valid, FALSE otherwise - * - * DESCRIPTION: Check for a valid ACPI name. Each character must be one of: - *              1) Upper case alpha - *              2) numeric - *              3) underscore - * - ******************************************************************************/ - -BOOLEAN -AcpiUtValidAcpiName ( -    UINT32                  Name) -{ -    UINT32                  i; - - -    ACPI_FUNCTION_ENTRY (); - - -    for (i = 0; i < ACPI_NAME_SIZE; i++) -    { -        if (!AcpiUtValidAcpiChar ((ACPI_CAST_PTR (char, &Name))[i], i)) -        { -            return (FALSE); -        } -    } - -    return (TRUE); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiUtRepairName - * - * PARAMETERS:  Name            - The ACPI name to be repaired - * - * RETURN:      Repaired version of the name - * - * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and - *              return the new name. NOTE: the Name parameter must reside in - *              read/write memory, cannot be a const. - * - * An ACPI Name must consist of valid ACPI characters. We will repair the name - * if necessary because we don't want to abort because of this, but we want - * all namespace names to be printable. A warning message is appropriate. - * - * This issue came up because there are in fact machines that exhibit - * this problem, and we want to be able to enable ACPI support for them, - * even though there are a few bad names. - * - ******************************************************************************/ - -void -AcpiUtRepairName ( -    char                    *Name) -{ -    UINT32                  i; -    BOOLEAN                 FoundBadChar = FALSE; -    UINT32                  OriginalName; - - -    ACPI_FUNCTION_NAME (UtRepairName); - - -    ACPI_MOVE_NAME (&OriginalName, Name); - -    /* Check each character in the name */ - -    for (i = 0; i < ACPI_NAME_SIZE; i++) -    { -        if (AcpiUtValidAcpiChar (Name[i], i)) -        { -            continue; -        } - -        /* -         * Replace a bad character with something printable, yet technically -         * still invalid. This prevents any collisions with existing "good" -         * names in the namespace. -         */ -        Name[i] = '*'; -        FoundBadChar = TRUE; -    } - -    if (FoundBadChar) -    { -        /* Report warning only if in strict mode or debug mode */ - -        if (!AcpiGbl_EnableInterpreterSlack) -        { -            ACPI_WARNING ((AE_INFO, -                "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]", -                OriginalName, Name)); -        } -        else -        { -            ACPI_DEBUG_PRINT ((ACPI_DB_INFO, -                "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]", -                OriginalName, Name)); -        } -    } -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiUtStrtoul64 - * - * PARAMETERS:  String          - Null terminated string - *              Base            - Radix of the string: 16 or ACPI_ANY_BASE; - *                                ACPI_ANY_BASE means 'in behalf of ToInteger' - *              RetInteger      - Where the converted integer is returned - * - * RETURN:      Status and Converted value - * - * DESCRIPTION: Convert a string into an unsigned value. Performs either a - *              32-bit or 64-bit conversion, depending on the current mode - *              of the interpreter. - *              NOTE: Does not support Octal strings, not needed. - * - ******************************************************************************/ - -ACPI_STATUS -AcpiUtStrtoul64 ( -    char                    *String, -    UINT32                  Base, -    UINT64                  *RetInteger) -{ -    UINT32                  ThisDigit = 0; -    UINT64                  ReturnValue = 0; -    UINT64                  Quotient; -    UINT64                  Dividend; -    UINT32                  ToIntegerOp = (Base == ACPI_ANY_BASE); -    UINT32                  Mode32 = (AcpiGbl_IntegerByteWidth == 4); -    UINT8                   ValidDigits = 0; -    UINT8                   SignOf0x = 0; -    UINT8                   Term = 0; - - -    ACPI_FUNCTION_TRACE_STR (UtStroul64, String); - - -    switch (Base) -    { -    case ACPI_ANY_BASE: -    case 16: -        break; - -    default: -        /* Invalid Base */ -        return_ACPI_STATUS (AE_BAD_PARAMETER); -    } - -    if (!String) -    { -        goto ErrorExit; -    } - -    /* Skip over any white space in the buffer */ - -    while ((*String) && (ACPI_IS_SPACE (*String) || *String == '\t')) -    { -        String++; -    } - -    if (ToIntegerOp) -    { -        /* -         * Base equal to ACPI_ANY_BASE means 'ToInteger operation case'. -         * We need to determine if it is decimal or hexadecimal. -         */ -        if ((*String == '0') && (ACPI_TOLOWER (*(String + 1)) == 'x')) -        { -            SignOf0x = 1; -            Base = 16; - -            /* Skip over the leading '0x' */ -            String += 2; -        } -        else -        { -            Base = 10; -        } -    } - -    /* Any string left? Check that '0x' is not followed by white space. */ - -    if (!(*String) || ACPI_IS_SPACE (*String) || *String == '\t') -    { -        if (ToIntegerOp) -        { -            goto ErrorExit; -        } -        else -        { -            goto AllDone; -        } -    } - -    /* -     * Perform a 32-bit or 64-bit conversion, depending upon the current -     * execution mode of the interpreter -     */ -    Dividend = (Mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX; - -    /* Main loop: convert the string to a 32- or 64-bit integer */ - -    while (*String) -    { -        if (ACPI_IS_DIGIT (*String)) -        { -            /* Convert ASCII 0-9 to Decimal value */ - -            ThisDigit = ((UINT8) *String) - '0'; -        } -        else if (Base == 10) -        { -            /* Digit is out of range; possible in ToInteger case only */ - -            Term = 1; -        } -        else -        { -            ThisDigit = (UINT8) ACPI_TOUPPER (*String); -            if (ACPI_IS_XDIGIT ((char) ThisDigit)) -            { -                /* Convert ASCII Hex char to value */ - -                ThisDigit = ThisDigit - 'A' + 10; -            } -            else -            { -                Term = 1; -            } -        } - -        if (Term) -        { -            if (ToIntegerOp) -            { -                goto ErrorExit; -            } -            else -            { -                break; -            } -        } -        else if ((ValidDigits == 0) && (ThisDigit == 0) && !SignOf0x) -        { -            /* Skip zeros */ -            String++; -            continue; -        } - -        ValidDigits++; - -        if (SignOf0x && ((ValidDigits > 16) || ((ValidDigits > 8) && Mode32))) -        { -            /* -             * This is ToInteger operation case. -             * No any restrictions for string-to-integer conversion, -             * see ACPI spec. -             */ -            goto ErrorExit; -        } - -        /* Divide the digit into the correct position */ - -        (void) AcpiUtShortDivide ((Dividend - (UINT64) ThisDigit), -                    Base, &Quotient, NULL); - -        if (ReturnValue > Quotient) -        { -            if (ToIntegerOp) -            { -                goto ErrorExit; -            } -            else -            { -                break; -            } -        } - -        ReturnValue *= Base; -        ReturnValue += ThisDigit; -        String++; -    } - -    /* All done, normal exit */ - -AllDone: - -    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n", -        ACPI_FORMAT_UINT64 (ReturnValue))); - -    *RetInteger = ReturnValue; -    return_ACPI_STATUS (AE_OK); - - -ErrorExit: -    /* Base was set/validated above */ - -    if (Base == 10) -    { -        return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT); -    } -    else -    { -        return_ACPI_STATUS (AE_BAD_HEX_CONSTANT); -    } -} - -  /*******************************************************************************   *   * FUNCTION:    AcpiUtCreateUpdateStateAndPush @@ -1257,3 +377,79 @@ AcpiUtWalkPackageTree (      return_ACPI_STATUS (AE_AML_INTERNAL);  } + + +#ifdef ACPI_DEBUG_OUTPUT +/******************************************************************************* + * + * FUNCTION:    AcpiUtDisplayInitPathname + * + * PARAMETERS:  Type                - Object type of the node + *              ObjHandle           - Handle whose pathname will be displayed + *              Path                - Additional path string to be appended. + *                                      (NULL if no extra path) + * + * RETURN:      ACPI_STATUS + * + * DESCRIPTION: Display full pathname of an object, DEBUG ONLY + * + ******************************************************************************/ + +void +AcpiUtDisplayInitPathname ( +    UINT8                   Type, +    ACPI_NAMESPACE_NODE     *ObjHandle, +    char                    *Path) +{ +    ACPI_STATUS             Status; +    ACPI_BUFFER             Buffer; + + +    ACPI_FUNCTION_ENTRY (); + + +    /* Only print the path if the appropriate debug level is enabled */ + +    if (!(AcpiDbgLevel & ACPI_LV_INIT_NAMES)) +    { +        return; +    } + +    /* Get the full pathname to the node */ + +    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; +    Status = AcpiNsHandleToPathname (ObjHandle, &Buffer); +    if (ACPI_FAILURE (Status)) +    { +        return; +    } + +    /* Print what we're doing */ + +    switch (Type) +    { +    case ACPI_TYPE_METHOD: +        AcpiOsPrintf ("Executing    "); +        break; + +    default: +        AcpiOsPrintf ("Initializing "); +        break; +    } + +    /* Print the object type and pathname */ + +    AcpiOsPrintf ("%-12s  %s", +        AcpiUtGetTypeName (Type), (char *) Buffer.Pointer); + +    /* Extra path is used to append names like _STA, _INI, etc. */ + +    if (Path) +    { +        AcpiOsPrintf (".%s", Path); +    } +    AcpiOsPrintf ("\n"); + +    ACPI_FREE (Buffer.Pointer); +} +#endif diff --git a/source/components/utilities/utobject.c b/source/components/utilities/utobject.c index 2841541d44fe..bdfd7e340466 100644 --- a/source/components/utilities/utobject.c +++ b/source/components/utilities/utobject.c @@ -725,7 +725,7 @@ AcpiUtGetPackageObjectSize (      Info.NumPackages = 1;      Status = AcpiUtWalkPackageTree (InternalObject, NULL, -                            AcpiUtGetElementLength, &Info); +        AcpiUtGetElementLength, &Info);      if (ACPI_FAILURE (Status))      {          return_ACPI_STATUS (Status); diff --git a/source/components/utilities/utownerid.c b/source/components/utilities/utownerid.c new file mode 100644 index 000000000000..86d670ce842c --- /dev/null +++ b/source/components/utilities/utownerid.c @@ -0,0 +1,241 @@ +/******************************************************************************* + * + * Module Name: utownerid - Support for Table/Method Owner IDs + * + ******************************************************************************/ + +/* + * Copyright (C) 2000 - 2012, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions, and the following disclaimer, + *    without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + *    substantially similar to the "NO WARRANTY" disclaimer below + *    ("Disclaimer") and any redistribution must be conditioned upon + *    including a substantially similar Disclaimer requirement for further + *    binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + *    of any contributors may be used to endorse or promote products derived + *    from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + */ + + +#define __UTOWNERID_C__ + +#include "acpi.h" +#include "accommon.h" +#include "acnamesp.h" + + +#define _COMPONENT          ACPI_UTILITIES +        ACPI_MODULE_NAME    ("utownerid") + + +/******************************************************************************* + * + * FUNCTION:    AcpiUtAllocateOwnerId + * + * PARAMETERS:  OwnerId         - Where the new owner ID is returned + * + * RETURN:      Status + * + * DESCRIPTION: Allocate a table or method owner ID. The owner ID is used to + *              track objects created by the table or method, to be deleted + *              when the method exits or the table is unloaded. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiUtAllocateOwnerId ( +    ACPI_OWNER_ID           *OwnerId) +{ +    UINT32                  i; +    UINT32                  j; +    UINT32                  k; +    ACPI_STATUS             Status; + + +    ACPI_FUNCTION_TRACE (UtAllocateOwnerId); + + +    /* Guard against multiple allocations of ID to the same location */ + +    if (*OwnerId) +    { +        ACPI_ERROR ((AE_INFO, "Owner ID [0x%2.2X] already exists", *OwnerId)); +        return_ACPI_STATUS (AE_ALREADY_EXISTS); +    } + +    /* Mutex for the global ID mask */ + +    Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES); +    if (ACPI_FAILURE (Status)) +    { +        return_ACPI_STATUS (Status); +    } + +    /* +     * Find a free owner ID, cycle through all possible IDs on repeated +     * allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have +     * to be scanned twice. +     */ +    for (i = 0, j = AcpiGbl_LastOwnerIdIndex; +         i < (ACPI_NUM_OWNERID_MASKS + 1); +         i++, j++) +    { +        if (j >= ACPI_NUM_OWNERID_MASKS) +        { +            j = 0;  /* Wraparound to start of mask array */ +        } + +        for (k = AcpiGbl_NextOwnerIdOffset; k < 32; k++) +        { +            if (AcpiGbl_OwnerIdMask[j] == ACPI_UINT32_MAX) +            { +                /* There are no free IDs in this mask */ + +                break; +            } + +            if (!(AcpiGbl_OwnerIdMask[j] & (1 << k))) +            { +                /* +                 * Found a free ID. The actual ID is the bit index plus one, +                 * making zero an invalid Owner ID. Save this as the last ID +                 * allocated and update the global ID mask. +                 */ +                AcpiGbl_OwnerIdMask[j] |= (1 << k); + +                AcpiGbl_LastOwnerIdIndex = (UINT8) j; +                AcpiGbl_NextOwnerIdOffset = (UINT8) (k + 1); + +                /* +                 * Construct encoded ID from the index and bit position +                 * +                 * Note: Last [j].k (bit 255) is never used and is marked +                 * permanently allocated (prevents +1 overflow) +                 */ +                *OwnerId = (ACPI_OWNER_ID) ((k + 1) + ACPI_MUL_32 (j)); + +                ACPI_DEBUG_PRINT ((ACPI_DB_VALUES, +                    "Allocated OwnerId: %2.2X\n", (unsigned int) *OwnerId)); +                goto Exit; +            } +        } + +        AcpiGbl_NextOwnerIdOffset = 0; +    } + +    /* +     * All OwnerIds have been allocated. This typically should +     * not happen since the IDs are reused after deallocation. The IDs are +     * allocated upon table load (one per table) and method execution, and +     * they are released when a table is unloaded or a method completes +     * execution. +     * +     * If this error happens, there may be very deep nesting of invoked control +     * methods, or there may be a bug where the IDs are not released. +     */ +    Status = AE_OWNER_ID_LIMIT; +    ACPI_ERROR ((AE_INFO, +        "Could not allocate new OwnerId (255 max), AE_OWNER_ID_LIMIT")); + +Exit: +    (void) AcpiUtReleaseMutex (ACPI_MTX_CACHES); +    return_ACPI_STATUS (Status); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiUtReleaseOwnerId + * + * PARAMETERS:  OwnerIdPtr          - Pointer to a previously allocated OwnerID + * + * RETURN:      None. No error is returned because we are either exiting a + *              control method or unloading a table. Either way, we would + *              ignore any error anyway. + * + * DESCRIPTION: Release a table or method owner ID. Valid IDs are 1 - 255 + * + ******************************************************************************/ + +void +AcpiUtReleaseOwnerId ( +    ACPI_OWNER_ID           *OwnerIdPtr) +{ +    ACPI_OWNER_ID           OwnerId = *OwnerIdPtr; +    ACPI_STATUS             Status; +    UINT32                  Index; +    UINT32                  Bit; + + +    ACPI_FUNCTION_TRACE_U32 (UtReleaseOwnerId, OwnerId); + + +    /* Always clear the input OwnerId (zero is an invalid ID) */ + +    *OwnerIdPtr = 0; + +    /* Zero is not a valid OwnerID */ + +    if (OwnerId == 0) +    { +        ACPI_ERROR ((AE_INFO, "Invalid OwnerId: 0x%2.2X", OwnerId)); +        return_VOID; +    } + +    /* Mutex for the global ID mask */ + +    Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES); +    if (ACPI_FAILURE (Status)) +    { +        return_VOID; +    } + +    /* Normalize the ID to zero */ + +    OwnerId--; + +    /* Decode ID to index/offset pair */ + +    Index = ACPI_DIV_32 (OwnerId); +    Bit = 1 << ACPI_MOD_32 (OwnerId); + +    /* Free the owner ID only if it is valid */ + +    if (AcpiGbl_OwnerIdMask[Index] & Bit) +    { +        AcpiGbl_OwnerIdMask[Index] ^= Bit; +    } +    else +    { +        ACPI_ERROR ((AE_INFO, +            "Release of non-allocated OwnerId: 0x%2.2X", OwnerId + 1)); +    } + +    (void) AcpiUtReleaseMutex (ACPI_MTX_CACHES); +    return_VOID; +} diff --git a/source/components/utilities/utresrc.c b/source/components/utilities/utresrc.c index 0caec2033d75..42a268cb3e46 100644 --- a/source/components/utilities/utresrc.c +++ b/source/components/utilities/utresrc.c @@ -456,7 +456,7 @@ AcpiUtWalkAmlResources (      UINT8                   *Aml,      ACPI_SIZE               AmlLength,      ACPI_WALK_AML_CALLBACK  UserFunction, -    void                    *Context) +    void                    **Context)  {      ACPI_STATUS             Status;      UINT8                   *EndAml; @@ -528,7 +528,7 @@ AcpiUtWalkAmlResources (              if (!UserFunction)              { -                *(void **) Context = Aml; +                *Context = Aml;              }              /* Normal exit */ @@ -919,7 +919,7 @@ AcpiUtGetResourceEndTag (      /* Validate the template and get a pointer to the EndTag */      Status = AcpiUtWalkAmlResources (NULL, ObjDesc->Buffer.Pointer, -                ObjDesc->Buffer.Length, NULL, EndTag); +                ObjDesc->Buffer.Length, NULL, (void **) EndTag);      return_ACPI_STATUS (Status);  } diff --git a/source/components/utilities/utstring.c b/source/components/utilities/utstring.c new file mode 100644 index 000000000000..b93396295617 --- /dev/null +++ b/source/components/utilities/utstring.c @@ -0,0 +1,674 @@ +/******************************************************************************* + * + * Module Name: utstring - Common functions for strings and characters + * + ******************************************************************************/ + +/* + * Copyright (C) 2000 - 2012, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions, and the following disclaimer, + *    without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + *    substantially similar to the "NO WARRANTY" disclaimer below + *    ("Disclaimer") and any redistribution must be conditioned upon + *    including a substantially similar Disclaimer requirement for further + *    binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + *    of any contributors may be used to endorse or promote products derived + *    from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + */ + + +#define __UTSTRING_C__ + +#include "acpi.h" +#include "accommon.h" +#include "acnamesp.h" + + +#define _COMPONENT          ACPI_UTILITIES +        ACPI_MODULE_NAME    ("utstring") + + +/* + * Non-ANSI C library functions - strlwr, strupr, stricmp, and a 64-bit + * version of strtoul. + */ + +#ifdef ACPI_ASL_COMPILER +/******************************************************************************* + * + * FUNCTION:    AcpiUtStrlwr (strlwr) + * + * PARAMETERS:  SrcString       - The source string to convert + * + * RETURN:      None + * + * DESCRIPTION: Convert string to lowercase + * + * NOTE: This is not a POSIX function, so it appears here, not in utclib.c + * + ******************************************************************************/ + +void +AcpiUtStrlwr ( +    char                    *SrcString) +{ +    char                    *String; + + +    ACPI_FUNCTION_ENTRY (); + + +    if (!SrcString) +    { +        return; +    } + +    /* Walk entire string, lowercasing the letters */ + +    for (String = SrcString; *String; String++) +    { +        *String = (char) ACPI_TOLOWER (*String); +    } + +    return; +} + + +/****************************************************************************** + * + * FUNCTION:    AcpiUtStricmp (stricmp) + * + * PARAMETERS:  String1             - first string to compare + *              String2             - second string to compare + * + * RETURN:      int that signifies string relationship. Zero means strings + *              are equal. + * + * DESCRIPTION: Implementation of the non-ANSI stricmp function (compare + *              strings with no case sensitivity) + * + ******************************************************************************/ + +int +AcpiUtStricmp ( +    char                    *String1, +    char                    *String2) +{ +    int                     c1; +    int                     c2; + + +    do +    { +        c1 = tolower ((int) *String1); +        c2 = tolower ((int) *String2); + +        String1++; +        String2++; +    } +    while ((c1 == c2) && (c1)); + +    return (c1 - c2); +} +#endif + + +/******************************************************************************* + * + * FUNCTION:    AcpiUtStrupr (strupr) + * + * PARAMETERS:  SrcString       - The source string to convert + * + * RETURN:      None + * + * DESCRIPTION: Convert string to uppercase + * + * NOTE: This is not a POSIX function, so it appears here, not in utclib.c + * + ******************************************************************************/ + +void +AcpiUtStrupr ( +    char                    *SrcString) +{ +    char                    *String; + + +    ACPI_FUNCTION_ENTRY (); + + +    if (!SrcString) +    { +        return; +    } + +    /* Walk entire string, uppercasing the letters */ + +    for (String = SrcString; *String; String++) +    { +        *String = (char) ACPI_TOUPPER (*String); +    } + +    return; +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiUtStrtoul64 + * + * PARAMETERS:  String          - Null terminated string + *              Base            - Radix of the string: 16 or ACPI_ANY_BASE; + *                                ACPI_ANY_BASE means 'in behalf of ToInteger' + *              RetInteger      - Where the converted integer is returned + * + * RETURN:      Status and Converted value + * + * DESCRIPTION: Convert a string into an unsigned value. Performs either a + *              32-bit or 64-bit conversion, depending on the current mode + *              of the interpreter. + *              NOTE: Does not support Octal strings, not needed. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiUtStrtoul64 ( +    char                    *String, +    UINT32                  Base, +    UINT64                  *RetInteger) +{ +    UINT32                  ThisDigit = 0; +    UINT64                  ReturnValue = 0; +    UINT64                  Quotient; +    UINT64                  Dividend; +    UINT32                  ToIntegerOp = (Base == ACPI_ANY_BASE); +    UINT32                  Mode32 = (AcpiGbl_IntegerByteWidth == 4); +    UINT8                   ValidDigits = 0; +    UINT8                   SignOf0x = 0; +    UINT8                   Term = 0; + + +    ACPI_FUNCTION_TRACE_STR (UtStroul64, String); + + +    switch (Base) +    { +    case ACPI_ANY_BASE: +    case 16: +        break; + +    default: +        /* Invalid Base */ +        return_ACPI_STATUS (AE_BAD_PARAMETER); +    } + +    if (!String) +    { +        goto ErrorExit; +    } + +    /* Skip over any white space in the buffer */ + +    while ((*String) && (ACPI_IS_SPACE (*String) || *String == '\t')) +    { +        String++; +    } + +    if (ToIntegerOp) +    { +        /* +         * Base equal to ACPI_ANY_BASE means 'ToInteger operation case'. +         * We need to determine if it is decimal or hexadecimal. +         */ +        if ((*String == '0') && (ACPI_TOLOWER (*(String + 1)) == 'x')) +        { +            SignOf0x = 1; +            Base = 16; + +            /* Skip over the leading '0x' */ +            String += 2; +        } +        else +        { +            Base = 10; +        } +    } + +    /* Any string left? Check that '0x' is not followed by white space. */ + +    if (!(*String) || ACPI_IS_SPACE (*String) || *String == '\t') +    { +        if (ToIntegerOp) +        { +            goto ErrorExit; +        } +        else +        { +            goto AllDone; +        } +    } + +    /* +     * Perform a 32-bit or 64-bit conversion, depending upon the current +     * execution mode of the interpreter +     */ +    Dividend = (Mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX; + +    /* Main loop: convert the string to a 32- or 64-bit integer */ + +    while (*String) +    { +        if (ACPI_IS_DIGIT (*String)) +        { +            /* Convert ASCII 0-9 to Decimal value */ + +            ThisDigit = ((UINT8) *String) - '0'; +        } +        else if (Base == 10) +        { +            /* Digit is out of range; possible in ToInteger case only */ + +            Term = 1; +        } +        else +        { +            ThisDigit = (UINT8) ACPI_TOUPPER (*String); +            if (ACPI_IS_XDIGIT ((char) ThisDigit)) +            { +                /* Convert ASCII Hex char to value */ + +                ThisDigit = ThisDigit - 'A' + 10; +            } +            else +            { +                Term = 1; +            } +        } + +        if (Term) +        { +            if (ToIntegerOp) +            { +                goto ErrorExit; +            } +            else +            { +                break; +            } +        } +        else if ((ValidDigits == 0) && (ThisDigit == 0) && !SignOf0x) +        { +            /* Skip zeros */ +            String++; +            continue; +        } + +        ValidDigits++; + +        if (SignOf0x && ((ValidDigits > 16) || ((ValidDigits > 8) && Mode32))) +        { +            /* +             * This is ToInteger operation case. +             * No any restrictions for string-to-integer conversion, +             * see ACPI spec. +             */ +            goto ErrorExit; +        } + +        /* Divide the digit into the correct position */ + +        (void) AcpiUtShortDivide ((Dividend - (UINT64) ThisDigit), +                    Base, &Quotient, NULL); + +        if (ReturnValue > Quotient) +        { +            if (ToIntegerOp) +            { +                goto ErrorExit; +            } +            else +            { +                break; +            } +        } + +        ReturnValue *= Base; +        ReturnValue += ThisDigit; +        String++; +    } + +    /* All done, normal exit */ + +AllDone: + +    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n", +        ACPI_FORMAT_UINT64 (ReturnValue))); + +    *RetInteger = ReturnValue; +    return_ACPI_STATUS (AE_OK); + + +ErrorExit: +    /* Base was set/validated above */ + +    if (Base == 10) +    { +        return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT); +    } +    else +    { +        return_ACPI_STATUS (AE_BAD_HEX_CONSTANT); +    } +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiUtPrintString + * + * PARAMETERS:  String          - Null terminated ASCII string + *              MaxLength       - Maximum output length + * + * RETURN:      None + * + * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape + *              sequences. + * + ******************************************************************************/ + +void +AcpiUtPrintString ( +    char                    *String, +    UINT8                   MaxLength) +{ +    UINT32                  i; + + +    if (!String) +    { +        AcpiOsPrintf ("<\"NULL STRING PTR\">"); +        return; +    } + +    AcpiOsPrintf ("\""); +    for (i = 0; String[i] && (i < MaxLength); i++) +    { +        /* Escape sequences */ + +        switch (String[i]) +        { +        case 0x07: +            AcpiOsPrintf ("\\a");       /* BELL */ +            break; + +        case 0x08: +            AcpiOsPrintf ("\\b");       /* BACKSPACE */ +            break; + +        case 0x0C: +            AcpiOsPrintf ("\\f");       /* FORMFEED */ +            break; + +        case 0x0A: +            AcpiOsPrintf ("\\n");       /* LINEFEED */ +            break; + +        case 0x0D: +            AcpiOsPrintf ("\\r");       /* CARRIAGE RETURN*/ +            break; + +        case 0x09: +            AcpiOsPrintf ("\\t");       /* HORIZONTAL TAB */ +            break; + +        case 0x0B: +            AcpiOsPrintf ("\\v");       /* VERTICAL TAB */ +            break; + +        case '\'':                      /* Single Quote */ +        case '\"':                      /* Double Quote */ +        case '\\':                      /* Backslash */ +            AcpiOsPrintf ("\\%c", (int) String[i]); +            break; + +        default: + +            /* Check for printable character or hex escape */ + +            if (ACPI_IS_PRINT (String[i])) +            { +                /* This is a normal character */ + +                AcpiOsPrintf ("%c", (int) String[i]); +            } +            else +            { +                /* All others will be Hex escapes */ + +                AcpiOsPrintf ("\\x%2.2X", (INT32) String[i]); +            } +            break; +        } +    } +    AcpiOsPrintf ("\""); + +    if (i == MaxLength && String[i]) +    { +        AcpiOsPrintf ("..."); +    } +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiUtValidAcpiChar + * + * PARAMETERS:  Char            - The character to be examined + *              Position        - Byte position (0-3) + * + * RETURN:      TRUE if the character is valid, FALSE otherwise + * + * DESCRIPTION: Check for a valid ACPI character. Must be one of: + *              1) Upper case alpha + *              2) numeric + *              3) underscore + * + *              We allow a '!' as the last character because of the ASF! table + * + ******************************************************************************/ + +BOOLEAN +AcpiUtValidAcpiChar ( +    char                    Character, +    UINT32                  Position) +{ + +    if (!((Character >= 'A' && Character <= 'Z') || +          (Character >= '0' && Character <= '9') || +          (Character == '_'))) +    { +        /* Allow a '!' in the last position */ + +        if (Character == '!' && Position == 3) +        { +            return (TRUE); +        } + +        return (FALSE); +    } + +    return (TRUE); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiUtValidAcpiName + * + * PARAMETERS:  Name            - The name to be examined + * + * RETURN:      TRUE if the name is valid, FALSE otherwise + * + * DESCRIPTION: Check for a valid ACPI name. Each character must be one of: + *              1) Upper case alpha + *              2) numeric + *              3) underscore + * + ******************************************************************************/ + +BOOLEAN +AcpiUtValidAcpiName ( +    UINT32                  Name) +{ +    UINT32                  i; + + +    ACPI_FUNCTION_ENTRY (); + + +    for (i = 0; i < ACPI_NAME_SIZE; i++) +    { +        if (!AcpiUtValidAcpiChar ((ACPI_CAST_PTR (char, &Name))[i], i)) +        { +            return (FALSE); +        } +    } + +    return (TRUE); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiUtRepairName + * + * PARAMETERS:  Name            - The ACPI name to be repaired + * + * RETURN:      Repaired version of the name + * + * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and + *              return the new name. NOTE: the Name parameter must reside in + *              read/write memory, cannot be a const. + * + * An ACPI Name must consist of valid ACPI characters. We will repair the name + * if necessary because we don't want to abort because of this, but we want + * all namespace names to be printable. A warning message is appropriate. + * + * This issue came up because there are in fact machines that exhibit + * this problem, and we want to be able to enable ACPI support for them, + * even though there are a few bad names. + * + ******************************************************************************/ + +void +AcpiUtRepairName ( +    char                    *Name) +{ +    UINT32                  i; +    BOOLEAN                 FoundBadChar = FALSE; +    UINT32                  OriginalName; + + +    ACPI_FUNCTION_NAME (UtRepairName); + + +    ACPI_MOVE_NAME (&OriginalName, Name); + +    /* Check each character in the name */ + +    for (i = 0; i < ACPI_NAME_SIZE; i++) +    { +        if (AcpiUtValidAcpiChar (Name[i], i)) +        { +            continue; +        } + +        /* +         * Replace a bad character with something printable, yet technically +         * still invalid. This prevents any collisions with existing "good" +         * names in the namespace. +         */ +        Name[i] = '*'; +        FoundBadChar = TRUE; +    } + +    if (FoundBadChar) +    { +        /* Report warning only if in strict mode or debug mode */ + +        if (!AcpiGbl_EnableInterpreterSlack) +        { +            ACPI_WARNING ((AE_INFO, +                "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]", +                OriginalName, Name)); +        } +        else +        { +            ACPI_DEBUG_PRINT ((ACPI_DB_INFO, +                "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]", +                OriginalName, Name)); +        } +    } +} + + +#if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP +/******************************************************************************* + * + * FUNCTION:    UtConvertBackslashes + * + * PARAMETERS:  Pathname        - File pathname string to be converted + * + * RETURN:      Modifies the input Pathname + * + * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within + *              the entire input file pathname string. + * + ******************************************************************************/ + +void +UtConvertBackslashes ( +    char                    *Pathname) +{ + +    if (!Pathname) +    { +        return; +    } + +    while (*Pathname) +    { +        if (*Pathname == '\\') +        { +            *Pathname = '/'; +        } + +        Pathname++; +    } +} +#endif | 
