diff options
Diffstat (limited to 'source/components/utilities/utmisc.c')
| -rw-r--r-- | source/components/utilities/utmisc.c | 956 | 
1 files changed, 76 insertions, 880 deletions
| 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 | 
