diff options
Diffstat (limited to 'source/components/utilities')
| -rw-r--r-- | source/components/utilities/utaddress.c | 4 | ||||
| -rw-r--r-- | source/components/utilities/utdebug.c | 121 | ||||
| -rw-r--r-- | source/components/utilities/utdelete.c | 2 | ||||
| -rw-r--r-- | source/components/utilities/utmisc.c | 956 | ||||
| -rw-r--r-- | source/components/utilities/utobject.c | 2 | ||||
| -rw-r--r-- | source/components/utilities/utownerid.c | 241 | ||||
| -rw-r--r-- | source/components/utilities/utresrc.c | 6 | ||||
| -rw-r--r-- | source/components/utilities/utstring.c | 674 | 
8 files changed, 1078 insertions, 928 deletions
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  | 
