Subversion Repositories Kolibri OS

Rev

Rev 1498 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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 - 2011, 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.