Home | History | Annotate | Line # | Download | only in utilities
utmisc.c revision 1.1
      1 /*******************************************************************************
      2  *
      3  * Module Name: utmisc - common utility procedures
      4  *
      5  ******************************************************************************/
      6 
      7 /******************************************************************************
      8  *
      9  * 1. Copyright Notice
     10  *
     11  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
     12  * All rights reserved.
     13  *
     14  * 2. License
     15  *
     16  * 2.1. This is your license from Intel Corp. under its intellectual property
     17  * rights.  You may have additional license terms from the party that provided
     18  * you this software, covering your right to use that party's intellectual
     19  * property rights.
     20  *
     21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     22  * copy of the source code appearing in this file ("Covered Code") an
     23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     24  * base code distributed originally by Intel ("Original Intel Code") to copy,
     25  * make derivatives, distribute, use and display any portion of the Covered
     26  * Code in any form, with the right to sublicense such rights; and
     27  *
     28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     29  * license (with the right to sublicense), under only those claims of Intel
     30  * patents that are infringed by the Original Intel Code, to make, use, sell,
     31  * offer to sell, and import the Covered Code and derivative works thereof
     32  * solely to the minimum extent necessary to exercise the above copyright
     33  * license, and in no event shall the patent license extend to any additions
     34  * to or modifications of the Original Intel Code.  No other license or right
     35  * is granted directly or by implication, estoppel or otherwise;
     36  *
     37  * The above copyright and patent license is granted only if the following
     38  * conditions are met:
     39  *
     40  * 3. Conditions
     41  *
     42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     43  * Redistribution of source code of any substantial portion of the Covered
     44  * Code or modification with rights to further distribute source must include
     45  * the above Copyright Notice, the above License, this list of Conditions,
     46  * and the following Disclaimer and Export Compliance provision.  In addition,
     47  * Licensee must cause all Covered Code to which Licensee contributes to
     48  * contain a file documenting the changes Licensee made to create that Covered
     49  * Code and the date of any change.  Licensee must include in that file the
     50  * documentation of any changes made by any predecessor Licensee.  Licensee
     51  * must include a prominent statement that the modification is derived,
     52  * directly or indirectly, from Original Intel Code.
     53  *
     54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     55  * Redistribution of source code of any substantial portion of the Covered
     56  * Code or modification without rights to further distribute source must
     57  * include the following Disclaimer and Export Compliance provision in the
     58  * documentation and/or other materials provided with distribution.  In
     59  * addition, Licensee may not authorize further sublicense of source of any
     60  * portion of the Covered Code, and must include terms to the effect that the
     61  * license from Licensee to its licensee is limited to the intellectual
     62  * property embodied in the software Licensee provides to its licensee, and
     63  * not to intellectual property embodied in modifications its licensee may
     64  * make.
     65  *
     66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     67  * substantial portion of the Covered Code or modification must reproduce the
     68  * above Copyright Notice, and the following Disclaimer and Export Compliance
     69  * provision in the documentation and/or other materials provided with the
     70  * distribution.
     71  *
     72  * 3.4. Intel retains all right, title, and interest in and to the Original
     73  * Intel Code.
     74  *
     75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     76  * Intel shall be used in advertising or otherwise to promote the sale, use or
     77  * other dealings in products derived from or relating to the Covered Code
     78  * without prior written authorization from Intel.
     79  *
     80  * 4. Disclaimer and Export Compliance
     81  *
     82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     83  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
     85  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
     86  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
     87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     88  * PARTICULAR PURPOSE.
     89  *
     90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
     96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     97  * LIMITED REMEDY.
     98  *
     99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    100  * software or system incorporating such software without first obtaining any
    101  * required license or other approval from the U. S. Department of Commerce or
    102  * any other agency or department of the United States Government.  In the
    103  * event Licensee exports any such software from the United States or
    104  * re-exports any such software from a foreign destination, Licensee shall
    105  * ensure that the distribution and export/re-export of the software is in
    106  * compliance with all laws, regulations, orders, or other restrictions of the
    107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    108  * any of its subsidiaries will export/re-export any technical data, process,
    109  * software, or service, directly or indirectly, to any country for which the
    110  * United States government or any agency thereof requires an export license,
    111  * other governmental approval, or letter of assurance, without first obtaining
    112  * such license, approval or letter.
    113  *
    114  *****************************************************************************/
    115 
    116 
    117 #define __UTMISC_C__
    118 
    119 #include "acpi.h"
    120 #include "accommon.h"
    121 #include "acnamesp.h"
    122 
    123 
    124 #define _COMPONENT          ACPI_UTILITIES
    125         ACPI_MODULE_NAME    ("utmisc")
    126 
    127 /*
    128  * Common suffix for messages
    129  */
    130 #define ACPI_COMMON_MSG_SUFFIX \
    131     AcpiOsPrintf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, ModuleName, LineNumber)
    132 
    133 
    134 /*******************************************************************************
    135  *
    136  * FUNCTION:    AcpiUtValidateException
    137  *
    138  * PARAMETERS:  Status       - The ACPI_STATUS code to be formatted
    139  *
    140  * RETURN:      A string containing the exception text. NULL if exception is
    141  *              not valid.
    142  *
    143  * DESCRIPTION: This function validates and translates an ACPI exception into
    144  *              an ASCII string.
    145  *
    146  ******************************************************************************/
    147 
    148 const char *
    149 AcpiUtValidateException (
    150     ACPI_STATUS             Status)
    151 {
    152     UINT32                  SubStatus;
    153     const char              *Exception = NULL;
    154 
    155 
    156     ACPI_FUNCTION_ENTRY ();
    157 
    158 
    159     /*
    160      * Status is composed of two parts, a "type" and an actual code
    161      */
    162     SubStatus = (Status & ~AE_CODE_MASK);
    163 
    164     switch (Status & AE_CODE_MASK)
    165     {
    166     case AE_CODE_ENVIRONMENTAL:
    167 
    168         if (SubStatus <= AE_CODE_ENV_MAX)
    169         {
    170             Exception = AcpiGbl_ExceptionNames_Env [SubStatus];
    171         }
    172         break;
    173 
    174     case AE_CODE_PROGRAMMER:
    175 
    176         if (SubStatus <= AE_CODE_PGM_MAX)
    177         {
    178             Exception = AcpiGbl_ExceptionNames_Pgm [SubStatus];
    179         }
    180         break;
    181 
    182     case AE_CODE_ACPI_TABLES:
    183 
    184         if (SubStatus <= AE_CODE_TBL_MAX)
    185         {
    186             Exception = AcpiGbl_ExceptionNames_Tbl [SubStatus];
    187         }
    188         break;
    189 
    190     case AE_CODE_AML:
    191 
    192         if (SubStatus <= AE_CODE_AML_MAX)
    193         {
    194             Exception = AcpiGbl_ExceptionNames_Aml [SubStatus];
    195         }
    196         break;
    197 
    198     case AE_CODE_CONTROL:
    199 
    200         if (SubStatus <= AE_CODE_CTRL_MAX)
    201         {
    202             Exception = AcpiGbl_ExceptionNames_Ctrl [SubStatus];
    203         }
    204         break;
    205 
    206     default:
    207         break;
    208     }
    209 
    210     return (ACPI_CAST_PTR (const char, Exception));
    211 }
    212 
    213 
    214 /*******************************************************************************
    215  *
    216  * FUNCTION:    AcpiUtIsPciRootBridge
    217  *
    218  * PARAMETERS:  Id              - The HID/CID in string format
    219  *
    220  * RETURN:      TRUE if the Id is a match for a PCI/PCI-Express Root Bridge
    221  *
    222  * DESCRIPTION: Determine if the input ID is a PCI Root Bridge ID.
    223  *
    224  ******************************************************************************/
    225 
    226 BOOLEAN
    227 AcpiUtIsPciRootBridge (
    228     char                    *Id)
    229 {
    230 
    231     /*
    232      * Check if this is a PCI root bridge.
    233      * ACPI 3.0+: check for a PCI Express root also.
    234      */
    235     if (!(ACPI_STRCMP (Id,
    236             PCI_ROOT_HID_STRING)) ||
    237 
    238         !(ACPI_STRCMP (Id,
    239             PCI_EXPRESS_ROOT_HID_STRING)))
    240     {
    241         return (TRUE);
    242     }
    243 
    244     return (FALSE);
    245 }
    246 
    247 
    248 /*******************************************************************************
    249  *
    250  * FUNCTION:    AcpiUtIsAmlTable
    251  *
    252  * PARAMETERS:  Table               - An ACPI table
    253  *
    254  * RETURN:      TRUE if table contains executable AML; FALSE otherwise
    255  *
    256  * DESCRIPTION: Check ACPI Signature for a table that contains AML code.
    257  *              Currently, these are DSDT,SSDT,PSDT. All other table types are
    258  *              data tables that do not contain AML code.
    259  *
    260  ******************************************************************************/
    261 
    262 BOOLEAN
    263 AcpiUtIsAmlTable (
    264     ACPI_TABLE_HEADER       *Table)
    265 {
    266 
    267     /* These are the only tables that contain executable AML */
    268 
    269     if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT) ||
    270         ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_PSDT) ||
    271         ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_SSDT))
    272     {
    273         return (TRUE);
    274     }
    275 
    276     return (FALSE);
    277 }
    278 
    279 
    280 /*******************************************************************************
    281  *
    282  * FUNCTION:    AcpiUtAllocateOwnerId
    283  *
    284  * PARAMETERS:  OwnerId         - Where the new owner ID is returned
    285  *
    286  * RETURN:      Status
    287  *
    288  * DESCRIPTION: Allocate a table or method owner ID. The owner ID is used to
    289  *              track objects created by the table or method, to be deleted
    290  *              when the method exits or the table is unloaded.
    291  *
    292  ******************************************************************************/
    293 
    294 ACPI_STATUS
    295 AcpiUtAllocateOwnerId (
    296     ACPI_OWNER_ID           *OwnerId)
    297 {
    298     UINT32                  i;
    299     UINT32                  j;
    300     UINT32                  k;
    301     ACPI_STATUS             Status;
    302 
    303 
    304     ACPI_FUNCTION_TRACE (UtAllocateOwnerId);
    305 
    306 
    307     /* Guard against multiple allocations of ID to the same location */
    308 
    309     if (*OwnerId)
    310     {
    311         ACPI_ERROR ((AE_INFO, "Owner ID [0x%2.2X] already exists", *OwnerId));
    312         return_ACPI_STATUS (AE_ALREADY_EXISTS);
    313     }
    314 
    315     /* Mutex for the global ID mask */
    316 
    317     Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES);
    318     if (ACPI_FAILURE (Status))
    319     {
    320         return_ACPI_STATUS (Status);
    321     }
    322 
    323     /*
    324      * Find a free owner ID, cycle through all possible IDs on repeated
    325      * allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have
    326      * to be scanned twice.
    327      */
    328     for (i = 0, j = AcpiGbl_LastOwnerIdIndex;
    329          i < (ACPI_NUM_OWNERID_MASKS + 1);
    330          i++, j++)
    331     {
    332         if (j >= ACPI_NUM_OWNERID_MASKS)
    333         {
    334             j = 0;  /* Wraparound to start of mask array */
    335         }
    336 
    337         for (k = AcpiGbl_NextOwnerIdOffset; k < 32; k++)
    338         {
    339             if (AcpiGbl_OwnerIdMask[j] == ACPI_UINT32_MAX)
    340             {
    341                 /* There are no free IDs in this mask */
    342 
    343                 break;
    344             }
    345 
    346             if (!(AcpiGbl_OwnerIdMask[j] & (1 << k)))
    347             {
    348                 /*
    349                  * Found a free ID. The actual ID is the bit index plus one,
    350                  * making zero an invalid Owner ID. Save this as the last ID
    351                  * allocated and update the global ID mask.
    352                  */
    353                 AcpiGbl_OwnerIdMask[j] |= (1 << k);
    354 
    355                 AcpiGbl_LastOwnerIdIndex = (UINT8) j;
    356                 AcpiGbl_NextOwnerIdOffset = (UINT8) (k + 1);
    357 
    358                 /*
    359                  * Construct encoded ID from the index and bit position
    360                  *
    361                  * Note: Last [j].k (bit 255) is never used and is marked
    362                  * permanently allocated (prevents +1 overflow)
    363                  */
    364                 *OwnerId = (ACPI_OWNER_ID) ((k + 1) + ACPI_MUL_32 (j));
    365 
    366                 ACPI_DEBUG_PRINT ((ACPI_DB_VALUES,
    367                     "Allocated OwnerId: %2.2X\n", (unsigned int) *OwnerId));
    368                 goto Exit;
    369             }
    370         }
    371 
    372         AcpiGbl_NextOwnerIdOffset = 0;
    373     }
    374 
    375     /*
    376      * All OwnerIds have been allocated. This typically should
    377      * not happen since the IDs are reused after deallocation. The IDs are
    378      * allocated upon table load (one per table) and method execution, and
    379      * they are released when a table is unloaded or a method completes
    380      * execution.
    381      *
    382      * If this error happens, there may be very deep nesting of invoked control
    383      * methods, or there may be a bug where the IDs are not released.
    384      */
    385     Status = AE_OWNER_ID_LIMIT;
    386     ACPI_ERROR ((AE_INFO,
    387         "Could not allocate new OwnerId (255 max), AE_OWNER_ID_LIMIT"));
    388 
    389 Exit:
    390     (void) AcpiUtReleaseMutex (ACPI_MTX_CACHES);
    391     return_ACPI_STATUS (Status);
    392 }
    393 
    394 
    395 /*******************************************************************************
    396  *
    397  * FUNCTION:    AcpiUtReleaseOwnerId
    398  *
    399  * PARAMETERS:  OwnerIdPtr          - Pointer to a previously allocated OwnerID
    400  *
    401  * RETURN:      None. No error is returned because we are either exiting a
    402  *              control method or unloading a table. Either way, we would
    403  *              ignore any error anyway.
    404  *
    405  * DESCRIPTION: Release a table or method owner ID.  Valid IDs are 1 - 255
    406  *
    407  ******************************************************************************/
    408 
    409 void
    410 AcpiUtReleaseOwnerId (
    411     ACPI_OWNER_ID           *OwnerIdPtr)
    412 {
    413     ACPI_OWNER_ID           OwnerId = *OwnerIdPtr;
    414     ACPI_STATUS             Status;
    415     UINT32                  Index;
    416     UINT32                  Bit;
    417 
    418 
    419     ACPI_FUNCTION_TRACE_U32 (UtReleaseOwnerId, OwnerId);
    420 
    421 
    422     /* Always clear the input OwnerId (zero is an invalid ID) */
    423 
    424     *OwnerIdPtr = 0;
    425 
    426     /* Zero is not a valid OwnerID */
    427 
    428     if (OwnerId == 0)
    429     {
    430         ACPI_ERROR ((AE_INFO, "Invalid OwnerId: 0x%2.2X", OwnerId));
    431         return_VOID;
    432     }
    433 
    434     /* Mutex for the global ID mask */
    435 
    436     Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES);
    437     if (ACPI_FAILURE (Status))
    438     {
    439         return_VOID;
    440     }
    441 
    442     /* Normalize the ID to zero */
    443 
    444     OwnerId--;
    445 
    446     /* Decode ID to index/offset pair */
    447 
    448     Index = ACPI_DIV_32 (OwnerId);
    449     Bit = 1 << ACPI_MOD_32 (OwnerId);
    450 
    451     /* Free the owner ID only if it is valid */
    452 
    453     if (AcpiGbl_OwnerIdMask[Index] & Bit)
    454     {
    455         AcpiGbl_OwnerIdMask[Index] ^= Bit;
    456     }
    457     else
    458     {
    459         ACPI_ERROR ((AE_INFO,
    460             "Release of non-allocated OwnerId: 0x%2.2X", OwnerId + 1));
    461     }
    462 
    463     (void) AcpiUtReleaseMutex (ACPI_MTX_CACHES);
    464     return_VOID;
    465 }
    466 
    467 
    468 /*******************************************************************************
    469  *
    470  * FUNCTION:    AcpiUtStrupr (strupr)
    471  *
    472  * PARAMETERS:  SrcString       - The source string to convert
    473  *
    474  * RETURN:      None
    475  *
    476  * DESCRIPTION: Convert string to uppercase
    477  *
    478  * NOTE: This is not a POSIX function, so it appears here, not in utclib.c
    479  *
    480  ******************************************************************************/
    481 
    482 void
    483 AcpiUtStrupr (
    484     char                    *SrcString)
    485 {
    486     char                    *String;
    487 
    488 
    489     ACPI_FUNCTION_ENTRY ();
    490 
    491 
    492     if (!SrcString)
    493     {
    494         return;
    495     }
    496 
    497     /* Walk entire string, uppercasing the letters */
    498 
    499     for (String = SrcString; *String; String++)
    500     {
    501         *String = (char) ACPI_TOUPPER (*String);
    502     }
    503 
    504     return;
    505 }
    506 
    507 
    508 /*******************************************************************************
    509  *
    510  * FUNCTION:    AcpiUtPrintString
    511  *
    512  * PARAMETERS:  String          - Null terminated ASCII string
    513  *              MaxLength       - Maximum output length
    514  *
    515  * RETURN:      None
    516  *
    517  * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape
    518  *              sequences.
    519  *
    520  ******************************************************************************/
    521 
    522 void
    523 AcpiUtPrintString (
    524     char                    *String,
    525     UINT8                   MaxLength)
    526 {
    527     UINT32                  i;
    528 
    529 
    530     if (!String)
    531     {
    532         AcpiOsPrintf ("<\"NULL STRING PTR\">");
    533         return;
    534     }
    535 
    536     AcpiOsPrintf ("\"");
    537     for (i = 0; String[i] && (i < MaxLength); i++)
    538     {
    539         /* Escape sequences */
    540 
    541         switch (String[i])
    542         {
    543         case 0x07:
    544             AcpiOsPrintf ("\\a");       /* BELL */
    545             break;
    546 
    547         case 0x08:
    548             AcpiOsPrintf ("\\b");       /* BACKSPACE */
    549             break;
    550 
    551         case 0x0C:
    552             AcpiOsPrintf ("\\f");       /* FORMFEED */
    553             break;
    554 
    555         case 0x0A:
    556             AcpiOsPrintf ("\\n");       /* LINEFEED */
    557             break;
    558 
    559         case 0x0D:
    560             AcpiOsPrintf ("\\r");       /* CARRIAGE RETURN*/
    561             break;
    562 
    563         case 0x09:
    564             AcpiOsPrintf ("\\t");       /* HORIZONTAL TAB */
    565             break;
    566 
    567         case 0x0B:
    568             AcpiOsPrintf ("\\v");       /* VERTICAL TAB */
    569             break;
    570 
    571         case '\'':                      /* Single Quote */
    572         case '\"':                      /* Double Quote */
    573         case '\\':                      /* Backslash */
    574             AcpiOsPrintf ("\\%c", (int) String[i]);
    575             break;
    576 
    577         default:
    578 
    579             /* Check for printable character or hex escape */
    580 
    581             if (ACPI_IS_PRINT (String[i]))
    582             {
    583                 /* This is a normal character */
    584 
    585                 AcpiOsPrintf ("%c", (int) String[i]);
    586             }
    587             else
    588             {
    589                 /* All others will be Hex escapes */
    590 
    591                 AcpiOsPrintf ("\\x%2.2X", (INT32) String[i]);
    592             }
    593             break;
    594         }
    595     }
    596     AcpiOsPrintf ("\"");
    597 
    598     if (i == MaxLength && String[i])
    599     {
    600         AcpiOsPrintf ("...");
    601     }
    602 }
    603 
    604 
    605 /*******************************************************************************
    606  *
    607  * FUNCTION:    AcpiUtDwordByteSwap
    608  *
    609  * PARAMETERS:  Value           - Value to be converted
    610  *
    611  * RETURN:      UINT32 integer with bytes swapped
    612  *
    613  * DESCRIPTION: Convert a 32-bit value to big-endian (swap the bytes)
    614  *
    615  ******************************************************************************/
    616 
    617 UINT32
    618 AcpiUtDwordByteSwap (
    619     UINT32                  Value)
    620 {
    621     union
    622     {
    623         UINT32              Value;
    624         UINT8               Bytes[4];
    625     } Out;
    626     union
    627     {
    628         UINT32              Value;
    629         UINT8               Bytes[4];
    630     } In;
    631 
    632 
    633     ACPI_FUNCTION_ENTRY ();
    634 
    635 
    636     In.Value = Value;
    637 
    638     Out.Bytes[0] = In.Bytes[3];
    639     Out.Bytes[1] = In.Bytes[2];
    640     Out.Bytes[2] = In.Bytes[1];
    641     Out.Bytes[3] = In.Bytes[0];
    642 
    643     return (Out.Value);
    644 }
    645 
    646 
    647 /*******************************************************************************
    648  *
    649  * FUNCTION:    AcpiUtSetIntegerWidth
    650  *
    651  * PARAMETERS:  Revision            From DSDT header
    652  *
    653  * RETURN:      None
    654  *
    655  * DESCRIPTION: Set the global integer bit width based upon the revision
    656  *              of the DSDT.  For Revision 1 and 0, Integers are 32 bits.
    657  *              For Revision 2 and above, Integers are 64 bits.  Yes, this
    658  *              makes a difference.
    659  *
    660  ******************************************************************************/
    661 
    662 void
    663 AcpiUtSetIntegerWidth (
    664     UINT8                   Revision)
    665 {
    666 
    667     if (Revision < 2)
    668     {
    669         /* 32-bit case */
    670 
    671         AcpiGbl_IntegerBitWidth    = 32;
    672         AcpiGbl_IntegerNybbleWidth = 8;
    673         AcpiGbl_IntegerByteWidth   = 4;
    674     }
    675     else
    676     {
    677         /* 64-bit case (ACPI 2.0+) */
    678 
    679         AcpiGbl_IntegerBitWidth    = 64;
    680         AcpiGbl_IntegerNybbleWidth = 16;
    681         AcpiGbl_IntegerByteWidth   = 8;
    682     }
    683 }
    684 
    685 
    686 #ifdef ACPI_DEBUG_OUTPUT
    687 /*******************************************************************************
    688  *
    689  * FUNCTION:    AcpiUtDisplayInitPathname
    690  *
    691  * PARAMETERS:  Type                - Object type of the node
    692  *              ObjHandle           - Handle whose pathname will be displayed
    693  *              Path                - Additional path string to be appended.
    694  *                                      (NULL if no extra path)
    695  *
    696  * RETURN:      ACPI_STATUS
    697  *
    698  * DESCRIPTION: Display full pathname of an object, DEBUG ONLY
    699  *
    700  ******************************************************************************/
    701 
    702 void
    703 AcpiUtDisplayInitPathname (
    704     UINT8                   Type,
    705     ACPI_NAMESPACE_NODE     *ObjHandle,
    706     char                    *Path)
    707 {
    708     ACPI_STATUS             Status;
    709     ACPI_BUFFER             Buffer;
    710 
    711 
    712     ACPI_FUNCTION_ENTRY ();
    713 
    714 
    715     /* Only print the path if the appropriate debug level is enabled */
    716 
    717     if (!(AcpiDbgLevel & ACPI_LV_INIT_NAMES))
    718     {
    719         return;
    720     }
    721 
    722     /* Get the full pathname to the node */
    723 
    724     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
    725     Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
    726     if (ACPI_FAILURE (Status))
    727     {
    728         return;
    729     }
    730 
    731     /* Print what we're doing */
    732 
    733     switch (Type)
    734     {
    735     case ACPI_TYPE_METHOD:
    736         AcpiOsPrintf ("Executing    ");
    737         break;
    738 
    739     default:
    740         AcpiOsPrintf ("Initializing ");
    741         break;
    742     }
    743 
    744     /* Print the object type and pathname */
    745 
    746     AcpiOsPrintf ("%-12s  %s",
    747         AcpiUtGetTypeName (Type), (char *) Buffer.Pointer);
    748 
    749     /* Extra path is used to append names like _STA, _INI, etc. */
    750 
    751     if (Path)
    752     {
    753         AcpiOsPrintf (".%s", Path);
    754     }
    755     AcpiOsPrintf ("\n");
    756 
    757     ACPI_FREE (Buffer.Pointer);
    758 }
    759 #endif
    760 
    761 
    762 /*******************************************************************************
    763  *
    764  * FUNCTION:    AcpiUtValidAcpiChar
    765  *
    766  * PARAMETERS:  Char            - The character to be examined
    767  *              Position        - Byte position (0-3)
    768  *
    769  * RETURN:      TRUE if the character is valid, FALSE otherwise
    770  *
    771  * DESCRIPTION: Check for a valid ACPI character. Must be one of:
    772  *              1) Upper case alpha
    773  *              2) numeric
    774  *              3) underscore
    775  *
    776  *              We allow a '!' as the last character because of the ASF! table
    777  *
    778  ******************************************************************************/
    779 
    780 BOOLEAN
    781 AcpiUtValidAcpiChar (
    782     char                    Character,
    783     UINT32                  Position)
    784 {
    785 
    786     if (!((Character >= 'A' && Character <= 'Z') ||
    787           (Character >= '0' && Character <= '9') ||
    788           (Character == '_')))
    789     {
    790         /* Allow a '!' in the last position */
    791 
    792         if (Character == '!' && Position == 3)
    793         {
    794             return (TRUE);
    795         }
    796 
    797         return (FALSE);
    798     }
    799 
    800     return (TRUE);
    801 }
    802 
    803 
    804 /*******************************************************************************
    805  *
    806  * FUNCTION:    AcpiUtValidAcpiName
    807  *
    808  * PARAMETERS:  Name            - The name to be examined
    809  *
    810  * RETURN:      TRUE if the name is valid, FALSE otherwise
    811  *
    812  * DESCRIPTION: Check for a valid ACPI name.  Each character must be one of:
    813  *              1) Upper case alpha
    814  *              2) numeric
    815  *              3) underscore
    816  *
    817  ******************************************************************************/
    818 
    819 BOOLEAN
    820 AcpiUtValidAcpiName (
    821     UINT32                  Name)
    822 {
    823     UINT32                  i;
    824 
    825 
    826     ACPI_FUNCTION_ENTRY ();
    827 
    828 
    829     for (i = 0; i < ACPI_NAME_SIZE; i++)
    830     {
    831         if (!AcpiUtValidAcpiChar ((ACPI_CAST_PTR (char, &Name))[i], i))
    832         {
    833             return (FALSE);
    834         }
    835     }
    836 
    837     return (TRUE);
    838 }
    839 
    840 
    841 /*******************************************************************************
    842  *
    843  * FUNCTION:    AcpiUtRepairName
    844  *
    845  * PARAMETERS:  Name            - The ACPI name to be repaired
    846  *
    847  * RETURN:      Repaired version of the name
    848  *
    849  * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and
    850  *              return the new name. NOTE: the Name parameter must reside in
    851  *              read/write memory, cannot be a const.
    852  *
    853  * An ACPI Name must consist of valid ACPI characters. We will repair the name
    854  * if necessary because we don't want to abort because of this, but we want
    855  * all namespace names to be printable. A warning message is appropriate.
    856  *
    857  * This issue came up because there are in fact machines that exhibit
    858  * this problem, and we want to be able to enable ACPI support for them,
    859  * even though there are a few bad names.
    860  *
    861  ******************************************************************************/
    862 
    863 void
    864 AcpiUtRepairName (
    865     char                    *Name)
    866 {
    867     UINT32                  i;
    868     BOOLEAN                 FoundBadChar = FALSE;
    869 
    870 
    871     ACPI_FUNCTION_NAME (UtRepairName);
    872 
    873 
    874     /* Check each character in the name */
    875 
    876     for (i = 0; i < ACPI_NAME_SIZE; i++)
    877     {
    878         if (AcpiUtValidAcpiChar (Name[i], i))
    879         {
    880             continue;
    881         }
    882 
    883         /*
    884          * Replace a bad character with something printable, yet technically
    885          * still invalid. This prevents any collisions with existing "good"
    886          * names in the namespace.
    887          */
    888         Name[i] = '*';
    889         FoundBadChar = TRUE;
    890     }
    891 
    892     if (FoundBadChar)
    893     {
    894         /* Report warning only if in strict mode or debug mode */
    895 
    896         if (!AcpiGbl_EnableInterpreterSlack)
    897         {
    898             ACPI_WARNING ((AE_INFO,
    899                 "Found bad character(s) in name, repaired: [%4.4s]\n", Name));
    900         }
    901         else
    902         {
    903             ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
    904                 "Found bad character(s) in name, repaired: [%4.4s]\n", Name));
    905         }
    906     }
    907 }
    908 
    909 
    910 /*******************************************************************************
    911  *
    912  * FUNCTION:    AcpiUtStrtoul64
    913  *
    914  * PARAMETERS:  String          - Null terminated string
    915  *              Base            - Radix of the string: 16 or ACPI_ANY_BASE;
    916  *                                ACPI_ANY_BASE means 'in behalf of ToInteger'
    917  *              RetInteger      - Where the converted integer is returned
    918  *
    919  * RETURN:      Status and Converted value
    920  *
    921  * DESCRIPTION: Convert a string into an unsigned value. Performs either a
    922  *              32-bit or 64-bit conversion, depending on the current mode
    923  *              of the interpreter.
    924  *              NOTE: Does not support Octal strings, not needed.
    925  *
    926  ******************************************************************************/
    927 
    928 ACPI_STATUS
    929 AcpiUtStrtoul64 (
    930     char                    *String,
    931     UINT32                  Base,
    932     UINT64                  *RetInteger)
    933 {
    934     UINT32                  ThisDigit = 0;
    935     UINT64                  ReturnValue = 0;
    936     UINT64                  Quotient;
    937     UINT64                  Dividend;
    938     UINT32                  ToIntegerOp = (Base == ACPI_ANY_BASE);
    939     UINT32                  Mode32 = (AcpiGbl_IntegerByteWidth == 4);
    940     UINT8                   ValidDigits = 0;
    941     UINT8                   SignOf0x = 0;
    942     UINT8                   Term = 0;
    943 
    944 
    945     ACPI_FUNCTION_TRACE_STR (UtStroul64, String);
    946 
    947 
    948     switch (Base)
    949     {
    950     case ACPI_ANY_BASE:
    951     case 16:
    952         break;
    953 
    954     default:
    955         /* Invalid Base */
    956         return_ACPI_STATUS (AE_BAD_PARAMETER);
    957     }
    958 
    959     if (!String)
    960     {
    961         goto ErrorExit;
    962     }
    963 
    964     /* Skip over any white space in the buffer */
    965 
    966     while ((*String) && (ACPI_IS_SPACE (*String) || *String == '\t'))
    967     {
    968         String++;
    969     }
    970 
    971     if (ToIntegerOp)
    972     {
    973         /*
    974          * Base equal to ACPI_ANY_BASE means 'ToInteger operation case'.
    975          * We need to determine if it is decimal or hexadecimal.
    976          */
    977         if ((*String == '0') && (ACPI_TOLOWER (*(String + 1)) == 'x'))
    978         {
    979             SignOf0x = 1;
    980             Base = 16;
    981 
    982             /* Skip over the leading '0x' */
    983             String += 2;
    984         }
    985         else
    986         {
    987             Base = 10;
    988         }
    989     }
    990 
    991     /* Any string left? Check that '0x' is not followed by white space. */
    992 
    993     if (!(*String) || ACPI_IS_SPACE (*String) || *String == '\t')
    994     {
    995         if (ToIntegerOp)
    996         {
    997             goto ErrorExit;
    998         }
    999         else
   1000         {
   1001             goto AllDone;
   1002         }
   1003     }
   1004 
   1005     /*
   1006      * Perform a 32-bit or 64-bit conversion, depending upon the current
   1007      * execution mode of the interpreter
   1008      */
   1009     Dividend = (Mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX;
   1010 
   1011     /* Main loop: convert the string to a 32- or 64-bit integer */
   1012 
   1013     while (*String)
   1014     {
   1015         if (ACPI_IS_DIGIT (*String))
   1016         {
   1017             /* Convert ASCII 0-9 to Decimal value */
   1018 
   1019             ThisDigit = ((UINT8) *String) - '0';
   1020         }
   1021         else if (Base == 10)
   1022         {
   1023             /* Digit is out of range; possible in ToInteger case only */
   1024 
   1025             Term = 1;
   1026         }
   1027         else
   1028         {
   1029             ThisDigit = (UINT8) ACPI_TOUPPER (*String);
   1030             if (ACPI_IS_XDIGIT ((char) ThisDigit))
   1031             {
   1032                 /* Convert ASCII Hex char to value */
   1033 
   1034                 ThisDigit = ThisDigit - 'A' + 10;
   1035             }
   1036             else
   1037             {
   1038                 Term = 1;
   1039             }
   1040         }
   1041 
   1042         if (Term)
   1043         {
   1044             if (ToIntegerOp)
   1045             {
   1046                 goto ErrorExit;
   1047             }
   1048             else
   1049             {
   1050                 break;
   1051             }
   1052         }
   1053         else if ((ValidDigits == 0) && (ThisDigit == 0) && !SignOf0x)
   1054         {
   1055             /* Skip zeros */
   1056             String++;
   1057             continue;
   1058         }
   1059 
   1060         ValidDigits++;
   1061 
   1062         if (SignOf0x && ((ValidDigits > 16) || ((ValidDigits > 8) && Mode32)))
   1063         {
   1064             /*
   1065              * This is ToInteger operation case.
   1066              * No any restrictions for string-to-integer conversion,
   1067              * see ACPI spec.
   1068              */
   1069             goto ErrorExit;
   1070         }
   1071 
   1072         /* Divide the digit into the correct position */
   1073 
   1074         (void) AcpiUtShortDivide ((Dividend - (UINT64) ThisDigit),
   1075                     Base, &Quotient, NULL);
   1076 
   1077         if (ReturnValue > Quotient)
   1078         {
   1079             if (ToIntegerOp)
   1080             {
   1081                 goto ErrorExit;
   1082             }
   1083             else
   1084             {
   1085                 break;
   1086             }
   1087         }
   1088 
   1089         ReturnValue *= Base;
   1090         ReturnValue += ThisDigit;
   1091         String++;
   1092     }
   1093 
   1094     /* All done, normal exit */
   1095 
   1096 AllDone:
   1097 
   1098     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
   1099         ACPI_FORMAT_UINT64 (ReturnValue)));
   1100 
   1101     *RetInteger = ReturnValue;
   1102     return_ACPI_STATUS (AE_OK);
   1103 
   1104 
   1105 ErrorExit:
   1106     /* Base was set/validated above */
   1107 
   1108     if (Base == 10)
   1109     {
   1110         return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT);
   1111     }
   1112     else
   1113     {
   1114         return_ACPI_STATUS (AE_BAD_HEX_CONSTANT);
   1115     }
   1116 }
   1117 
   1118 
   1119 /*******************************************************************************
   1120  *
   1121  * FUNCTION:    AcpiUtCreateUpdateStateAndPush
   1122  *
   1123  * PARAMETERS:  Object          - Object to be added to the new state
   1124  *              Action          - Increment/Decrement
   1125  *              StateList       - List the state will be added to
   1126  *
   1127  * RETURN:      Status
   1128  *
   1129  * DESCRIPTION: Create a new state and push it
   1130  *
   1131  ******************************************************************************/
   1132 
   1133 ACPI_STATUS
   1134 AcpiUtCreateUpdateStateAndPush (
   1135     ACPI_OPERAND_OBJECT     *Object,
   1136     UINT16                  Action,
   1137     ACPI_GENERIC_STATE      **StateList)
   1138 {
   1139     ACPI_GENERIC_STATE       *State;
   1140 
   1141 
   1142     ACPI_FUNCTION_ENTRY ();
   1143 
   1144 
   1145     /* Ignore null objects; these are expected */
   1146 
   1147     if (!Object)
   1148     {
   1149         return (AE_OK);
   1150     }
   1151 
   1152     State = AcpiUtCreateUpdateState (Object, Action);
   1153     if (!State)
   1154     {
   1155         return (AE_NO_MEMORY);
   1156     }
   1157 
   1158     AcpiUtPushGenericState (StateList, State);
   1159     return (AE_OK);
   1160 }
   1161 
   1162 
   1163 /*******************************************************************************
   1164  *
   1165  * FUNCTION:    AcpiUtWalkPackageTree
   1166  *
   1167  * PARAMETERS:  SourceObject        - The package to walk
   1168  *              TargetObject        - Target object (if package is being copied)
   1169  *              WalkCallback        - Called once for each package element
   1170  *              Context             - Passed to the callback function
   1171  *
   1172  * RETURN:      Status
   1173  *
   1174  * DESCRIPTION: Walk through a package
   1175  *
   1176  ******************************************************************************/
   1177 
   1178 ACPI_STATUS
   1179 AcpiUtWalkPackageTree (
   1180     ACPI_OPERAND_OBJECT     *SourceObject,
   1181     void                    *TargetObject,
   1182     ACPI_PKG_CALLBACK       WalkCallback,
   1183     void                    *Context)
   1184 {
   1185     ACPI_STATUS             Status = AE_OK;
   1186     ACPI_GENERIC_STATE      *StateList = NULL;
   1187     ACPI_GENERIC_STATE      *State;
   1188     UINT32                  ThisIndex;
   1189     ACPI_OPERAND_OBJECT     *ThisSourceObj;
   1190 
   1191 
   1192     ACPI_FUNCTION_TRACE (UtWalkPackageTree);
   1193 
   1194 
   1195     State = AcpiUtCreatePkgState (SourceObject, TargetObject, 0);
   1196     if (!State)
   1197     {
   1198         return_ACPI_STATUS (AE_NO_MEMORY);
   1199     }
   1200 
   1201     while (State)
   1202     {
   1203         /* Get one element of the package */
   1204 
   1205         ThisIndex     = State->Pkg.Index;
   1206         ThisSourceObj = (ACPI_OPERAND_OBJECT *)
   1207                         State->Pkg.SourceObject->Package.Elements[ThisIndex];
   1208 
   1209         /*
   1210          * Check for:
   1211          * 1) An uninitialized package element.  It is completely
   1212          *    legal to declare a package and leave it uninitialized
   1213          * 2) Not an internal object - can be a namespace node instead
   1214          * 3) Any type other than a package.  Packages are handled in else
   1215          *    case below.
   1216          */
   1217         if ((!ThisSourceObj) ||
   1218             (ACPI_GET_DESCRIPTOR_TYPE (ThisSourceObj) != ACPI_DESC_TYPE_OPERAND) ||
   1219             (ThisSourceObj->Common.Type != ACPI_TYPE_PACKAGE))
   1220         {
   1221             Status = WalkCallback (ACPI_COPY_TYPE_SIMPLE, ThisSourceObj,
   1222                                     State, Context);
   1223             if (ACPI_FAILURE (Status))
   1224             {
   1225                 return_ACPI_STATUS (Status);
   1226             }
   1227 
   1228             State->Pkg.Index++;
   1229             while (State->Pkg.Index >= State->Pkg.SourceObject->Package.Count)
   1230             {
   1231                 /*
   1232                  * We've handled all of the objects at this level,  This means
   1233                  * that we have just completed a package.  That package may
   1234                  * have contained one or more packages itself.
   1235                  *
   1236                  * Delete this state and pop the previous state (package).
   1237                  */
   1238                 AcpiUtDeleteGenericState (State);
   1239                 State = AcpiUtPopGenericState (&StateList);
   1240 
   1241                 /* Finished when there are no more states */
   1242 
   1243                 if (!State)
   1244                 {
   1245                     /*
   1246                      * We have handled all of the objects in the top level
   1247                      * package just add the length of the package objects
   1248                      * and exit
   1249                      */
   1250                     return_ACPI_STATUS (AE_OK);
   1251                 }
   1252 
   1253                 /*
   1254                  * Go back up a level and move the index past the just
   1255                  * completed package object.
   1256                  */
   1257                 State->Pkg.Index++;
   1258             }
   1259         }
   1260         else
   1261         {
   1262             /* This is a subobject of type package */
   1263 
   1264             Status = WalkCallback (ACPI_COPY_TYPE_PACKAGE, ThisSourceObj,
   1265                                         State, Context);
   1266             if (ACPI_FAILURE (Status))
   1267             {
   1268                 return_ACPI_STATUS (Status);
   1269             }
   1270 
   1271             /*
   1272              * Push the current state and create a new one
   1273              * The callback above returned a new target package object.
   1274              */
   1275             AcpiUtPushGenericState (&StateList, State);
   1276             State = AcpiUtCreatePkgState (ThisSourceObj,
   1277                                             State->Pkg.ThisTargetObj, 0);
   1278             if (!State)
   1279             {
   1280                 /* Free any stacked Update State objects */
   1281 
   1282                 while (StateList)
   1283                 {
   1284                     State = AcpiUtPopGenericState (&StateList);
   1285                     AcpiUtDeleteGenericState (State);
   1286                 }
   1287                 return_ACPI_STATUS (AE_NO_MEMORY);
   1288             }
   1289         }
   1290     }
   1291 
   1292     /* We should never get here */
   1293 
   1294     return_ACPI_STATUS (AE_AML_INTERNAL);
   1295 }
   1296 
   1297 
   1298 /*******************************************************************************
   1299  *
   1300  * FUNCTION:    AcpiError, AcpiException, AcpiWarning, AcpiInfo
   1301  *
   1302  * PARAMETERS:  ModuleName          - Caller's module name (for error output)
   1303  *              LineNumber          - Caller's line number (for error output)
   1304  *              Format              - Printf format string + additional args
   1305  *
   1306  * RETURN:      None
   1307  *
   1308  * DESCRIPTION: Print message with module/line/version info
   1309  *
   1310  ******************************************************************************/
   1311 
   1312 void  ACPI_INTERNAL_VAR_XFACE
   1313 AcpiError (
   1314     const char              *ModuleName,
   1315     UINT32                  LineNumber,
   1316     const char              *Format,
   1317     ...)
   1318 {
   1319     va_list                 args;
   1320 
   1321 
   1322     AcpiOsPrintf ("ACPI Error: ");
   1323 
   1324     va_start (args, Format);
   1325     AcpiOsVprintf (Format, args);
   1326     ACPI_COMMON_MSG_SUFFIX;
   1327     va_end (args);
   1328 }
   1329 
   1330 void  ACPI_INTERNAL_VAR_XFACE
   1331 AcpiException (
   1332     const char              *ModuleName,
   1333     UINT32                  LineNumber,
   1334     ACPI_STATUS             Status,
   1335     const char              *Format,
   1336     ...)
   1337 {
   1338     va_list                 args;
   1339 
   1340 
   1341     AcpiOsPrintf ("ACPI Exception: %s, ", AcpiFormatException (Status));
   1342 
   1343     va_start (args, Format);
   1344     AcpiOsVprintf (Format, args);
   1345     ACPI_COMMON_MSG_SUFFIX;
   1346     va_end (args);
   1347 }
   1348 
   1349 void  ACPI_INTERNAL_VAR_XFACE
   1350 AcpiWarning (
   1351     const char              *ModuleName,
   1352     UINT32                  LineNumber,
   1353     const char              *Format,
   1354     ...)
   1355 {
   1356     va_list                 args;
   1357 
   1358 
   1359     AcpiOsPrintf ("ACPI Warning: ");
   1360 
   1361     va_start (args, Format);
   1362     AcpiOsVprintf (Format, args);
   1363     ACPI_COMMON_MSG_SUFFIX;
   1364     va_end (args);
   1365 }
   1366 
   1367 void  ACPI_INTERNAL_VAR_XFACE
   1368 AcpiInfo (
   1369     const char              *ModuleName,
   1370     UINT32                  LineNumber,
   1371     const char              *Format,
   1372     ...)
   1373 {
   1374     va_list                 args;
   1375 
   1376 
   1377     AcpiOsPrintf ("ACPI: ");
   1378 
   1379     va_start (args, Format);
   1380     AcpiOsVprintf (Format, args);
   1381     AcpiOsPrintf ("\n");
   1382     va_end (args);
   1383 }
   1384 
   1385 ACPI_EXPORT_SYMBOL (AcpiError)
   1386 ACPI_EXPORT_SYMBOL (AcpiException)
   1387 ACPI_EXPORT_SYMBOL (AcpiWarning)
   1388 ACPI_EXPORT_SYMBOL (AcpiInfo)
   1389 
   1390 
   1391 /*******************************************************************************
   1392  *
   1393  * FUNCTION:    AcpiUtPredefinedWarning
   1394  *
   1395  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
   1396  *              LineNumber      - Caller's line number (for error output)
   1397  *              Pathname        - Full pathname to the node
   1398  *              NodeFlags       - From Namespace node for the method/object
   1399  *              Format          - Printf format string + additional args
   1400  *
   1401  * RETURN:      None
   1402  *
   1403  * DESCRIPTION: Warnings for the predefined validation module. Messages are
   1404  *              only emitted the first time a problem with a particular
   1405  *              method/object is detected. This prevents a flood of error
   1406  *              messages for methods that are repeatedly evaluated.
   1407  *
   1408  ******************************************************************************/
   1409 
   1410 void  ACPI_INTERNAL_VAR_XFACE
   1411 AcpiUtPredefinedWarning (
   1412     const char              *ModuleName,
   1413     UINT32                  LineNumber,
   1414     char                    *Pathname,
   1415     UINT8                   NodeFlags,
   1416     const char              *Format,
   1417     ...)
   1418 {
   1419     va_list                 args;
   1420 
   1421 
   1422     /*
   1423      * Warning messages for this method/object will be disabled after the
   1424      * first time a validation fails or an object is successfully repaired.
   1425      */
   1426     if (NodeFlags & ANOBJ_EVALUATED)
   1427     {
   1428         return;
   1429     }
   1430 
   1431     AcpiOsPrintf ("ACPI Warning for %s: ", Pathname);
   1432 
   1433     va_start (args, Format);
   1434     AcpiOsVprintf (Format, args);
   1435     ACPI_COMMON_MSG_SUFFIX;
   1436     va_end (args);
   1437 }
   1438 
   1439 /*******************************************************************************
   1440  *
   1441  * FUNCTION:    AcpiUtPredefinedInfo
   1442  *
   1443  * PARAMETERS:  ModuleName      - Caller's module name (for error output)
   1444  *              LineNumber      - Caller's line number (for error output)
   1445  *              Pathname        - Full pathname to the node
   1446  *              NodeFlags       - From Namespace node for the method/object
   1447  *              Format          - Printf format string + additional args
   1448  *
   1449  * RETURN:      None
   1450  *
   1451  * DESCRIPTION: Info messages for the predefined validation module. Messages
   1452  *              are only emitted the first time a problem with a particular
   1453  *              method/object is detected. This prevents a flood of
   1454  *              messages for methods that are repeatedly evaluated.
   1455  *
   1456  ******************************************************************************/
   1457 
   1458 void  ACPI_INTERNAL_VAR_XFACE
   1459 AcpiUtPredefinedInfo (
   1460     const char              *ModuleName,
   1461     UINT32                  LineNumber,
   1462     char                    *Pathname,
   1463     UINT8                   NodeFlags,
   1464     const char              *Format,
   1465     ...)
   1466 {
   1467     va_list                 args;
   1468 
   1469 
   1470     /*
   1471      * Warning messages for this method/object will be disabled after the
   1472      * first time a validation fails or an object is successfully repaired.
   1473      */
   1474     if (NodeFlags & ANOBJ_EVALUATED)
   1475     {
   1476         return;
   1477     }
   1478 
   1479     AcpiOsPrintf ("ACPI Info for %s: ", Pathname);
   1480 
   1481     va_start (args, Format);
   1482     AcpiOsVprintf (Format, args);
   1483     ACPI_COMMON_MSG_SUFFIX;
   1484     va_end (args);
   1485 }
   1486