Home | History | Annotate | Line # | Download | only in debugger
dbfileio.c revision 1.1.1.1
      1 /*******************************************************************************
      2  *
      3  * Module Name: dbfileio - Debugger file I/O commands. These can't usually
      4  *              be used when running the debugger in Ring 0 (Kernel mode)
      5  *
      6  ******************************************************************************/
      7 
      8 /******************************************************************************
      9  *
     10  * 1. Copyright Notice
     11  *
     12  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
     13  * All rights reserved.
     14  *
     15  * 2. License
     16  *
     17  * 2.1. This is your license from Intel Corp. under its intellectual property
     18  * rights.  You may have additional license terms from the party that provided
     19  * you this software, covering your right to use that party's intellectual
     20  * property rights.
     21  *
     22  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     23  * copy of the source code appearing in this file ("Covered Code") an
     24  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     25  * base code distributed originally by Intel ("Original Intel Code") to copy,
     26  * make derivatives, distribute, use and display any portion of the Covered
     27  * Code in any form, with the right to sublicense such rights; and
     28  *
     29  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     30  * license (with the right to sublicense), under only those claims of Intel
     31  * patents that are infringed by the Original Intel Code, to make, use, sell,
     32  * offer to sell, and import the Covered Code and derivative works thereof
     33  * solely to the minimum extent necessary to exercise the above copyright
     34  * license, and in no event shall the patent license extend to any additions
     35  * to or modifications of the Original Intel Code.  No other license or right
     36  * is granted directly or by implication, estoppel or otherwise;
     37  *
     38  * The above copyright and patent license is granted only if the following
     39  * conditions are met:
     40  *
     41  * 3. Conditions
     42  *
     43  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     44  * Redistribution of source code of any substantial portion of the Covered
     45  * Code or modification with rights to further distribute source must include
     46  * the above Copyright Notice, the above License, this list of Conditions,
     47  * and the following Disclaimer and Export Compliance provision.  In addition,
     48  * Licensee must cause all Covered Code to which Licensee contributes to
     49  * contain a file documenting the changes Licensee made to create that Covered
     50  * Code and the date of any change.  Licensee must include in that file the
     51  * documentation of any changes made by any predecessor Licensee.  Licensee
     52  * must include a prominent statement that the modification is derived,
     53  * directly or indirectly, from Original Intel Code.
     54  *
     55  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     56  * Redistribution of source code of any substantial portion of the Covered
     57  * Code or modification without rights to further distribute source must
     58  * include the following Disclaimer and Export Compliance provision in the
     59  * documentation and/or other materials provided with distribution.  In
     60  * addition, Licensee may not authorize further sublicense of source of any
     61  * portion of the Covered Code, and must include terms to the effect that the
     62  * license from Licensee to its licensee is limited to the intellectual
     63  * property embodied in the software Licensee provides to its licensee, and
     64  * not to intellectual property embodied in modifications its licensee may
     65  * make.
     66  *
     67  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     68  * substantial portion of the Covered Code or modification must reproduce the
     69  * above Copyright Notice, and the following Disclaimer and Export Compliance
     70  * provision in the documentation and/or other materials provided with the
     71  * distribution.
     72  *
     73  * 3.4. Intel retains all right, title, and interest in and to the Original
     74  * Intel Code.
     75  *
     76  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     77  * Intel shall be used in advertising or otherwise to promote the sale, use or
     78  * other dealings in products derived from or relating to the Covered Code
     79  * without prior written authorization from Intel.
     80  *
     81  * 4. Disclaimer and Export Compliance
     82  *
     83  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     84  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     85  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
     86  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
     87  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
     88  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     89  * PARTICULAR PURPOSE.
     90  *
     91  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     92  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     93  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     94  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     95  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     96  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
     97  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     98  * LIMITED REMEDY.
     99  *
    100  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    101  * software or system incorporating such software without first obtaining any
    102  * required license or other approval from the U. S. Department of Commerce or
    103  * any other agency or department of the United States Government.  In the
    104  * event Licensee exports any such software from the United States or
    105  * re-exports any such software from a foreign destination, Licensee shall
    106  * ensure that the distribution and export/re-export of the software is in
    107  * compliance with all laws, regulations, orders, or other restrictions of the
    108  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    109  * any of its subsidiaries will export/re-export any technical data, process,
    110  * software, or service, directly or indirectly, to any country for which the
    111  * United States government or any agency thereof requires an export license,
    112  * other governmental approval, or letter of assurance, without first obtaining
    113  * such license, approval or letter.
    114  *
    115  *****************************************************************************/
    116 
    117 
    118 #include "acpi.h"
    119 #include "accommon.h"
    120 #include "acdebug.h"
    121 
    122 #ifdef ACPI_APPLICATION
    123 #include "actables.h"
    124 #endif
    125 
    126 #if (defined ACPI_DEBUGGER || defined ACPI_DISASSEMBLER)
    127 
    128 #define _COMPONENT          ACPI_CA_DEBUGGER
    129         ACPI_MODULE_NAME    ("dbfileio")
    130 
    131 /*
    132  * NOTE: this is here for lack of a better place. It is used in all
    133  * flavors of the debugger, need LCD file
    134  */
    135 #ifdef ACPI_APPLICATION
    136 #include <stdio.h>
    137 FILE                        *AcpiGbl_DebugFile = NULL;
    138 #endif
    139 
    140 
    141 #ifdef ACPI_DEBUGGER
    142 
    143 /* Local prototypes */
    144 
    145 #ifdef ACPI_APPLICATION
    146 
    147 static ACPI_STATUS
    148 AcpiDbCheckTextModeCorruption (
    149     UINT8                   *Table,
    150     UINT32                  TableLength,
    151     UINT32                  FileLength);
    152 
    153 #endif
    154 
    155 /*******************************************************************************
    156  *
    157  * FUNCTION:    AcpiDbCloseDebugFile
    158  *
    159  * PARAMETERS:  None
    160  *
    161  * RETURN:      None
    162  *
    163  * DESCRIPTION: If open, close the current debug output file
    164  *
    165  ******************************************************************************/
    166 
    167 void
    168 AcpiDbCloseDebugFile (
    169     void)
    170 {
    171 
    172 #ifdef ACPI_APPLICATION
    173 
    174     if (AcpiGbl_DebugFile)
    175     {
    176        fclose (AcpiGbl_DebugFile);
    177        AcpiGbl_DebugFile = NULL;
    178        AcpiGbl_DbOutputToFile = FALSE;
    179        AcpiOsPrintf ("Debug output file %s closed\n", AcpiGbl_DbDebugFilename);
    180     }
    181 #endif
    182 }
    183 
    184 
    185 /*******************************************************************************
    186  *
    187  * FUNCTION:    AcpiDbOpenDebugFile
    188  *
    189  * PARAMETERS:  Name                - Filename to open
    190  *
    191  * RETURN:      None
    192  *
    193  * DESCRIPTION: Open a file where debug output will be directed.
    194  *
    195  ******************************************************************************/
    196 
    197 void
    198 AcpiDbOpenDebugFile (
    199     char                    *Name)
    200 {
    201 
    202 #ifdef ACPI_APPLICATION
    203 
    204     AcpiDbCloseDebugFile ();
    205     AcpiGbl_DebugFile = fopen (Name, "w+");
    206     if (AcpiGbl_DebugFile)
    207     {
    208         AcpiOsPrintf ("Debug output file %s opened\n", Name);
    209         ACPI_STRCPY (AcpiGbl_DbDebugFilename, Name);
    210         AcpiGbl_DbOutputToFile = TRUE;
    211     }
    212     else
    213     {
    214         AcpiOsPrintf ("Could not open debug file %s\n", Name);
    215     }
    216 
    217 #endif
    218 }
    219 #endif
    220 
    221 
    222 #ifdef ACPI_APPLICATION
    223 /*******************************************************************************
    224  *
    225  * FUNCTION:    AcpiDbCheckTextModeCorruption
    226  *
    227  * PARAMETERS:  Table           - Table buffer
    228  *              TableLength     - Length of table from the table header
    229  *              FileLength      - Length of the file that contains the table
    230  *
    231  * RETURN:      Status
    232  *
    233  * DESCRIPTION: Check table for text mode file corruption where all linefeed
    234  *              characters (LF) have been replaced by carriage return linefeed
    235  *              pairs (CR/LF).
    236  *
    237  ******************************************************************************/
    238 
    239 static ACPI_STATUS
    240 AcpiDbCheckTextModeCorruption (
    241     UINT8                   *Table,
    242     UINT32                  TableLength,
    243     UINT32                  FileLength)
    244 {
    245     UINT32                  i;
    246     UINT32                  Pairs = 0;
    247 
    248 
    249     if (TableLength != FileLength)
    250     {
    251         ACPI_WARNING ((AE_INFO,
    252             "File length (0x%X) is not the same as the table length (0x%X)",
    253             FileLength, TableLength));
    254     }
    255 
    256     /* Scan entire table to determine if each LF has been prefixed with a CR */
    257 
    258     for (i = 1; i < FileLength; i++)
    259     {
    260         if (Table[i] == 0x0A)
    261         {
    262             if (Table[i - 1] != 0x0D)
    263             {
    264                 /* The LF does not have a preceding CR, table not corrupted */
    265 
    266                 return (AE_OK);
    267             }
    268             else
    269             {
    270                 /* Found a CR/LF pair */
    271 
    272                 Pairs++;
    273             }
    274             i++;
    275         }
    276     }
    277 
    278     if (!Pairs)
    279     {
    280         return (AE_OK);
    281     }
    282 
    283     /*
    284      * Entire table scanned, each CR is part of a CR/LF pair --
    285      * meaning that the table was treated as a text file somewhere.
    286      *
    287      * NOTE: We can't "fix" the table, because any existing CR/LF pairs in the
    288      * original table are left untouched by the text conversion process --
    289      * meaning that we cannot simply replace CR/LF pairs with LFs.
    290      */
    291     AcpiOsPrintf ("Table has been corrupted by text mode conversion\n");
    292     AcpiOsPrintf ("All LFs (%u) were changed to CR/LF pairs\n", Pairs);
    293     AcpiOsPrintf ("Table cannot be repaired!\n");
    294     return (AE_BAD_VALUE);
    295 }
    296 
    297 
    298 /*******************************************************************************
    299  *
    300  * FUNCTION:    AcpiDbReadTable
    301  *
    302  * PARAMETERS:  fp              - File that contains table
    303  *              Table           - Return value, buffer with table
    304  *              TableLength     - Return value, length of table
    305  *
    306  * RETURN:      Status
    307  *
    308  * DESCRIPTION: Load the DSDT from the file pointer
    309  *
    310  ******************************************************************************/
    311 
    312 static ACPI_STATUS
    313 AcpiDbReadTable (
    314     FILE                    *fp,
    315     ACPI_TABLE_HEADER       **Table,
    316     UINT32                  *TableLength)
    317 {
    318     ACPI_TABLE_HEADER       TableHeader;
    319     UINT32                  Actual;
    320     ACPI_STATUS             Status;
    321     UINT32                  FileSize;
    322     BOOLEAN                 StandardHeader = TRUE;
    323 
    324 
    325     /* Get the file size */
    326 
    327     fseek (fp, 0, SEEK_END);
    328     FileSize = (UINT32) ftell (fp);
    329     fseek (fp, 0, SEEK_SET);
    330 
    331     if (FileSize < 4)
    332     {
    333         return (AE_BAD_HEADER);
    334     }
    335 
    336     /* Read the signature */
    337 
    338     if (fread (&TableHeader, 1, 4, fp) != 4)
    339     {
    340         AcpiOsPrintf ("Could not read the table signature\n");
    341         return (AE_BAD_HEADER);
    342     }
    343 
    344     fseek (fp, 0, SEEK_SET);
    345 
    346     /* The RSDT and FACS tables do not have standard ACPI headers */
    347 
    348     if (ACPI_COMPARE_NAME (TableHeader.Signature, "RSD ") ||
    349         ACPI_COMPARE_NAME (TableHeader.Signature, "FACS"))
    350     {
    351         *TableLength = FileSize;
    352         StandardHeader = FALSE;
    353     }
    354     else
    355     {
    356         /* Read the table header */
    357 
    358         if (fread (&TableHeader, 1, sizeof (TableHeader), fp) !=
    359                 sizeof (ACPI_TABLE_HEADER))
    360         {
    361             AcpiOsPrintf ("Could not read the table header\n");
    362             return (AE_BAD_HEADER);
    363         }
    364 
    365 #if 0
    366         /* Validate the table header/length */
    367 
    368         Status = AcpiTbValidateTableHeader (&TableHeader);
    369         if (ACPI_FAILURE (Status))
    370         {
    371             AcpiOsPrintf ("Table header is invalid!\n");
    372             return (Status);
    373         }
    374 #endif
    375 
    376         /* File size must be at least as long as the Header-specified length */
    377 
    378         if (TableHeader.Length > FileSize)
    379         {
    380             AcpiOsPrintf (
    381                 "TableHeader length [0x%X] greater than the input file size [0x%X]\n",
    382                 TableHeader.Length, FileSize);
    383             return (AE_BAD_HEADER);
    384         }
    385 
    386 #ifdef ACPI_OBSOLETE_CODE
    387         /* We only support a limited number of table types */
    388 
    389         if (ACPI_STRNCMP ((char *) TableHeader.Signature, DSDT_SIG, 4) &&
    390             ACPI_STRNCMP ((char *) TableHeader.Signature, PSDT_SIG, 4) &&
    391             ACPI_STRNCMP ((char *) TableHeader.Signature, SSDT_SIG, 4))
    392         {
    393             AcpiOsPrintf ("Table signature [%4.4s] is invalid or not supported\n",
    394                 (char *) TableHeader.Signature);
    395             ACPI_DUMP_BUFFER (&TableHeader, sizeof (ACPI_TABLE_HEADER));
    396             return (AE_ERROR);
    397         }
    398 #endif
    399 
    400         *TableLength = TableHeader.Length;
    401     }
    402 
    403     /* Allocate a buffer for the table */
    404 
    405     *Table = AcpiOsAllocate ((size_t) FileSize);
    406     if (!*Table)
    407     {
    408         AcpiOsPrintf (
    409             "Could not allocate memory for ACPI table %4.4s (size=0x%X)\n",
    410             TableHeader.Signature, *TableLength);
    411         return (AE_NO_MEMORY);
    412     }
    413 
    414     /* Get the rest of the table */
    415 
    416     fseek (fp, 0, SEEK_SET);
    417     Actual = fread (*Table, 1, (size_t) FileSize, fp);
    418     if (Actual == FileSize)
    419     {
    420         if (StandardHeader)
    421         {
    422             /* Now validate the checksum */
    423 
    424             Status = AcpiTbVerifyChecksum ((void *) *Table,
    425                         ACPI_CAST_PTR (ACPI_TABLE_HEADER, *Table)->Length);
    426 
    427             if (Status == AE_BAD_CHECKSUM)
    428             {
    429                 Status = AcpiDbCheckTextModeCorruption ((UINT8 *) *Table,
    430                             FileSize, (*Table)->Length);
    431                 return (Status);
    432             }
    433         }
    434         return (AE_OK);
    435     }
    436 
    437     if (Actual > 0)
    438     {
    439         AcpiOsPrintf ("Warning - reading table, asked for %X got %X\n",
    440             FileSize, Actual);
    441         return (AE_OK);
    442     }
    443 
    444     AcpiOsPrintf ("Error - could not read the table file\n");
    445     AcpiOsFree (*Table);
    446     *Table = NULL;
    447     *TableLength = 0;
    448 
    449     return (AE_ERROR);
    450 }
    451 
    452 
    453 /*******************************************************************************
    454  *
    455  * FUNCTION:    AeLocalLoadTable
    456  *
    457  * PARAMETERS:  Table           - pointer to a buffer containing the entire
    458  *                                table to be loaded
    459  *
    460  * RETURN:      Status
    461  *
    462  * DESCRIPTION: This function is called to load a table from the caller's
    463  *              buffer. The buffer must contain an entire ACPI Table including
    464  *              a valid header. The header fields will be verified, and if it
    465  *              is determined that the table is invalid, the call will fail.
    466  *
    467  ******************************************************************************/
    468 
    469 static ACPI_STATUS
    470 AeLocalLoadTable (
    471     ACPI_TABLE_HEADER       *Table)
    472 {
    473     ACPI_STATUS             Status = AE_OK;
    474 /*    ACPI_TABLE_DESC         TableInfo; */
    475 
    476 
    477     ACPI_FUNCTION_TRACE (AeLocalLoadTable);
    478 #if 0
    479 
    480 
    481     if (!Table)
    482     {
    483         return_ACPI_STATUS (AE_BAD_PARAMETER);
    484     }
    485 
    486     TableInfo.Pointer = Table;
    487     Status = AcpiTbRecognizeTable (&TableInfo, ACPI_TABLE_ALL);
    488     if (ACPI_FAILURE (Status))
    489     {
    490         return_ACPI_STATUS (Status);
    491     }
    492 
    493     /* Install the new table into the local data structures */
    494 
    495     Status = AcpiTbInstallTable (&TableInfo);
    496     if (ACPI_FAILURE (Status))
    497     {
    498         if (Status == AE_ALREADY_EXISTS)
    499         {
    500             /* Table already exists, no error */
    501 
    502             Status = AE_OK;
    503         }
    504 
    505         /* Free table allocated by AcpiTbGetTable */
    506 
    507         AcpiTbDeleteSingleTable (&TableInfo);
    508         return_ACPI_STATUS (Status);
    509     }
    510 
    511 #if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))
    512 
    513     Status = AcpiNsLoadTable (TableInfo.InstalledDesc, AcpiGbl_RootNode);
    514     if (ACPI_FAILURE (Status))
    515     {
    516         /* Uninstall table and free the buffer */
    517 
    518         AcpiTbDeleteTablesByType (ACPI_TABLE_ID_DSDT);
    519         return_ACPI_STATUS (Status);
    520     }
    521 #endif
    522 #endif
    523 
    524     return_ACPI_STATUS (Status);
    525 }
    526 
    527 
    528 /*******************************************************************************
    529  *
    530  * FUNCTION:    AcpiDbReadTableFromFile
    531  *
    532  * PARAMETERS:  Filename         - File where table is located
    533  *              Table            - Where a pointer to the table is returned
    534  *
    535  * RETURN:      Status
    536  *
    537  * DESCRIPTION: Get an ACPI table from a file
    538  *
    539  ******************************************************************************/
    540 
    541 ACPI_STATUS
    542 AcpiDbReadTableFromFile (
    543     char                    *Filename,
    544     ACPI_TABLE_HEADER       **Table)
    545 {
    546     FILE                    *fp;
    547     UINT32                  TableLength;
    548     ACPI_STATUS             Status;
    549 
    550 
    551     /* Open the file */
    552 
    553     fp = fopen (Filename, "rb");
    554     if (!fp)
    555     {
    556         AcpiOsPrintf ("Could not open input file %s\n", Filename);
    557         return (AE_ERROR);
    558     }
    559 
    560     /* Get the entire file */
    561 
    562     fprintf (stderr, "Loading Acpi table from file %s\n", Filename);
    563     Status = AcpiDbReadTable (fp, Table, &TableLength);
    564     fclose(fp);
    565 
    566     if (ACPI_FAILURE (Status))
    567     {
    568         AcpiOsPrintf ("Could not get table from the file\n");
    569         return (Status);
    570     }
    571 
    572     return (AE_OK);
    573  }
    574 #endif
    575 
    576 
    577 /*******************************************************************************
    578  *
    579  * FUNCTION:    AcpiDbGetTableFromFile
    580  *
    581  * PARAMETERS:  Filename        - File where table is located
    582  *              ReturnTable     - Where a pointer to the table is returned
    583  *
    584  * RETURN:      Status
    585  *
    586  * DESCRIPTION: Load an ACPI table from a file
    587  *
    588  ******************************************************************************/
    589 
    590 ACPI_STATUS
    591 AcpiDbGetTableFromFile (
    592     char                    *Filename,
    593     ACPI_TABLE_HEADER       **ReturnTable)
    594 {
    595 #ifdef ACPI_APPLICATION
    596     ACPI_STATUS             Status;
    597     ACPI_TABLE_HEADER       *Table;
    598     BOOLEAN                 IsAmlTable = TRUE;
    599 
    600 
    601     Status = AcpiDbReadTableFromFile (Filename, &Table);
    602     if (ACPI_FAILURE (Status))
    603     {
    604         return (Status);
    605     }
    606 
    607 #ifdef ACPI_DATA_TABLE_DISASSEMBLY
    608     IsAmlTable = AcpiUtIsAmlTable (Table);
    609 #endif
    610 
    611     if (IsAmlTable)
    612     {
    613         /* Attempt to recognize and install the table */
    614 
    615         Status = AeLocalLoadTable (Table);
    616         if (ACPI_FAILURE (Status))
    617         {
    618             if (Status == AE_ALREADY_EXISTS)
    619             {
    620                 AcpiOsPrintf ("Table %4.4s is already installed\n",
    621                     Table->Signature);
    622             }
    623             else
    624             {
    625                 AcpiOsPrintf ("Could not install table, %s\n",
    626                     AcpiFormatException (Status));
    627             }
    628 
    629             return (Status);
    630         }
    631 
    632         fprintf (stderr,
    633             "Acpi table [%4.4s] successfully installed and loaded\n",
    634             Table->Signature);
    635     }
    636 
    637     AcpiGbl_AcpiHardwarePresent = FALSE;
    638     if (ReturnTable)
    639     {
    640         *ReturnTable = Table;
    641     }
    642 
    643 
    644 #endif  /* ACPI_APPLICATION */
    645     return (AE_OK);
    646 }
    647 
    648 #endif  /* ACPI_DEBUGGER */
    649 
    650