xref: /freebsd/sys/contrib/dev/acpica/components/debugger/dbfileio.c (revision a159c266a93c3c4f229864954c5f963acd8f60f2)
1*a159c266SJung-uk Kim /*******************************************************************************
2*a159c266SJung-uk Kim  *
3*a159c266SJung-uk Kim  * Module Name: dbfileio - Debugger file I/O commands. These can't usually
4*a159c266SJung-uk Kim  *              be used when running the debugger in Ring 0 (Kernel mode)
5*a159c266SJung-uk Kim  *
6*a159c266SJung-uk Kim  ******************************************************************************/
7*a159c266SJung-uk Kim 
8*a159c266SJung-uk Kim /*
9*a159c266SJung-uk Kim  * Copyright (C) 2000 - 2012, Intel Corp.
10*a159c266SJung-uk Kim  * All rights reserved.
11*a159c266SJung-uk Kim  *
12*a159c266SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
13*a159c266SJung-uk Kim  * modification, are permitted provided that the following conditions
14*a159c266SJung-uk Kim  * are met:
15*a159c266SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
16*a159c266SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
17*a159c266SJung-uk Kim  *    without modification.
18*a159c266SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19*a159c266SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
20*a159c266SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
21*a159c266SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
22*a159c266SJung-uk Kim  *    binary redistribution.
23*a159c266SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
24*a159c266SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
25*a159c266SJung-uk Kim  *    from this software without specific prior written permission.
26*a159c266SJung-uk Kim  *
27*a159c266SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
28*a159c266SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
29*a159c266SJung-uk Kim  * Software Foundation.
30*a159c266SJung-uk Kim  *
31*a159c266SJung-uk Kim  * NO WARRANTY
32*a159c266SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33*a159c266SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34*a159c266SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35*a159c266SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36*a159c266SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37*a159c266SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38*a159c266SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39*a159c266SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40*a159c266SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41*a159c266SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42*a159c266SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
43*a159c266SJung-uk Kim  */
44*a159c266SJung-uk Kim 
45*a159c266SJung-uk Kim 
46*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h>
49*a159c266SJung-uk Kim 
50*a159c266SJung-uk Kim #ifdef ACPI_APPLICATION
51*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/actables.h>
52*a159c266SJung-uk Kim #endif
53*a159c266SJung-uk Kim 
54*a159c266SJung-uk Kim #if (defined ACPI_DEBUGGER || defined ACPI_DISASSEMBLER)
55*a159c266SJung-uk Kim 
56*a159c266SJung-uk Kim #define _COMPONENT          ACPI_CA_DEBUGGER
57*a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("dbfileio")
58*a159c266SJung-uk Kim 
59*a159c266SJung-uk Kim /*
60*a159c266SJung-uk Kim  * NOTE: this is here for lack of a better place. It is used in all
61*a159c266SJung-uk Kim  * flavors of the debugger, need LCD file
62*a159c266SJung-uk Kim  */
63*a159c266SJung-uk Kim #ifdef ACPI_APPLICATION
64*a159c266SJung-uk Kim #include <stdio.h>
65*a159c266SJung-uk Kim FILE                        *AcpiGbl_DebugFile = NULL;
66*a159c266SJung-uk Kim #endif
67*a159c266SJung-uk Kim 
68*a159c266SJung-uk Kim 
69*a159c266SJung-uk Kim #ifdef ACPI_DEBUGGER
70*a159c266SJung-uk Kim 
71*a159c266SJung-uk Kim /* Local prototypes */
72*a159c266SJung-uk Kim 
73*a159c266SJung-uk Kim #ifdef ACPI_APPLICATION
74*a159c266SJung-uk Kim 
75*a159c266SJung-uk Kim static ACPI_STATUS
76*a159c266SJung-uk Kim AcpiDbCheckTextModeCorruption (
77*a159c266SJung-uk Kim     UINT8                   *Table,
78*a159c266SJung-uk Kim     UINT32                  TableLength,
79*a159c266SJung-uk Kim     UINT32                  FileLength);
80*a159c266SJung-uk Kim 
81*a159c266SJung-uk Kim #endif
82*a159c266SJung-uk Kim 
83*a159c266SJung-uk Kim /*******************************************************************************
84*a159c266SJung-uk Kim  *
85*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbCloseDebugFile
86*a159c266SJung-uk Kim  *
87*a159c266SJung-uk Kim  * PARAMETERS:  None
88*a159c266SJung-uk Kim  *
89*a159c266SJung-uk Kim  * RETURN:      None
90*a159c266SJung-uk Kim  *
91*a159c266SJung-uk Kim  * DESCRIPTION: If open, close the current debug output file
92*a159c266SJung-uk Kim  *
93*a159c266SJung-uk Kim  ******************************************************************************/
94*a159c266SJung-uk Kim 
95*a159c266SJung-uk Kim void
96*a159c266SJung-uk Kim AcpiDbCloseDebugFile (
97*a159c266SJung-uk Kim     void)
98*a159c266SJung-uk Kim {
99*a159c266SJung-uk Kim 
100*a159c266SJung-uk Kim #ifdef ACPI_APPLICATION
101*a159c266SJung-uk Kim 
102*a159c266SJung-uk Kim     if (AcpiGbl_DebugFile)
103*a159c266SJung-uk Kim     {
104*a159c266SJung-uk Kim        fclose (AcpiGbl_DebugFile);
105*a159c266SJung-uk Kim        AcpiGbl_DebugFile = NULL;
106*a159c266SJung-uk Kim        AcpiGbl_DbOutputToFile = FALSE;
107*a159c266SJung-uk Kim        AcpiOsPrintf ("Debug output file %s closed\n", AcpiGbl_DbDebugFilename);
108*a159c266SJung-uk Kim     }
109*a159c266SJung-uk Kim #endif
110*a159c266SJung-uk Kim }
111*a159c266SJung-uk Kim 
112*a159c266SJung-uk Kim 
113*a159c266SJung-uk Kim /*******************************************************************************
114*a159c266SJung-uk Kim  *
115*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbOpenDebugFile
116*a159c266SJung-uk Kim  *
117*a159c266SJung-uk Kim  * PARAMETERS:  Name                - Filename to open
118*a159c266SJung-uk Kim  *
119*a159c266SJung-uk Kim  * RETURN:      None
120*a159c266SJung-uk Kim  *
121*a159c266SJung-uk Kim  * DESCRIPTION: Open a file where debug output will be directed.
122*a159c266SJung-uk Kim  *
123*a159c266SJung-uk Kim  ******************************************************************************/
124*a159c266SJung-uk Kim 
125*a159c266SJung-uk Kim void
126*a159c266SJung-uk Kim AcpiDbOpenDebugFile (
127*a159c266SJung-uk Kim     char                    *Name)
128*a159c266SJung-uk Kim {
129*a159c266SJung-uk Kim 
130*a159c266SJung-uk Kim #ifdef ACPI_APPLICATION
131*a159c266SJung-uk Kim 
132*a159c266SJung-uk Kim     AcpiDbCloseDebugFile ();
133*a159c266SJung-uk Kim     AcpiGbl_DebugFile = fopen (Name, "w+");
134*a159c266SJung-uk Kim     if (AcpiGbl_DebugFile)
135*a159c266SJung-uk Kim     {
136*a159c266SJung-uk Kim         AcpiOsPrintf ("Debug output file %s opened\n", Name);
137*a159c266SJung-uk Kim         ACPI_STRCPY (AcpiGbl_DbDebugFilename, Name);
138*a159c266SJung-uk Kim         AcpiGbl_DbOutputToFile = TRUE;
139*a159c266SJung-uk Kim     }
140*a159c266SJung-uk Kim     else
141*a159c266SJung-uk Kim     {
142*a159c266SJung-uk Kim         AcpiOsPrintf ("Could not open debug file %s\n", Name);
143*a159c266SJung-uk Kim     }
144*a159c266SJung-uk Kim 
145*a159c266SJung-uk Kim #endif
146*a159c266SJung-uk Kim }
147*a159c266SJung-uk Kim #endif
148*a159c266SJung-uk Kim 
149*a159c266SJung-uk Kim 
150*a159c266SJung-uk Kim #ifdef ACPI_APPLICATION
151*a159c266SJung-uk Kim /*******************************************************************************
152*a159c266SJung-uk Kim  *
153*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbCheckTextModeCorruption
154*a159c266SJung-uk Kim  *
155*a159c266SJung-uk Kim  * PARAMETERS:  Table           - Table buffer
156*a159c266SJung-uk Kim  *              TableLength     - Length of table from the table header
157*a159c266SJung-uk Kim  *              FileLength      - Length of the file that contains the table
158*a159c266SJung-uk Kim  *
159*a159c266SJung-uk Kim  * RETURN:      Status
160*a159c266SJung-uk Kim  *
161*a159c266SJung-uk Kim  * DESCRIPTION: Check table for text mode file corruption where all linefeed
162*a159c266SJung-uk Kim  *              characters (LF) have been replaced by carriage return linefeed
163*a159c266SJung-uk Kim  *              pairs (CR/LF).
164*a159c266SJung-uk Kim  *
165*a159c266SJung-uk Kim  ******************************************************************************/
166*a159c266SJung-uk Kim 
167*a159c266SJung-uk Kim static ACPI_STATUS
168*a159c266SJung-uk Kim AcpiDbCheckTextModeCorruption (
169*a159c266SJung-uk Kim     UINT8                   *Table,
170*a159c266SJung-uk Kim     UINT32                  TableLength,
171*a159c266SJung-uk Kim     UINT32                  FileLength)
172*a159c266SJung-uk Kim {
173*a159c266SJung-uk Kim     UINT32                  i;
174*a159c266SJung-uk Kim     UINT32                  Pairs = 0;
175*a159c266SJung-uk Kim 
176*a159c266SJung-uk Kim 
177*a159c266SJung-uk Kim     if (TableLength != FileLength)
178*a159c266SJung-uk Kim     {
179*a159c266SJung-uk Kim         ACPI_WARNING ((AE_INFO,
180*a159c266SJung-uk Kim             "File length (0x%X) is not the same as the table length (0x%X)",
181*a159c266SJung-uk Kim             FileLength, TableLength));
182*a159c266SJung-uk Kim     }
183*a159c266SJung-uk Kim 
184*a159c266SJung-uk Kim     /* Scan entire table to determine if each LF has been prefixed with a CR */
185*a159c266SJung-uk Kim 
186*a159c266SJung-uk Kim     for (i = 1; i < FileLength; i++)
187*a159c266SJung-uk Kim     {
188*a159c266SJung-uk Kim         if (Table[i] == 0x0A)
189*a159c266SJung-uk Kim         {
190*a159c266SJung-uk Kim             if (Table[i - 1] != 0x0D)
191*a159c266SJung-uk Kim             {
192*a159c266SJung-uk Kim                 /* The LF does not have a preceding CR, table not corrupted */
193*a159c266SJung-uk Kim 
194*a159c266SJung-uk Kim                 return (AE_OK);
195*a159c266SJung-uk Kim             }
196*a159c266SJung-uk Kim             else
197*a159c266SJung-uk Kim             {
198*a159c266SJung-uk Kim                 /* Found a CR/LF pair */
199*a159c266SJung-uk Kim 
200*a159c266SJung-uk Kim                 Pairs++;
201*a159c266SJung-uk Kim             }
202*a159c266SJung-uk Kim             i++;
203*a159c266SJung-uk Kim         }
204*a159c266SJung-uk Kim     }
205*a159c266SJung-uk Kim 
206*a159c266SJung-uk Kim     if (!Pairs)
207*a159c266SJung-uk Kim     {
208*a159c266SJung-uk Kim         return (AE_OK);
209*a159c266SJung-uk Kim     }
210*a159c266SJung-uk Kim 
211*a159c266SJung-uk Kim     /*
212*a159c266SJung-uk Kim      * Entire table scanned, each CR is part of a CR/LF pair --
213*a159c266SJung-uk Kim      * meaning that the table was treated as a text file somewhere.
214*a159c266SJung-uk Kim      *
215*a159c266SJung-uk Kim      * NOTE: We can't "fix" the table, because any existing CR/LF pairs in the
216*a159c266SJung-uk Kim      * original table are left untouched by the text conversion process --
217*a159c266SJung-uk Kim      * meaning that we cannot simply replace CR/LF pairs with LFs.
218*a159c266SJung-uk Kim      */
219*a159c266SJung-uk Kim     AcpiOsPrintf ("Table has been corrupted by text mode conversion\n");
220*a159c266SJung-uk Kim     AcpiOsPrintf ("All LFs (%u) were changed to CR/LF pairs\n", Pairs);
221*a159c266SJung-uk Kim     AcpiOsPrintf ("Table cannot be repaired!\n");
222*a159c266SJung-uk Kim     return (AE_BAD_VALUE);
223*a159c266SJung-uk Kim }
224*a159c266SJung-uk Kim 
225*a159c266SJung-uk Kim 
226*a159c266SJung-uk Kim /*******************************************************************************
227*a159c266SJung-uk Kim  *
228*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbReadTable
229*a159c266SJung-uk Kim  *
230*a159c266SJung-uk Kim  * PARAMETERS:  fp              - File that contains table
231*a159c266SJung-uk Kim  *              Table           - Return value, buffer with table
232*a159c266SJung-uk Kim  *              TableLength     - Return value, length of table
233*a159c266SJung-uk Kim  *
234*a159c266SJung-uk Kim  * RETURN:      Status
235*a159c266SJung-uk Kim  *
236*a159c266SJung-uk Kim  * DESCRIPTION: Load the DSDT from the file pointer
237*a159c266SJung-uk Kim  *
238*a159c266SJung-uk Kim  ******************************************************************************/
239*a159c266SJung-uk Kim 
240*a159c266SJung-uk Kim static ACPI_STATUS
241*a159c266SJung-uk Kim AcpiDbReadTable (
242*a159c266SJung-uk Kim     FILE                    *fp,
243*a159c266SJung-uk Kim     ACPI_TABLE_HEADER       **Table,
244*a159c266SJung-uk Kim     UINT32                  *TableLength)
245*a159c266SJung-uk Kim {
246*a159c266SJung-uk Kim     ACPI_TABLE_HEADER       TableHeader;
247*a159c266SJung-uk Kim     UINT32                  Actual;
248*a159c266SJung-uk Kim     ACPI_STATUS             Status;
249*a159c266SJung-uk Kim     UINT32                  FileSize;
250*a159c266SJung-uk Kim     BOOLEAN                 StandardHeader = TRUE;
251*a159c266SJung-uk Kim 
252*a159c266SJung-uk Kim 
253*a159c266SJung-uk Kim     /* Get the file size */
254*a159c266SJung-uk Kim 
255*a159c266SJung-uk Kim     fseek (fp, 0, SEEK_END);
256*a159c266SJung-uk Kim     FileSize = (UINT32) ftell (fp);
257*a159c266SJung-uk Kim     fseek (fp, 0, SEEK_SET);
258*a159c266SJung-uk Kim 
259*a159c266SJung-uk Kim     if (FileSize < 4)
260*a159c266SJung-uk Kim     {
261*a159c266SJung-uk Kim         return (AE_BAD_HEADER);
262*a159c266SJung-uk Kim     }
263*a159c266SJung-uk Kim 
264*a159c266SJung-uk Kim     /* Read the signature */
265*a159c266SJung-uk Kim 
266*a159c266SJung-uk Kim     if (fread (&TableHeader, 1, 4, fp) != 4)
267*a159c266SJung-uk Kim     {
268*a159c266SJung-uk Kim         AcpiOsPrintf ("Could not read the table signature\n");
269*a159c266SJung-uk Kim         return (AE_BAD_HEADER);
270*a159c266SJung-uk Kim     }
271*a159c266SJung-uk Kim 
272*a159c266SJung-uk Kim     fseek (fp, 0, SEEK_SET);
273*a159c266SJung-uk Kim 
274*a159c266SJung-uk Kim     /* The RSDT, FACS and S3PT tables do not have standard ACPI headers */
275*a159c266SJung-uk Kim 
276*a159c266SJung-uk Kim     if (ACPI_COMPARE_NAME (TableHeader.Signature, "RSD ") ||
277*a159c266SJung-uk Kim         ACPI_COMPARE_NAME (TableHeader.Signature, "FACS") ||
278*a159c266SJung-uk Kim         ACPI_COMPARE_NAME (TableHeader.Signature, "S3PT"))
279*a159c266SJung-uk Kim     {
280*a159c266SJung-uk Kim         *TableLength = FileSize;
281*a159c266SJung-uk Kim         StandardHeader = FALSE;
282*a159c266SJung-uk Kim     }
283*a159c266SJung-uk Kim     else
284*a159c266SJung-uk Kim     {
285*a159c266SJung-uk Kim         /* Read the table header */
286*a159c266SJung-uk Kim 
287*a159c266SJung-uk Kim         if (fread (&TableHeader, 1, sizeof (TableHeader), fp) !=
288*a159c266SJung-uk Kim                 sizeof (ACPI_TABLE_HEADER))
289*a159c266SJung-uk Kim         {
290*a159c266SJung-uk Kim             AcpiOsPrintf ("Could not read the table header\n");
291*a159c266SJung-uk Kim             return (AE_BAD_HEADER);
292*a159c266SJung-uk Kim         }
293*a159c266SJung-uk Kim 
294*a159c266SJung-uk Kim #if 0
295*a159c266SJung-uk Kim         /* Validate the table header/length */
296*a159c266SJung-uk Kim 
297*a159c266SJung-uk Kim         Status = AcpiTbValidateTableHeader (&TableHeader);
298*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
299*a159c266SJung-uk Kim         {
300*a159c266SJung-uk Kim             AcpiOsPrintf ("Table header is invalid!\n");
301*a159c266SJung-uk Kim             return (Status);
302*a159c266SJung-uk Kim         }
303*a159c266SJung-uk Kim #endif
304*a159c266SJung-uk Kim 
305*a159c266SJung-uk Kim         /* File size must be at least as long as the Header-specified length */
306*a159c266SJung-uk Kim 
307*a159c266SJung-uk Kim         if (TableHeader.Length > FileSize)
308*a159c266SJung-uk Kim         {
309*a159c266SJung-uk Kim             AcpiOsPrintf (
310*a159c266SJung-uk Kim                 "TableHeader length [0x%X] greater than the input file size [0x%X]\n",
311*a159c266SJung-uk Kim                 TableHeader.Length, FileSize);
312*a159c266SJung-uk Kim             return (AE_BAD_HEADER);
313*a159c266SJung-uk Kim         }
314*a159c266SJung-uk Kim 
315*a159c266SJung-uk Kim #ifdef ACPI_OBSOLETE_CODE
316*a159c266SJung-uk Kim         /* We only support a limited number of table types */
317*a159c266SJung-uk Kim 
318*a159c266SJung-uk Kim         if (ACPI_STRNCMP ((char *) TableHeader.Signature, DSDT_SIG, 4) &&
319*a159c266SJung-uk Kim             ACPI_STRNCMP ((char *) TableHeader.Signature, PSDT_SIG, 4) &&
320*a159c266SJung-uk Kim             ACPI_STRNCMP ((char *) TableHeader.Signature, SSDT_SIG, 4))
321*a159c266SJung-uk Kim         {
322*a159c266SJung-uk Kim             AcpiOsPrintf ("Table signature [%4.4s] is invalid or not supported\n",
323*a159c266SJung-uk Kim                 (char *) TableHeader.Signature);
324*a159c266SJung-uk Kim             ACPI_DUMP_BUFFER (&TableHeader, sizeof (ACPI_TABLE_HEADER));
325*a159c266SJung-uk Kim             return (AE_ERROR);
326*a159c266SJung-uk Kim         }
327*a159c266SJung-uk Kim #endif
328*a159c266SJung-uk Kim 
329*a159c266SJung-uk Kim         *TableLength = TableHeader.Length;
330*a159c266SJung-uk Kim     }
331*a159c266SJung-uk Kim 
332*a159c266SJung-uk Kim     /* Allocate a buffer for the table */
333*a159c266SJung-uk Kim 
334*a159c266SJung-uk Kim     *Table = AcpiOsAllocate ((size_t) FileSize);
335*a159c266SJung-uk Kim     if (!*Table)
336*a159c266SJung-uk Kim     {
337*a159c266SJung-uk Kim         AcpiOsPrintf (
338*a159c266SJung-uk Kim             "Could not allocate memory for ACPI table %4.4s (size=0x%X)\n",
339*a159c266SJung-uk Kim             TableHeader.Signature, *TableLength);
340*a159c266SJung-uk Kim         return (AE_NO_MEMORY);
341*a159c266SJung-uk Kim     }
342*a159c266SJung-uk Kim 
343*a159c266SJung-uk Kim     /* Get the rest of the table */
344*a159c266SJung-uk Kim 
345*a159c266SJung-uk Kim     fseek (fp, 0, SEEK_SET);
346*a159c266SJung-uk Kim     Actual = fread (*Table, 1, (size_t) FileSize, fp);
347*a159c266SJung-uk Kim     if (Actual == FileSize)
348*a159c266SJung-uk Kim     {
349*a159c266SJung-uk Kim         if (StandardHeader)
350*a159c266SJung-uk Kim         {
351*a159c266SJung-uk Kim             /* Now validate the checksum */
352*a159c266SJung-uk Kim 
353*a159c266SJung-uk Kim             Status = AcpiTbVerifyChecksum ((void *) *Table,
354*a159c266SJung-uk Kim                         ACPI_CAST_PTR (ACPI_TABLE_HEADER, *Table)->Length);
355*a159c266SJung-uk Kim 
356*a159c266SJung-uk Kim             if (Status == AE_BAD_CHECKSUM)
357*a159c266SJung-uk Kim             {
358*a159c266SJung-uk Kim                 Status = AcpiDbCheckTextModeCorruption ((UINT8 *) *Table,
359*a159c266SJung-uk Kim                             FileSize, (*Table)->Length);
360*a159c266SJung-uk Kim                 return (Status);
361*a159c266SJung-uk Kim             }
362*a159c266SJung-uk Kim         }
363*a159c266SJung-uk Kim         return (AE_OK);
364*a159c266SJung-uk Kim     }
365*a159c266SJung-uk Kim 
366*a159c266SJung-uk Kim     if (Actual > 0)
367*a159c266SJung-uk Kim     {
368*a159c266SJung-uk Kim         AcpiOsPrintf ("Warning - reading table, asked for %X got %X\n",
369*a159c266SJung-uk Kim             FileSize, Actual);
370*a159c266SJung-uk Kim         return (AE_OK);
371*a159c266SJung-uk Kim     }
372*a159c266SJung-uk Kim 
373*a159c266SJung-uk Kim     AcpiOsPrintf ("Error - could not read the table file\n");
374*a159c266SJung-uk Kim     AcpiOsFree (*Table);
375*a159c266SJung-uk Kim     *Table = NULL;
376*a159c266SJung-uk Kim     *TableLength = 0;
377*a159c266SJung-uk Kim 
378*a159c266SJung-uk Kim     return (AE_ERROR);
379*a159c266SJung-uk Kim }
380*a159c266SJung-uk Kim 
381*a159c266SJung-uk Kim 
382*a159c266SJung-uk Kim /*******************************************************************************
383*a159c266SJung-uk Kim  *
384*a159c266SJung-uk Kim  * FUNCTION:    AeLocalLoadTable
385*a159c266SJung-uk Kim  *
386*a159c266SJung-uk Kim  * PARAMETERS:  Table           - pointer to a buffer containing the entire
387*a159c266SJung-uk Kim  *                                table to be loaded
388*a159c266SJung-uk Kim  *
389*a159c266SJung-uk Kim  * RETURN:      Status
390*a159c266SJung-uk Kim  *
391*a159c266SJung-uk Kim  * DESCRIPTION: This function is called to load a table from the caller's
392*a159c266SJung-uk Kim  *              buffer. The buffer must contain an entire ACPI Table including
393*a159c266SJung-uk Kim  *              a valid header. The header fields will be verified, and if it
394*a159c266SJung-uk Kim  *              is determined that the table is invalid, the call will fail.
395*a159c266SJung-uk Kim  *
396*a159c266SJung-uk Kim  ******************************************************************************/
397*a159c266SJung-uk Kim 
398*a159c266SJung-uk Kim static ACPI_STATUS
399*a159c266SJung-uk Kim AeLocalLoadTable (
400*a159c266SJung-uk Kim     ACPI_TABLE_HEADER       *Table)
401*a159c266SJung-uk Kim {
402*a159c266SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
403*a159c266SJung-uk Kim /*    ACPI_TABLE_DESC         TableInfo; */
404*a159c266SJung-uk Kim 
405*a159c266SJung-uk Kim 
406*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (AeLocalLoadTable);
407*a159c266SJung-uk Kim #if 0
408*a159c266SJung-uk Kim 
409*a159c266SJung-uk Kim 
410*a159c266SJung-uk Kim     if (!Table)
411*a159c266SJung-uk Kim     {
412*a159c266SJung-uk Kim         return_ACPI_STATUS (AE_BAD_PARAMETER);
413*a159c266SJung-uk Kim     }
414*a159c266SJung-uk Kim 
415*a159c266SJung-uk Kim     TableInfo.Pointer = Table;
416*a159c266SJung-uk Kim     Status = AcpiTbRecognizeTable (&TableInfo, ACPI_TABLE_ALL);
417*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
418*a159c266SJung-uk Kim     {
419*a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
420*a159c266SJung-uk Kim     }
421*a159c266SJung-uk Kim 
422*a159c266SJung-uk Kim     /* Install the new table into the local data structures */
423*a159c266SJung-uk Kim 
424*a159c266SJung-uk Kim     Status = AcpiTbInstallTable (&TableInfo);
425*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
426*a159c266SJung-uk Kim     {
427*a159c266SJung-uk Kim         if (Status == AE_ALREADY_EXISTS)
428*a159c266SJung-uk Kim         {
429*a159c266SJung-uk Kim             /* Table already exists, no error */
430*a159c266SJung-uk Kim 
431*a159c266SJung-uk Kim             Status = AE_OK;
432*a159c266SJung-uk Kim         }
433*a159c266SJung-uk Kim 
434*a159c266SJung-uk Kim         /* Free table allocated by AcpiTbGetTable */
435*a159c266SJung-uk Kim 
436*a159c266SJung-uk Kim         AcpiTbDeleteSingleTable (&TableInfo);
437*a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
438*a159c266SJung-uk Kim     }
439*a159c266SJung-uk Kim 
440*a159c266SJung-uk Kim #if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))
441*a159c266SJung-uk Kim 
442*a159c266SJung-uk Kim     Status = AcpiNsLoadTable (TableInfo.InstalledDesc, AcpiGbl_RootNode);
443*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
444*a159c266SJung-uk Kim     {
445*a159c266SJung-uk Kim         /* Uninstall table and free the buffer */
446*a159c266SJung-uk Kim 
447*a159c266SJung-uk Kim         AcpiTbDeleteTablesByType (ACPI_TABLE_ID_DSDT);
448*a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
449*a159c266SJung-uk Kim     }
450*a159c266SJung-uk Kim #endif
451*a159c266SJung-uk Kim #endif
452*a159c266SJung-uk Kim 
453*a159c266SJung-uk Kim     return_ACPI_STATUS (Status);
454*a159c266SJung-uk Kim }
455*a159c266SJung-uk Kim 
456*a159c266SJung-uk Kim 
457*a159c266SJung-uk Kim /*******************************************************************************
458*a159c266SJung-uk Kim  *
459*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbReadTableFromFile
460*a159c266SJung-uk Kim  *
461*a159c266SJung-uk Kim  * PARAMETERS:  Filename         - File where table is located
462*a159c266SJung-uk Kim  *              Table            - Where a pointer to the table is returned
463*a159c266SJung-uk Kim  *
464*a159c266SJung-uk Kim  * RETURN:      Status
465*a159c266SJung-uk Kim  *
466*a159c266SJung-uk Kim  * DESCRIPTION: Get an ACPI table from a file
467*a159c266SJung-uk Kim  *
468*a159c266SJung-uk Kim  ******************************************************************************/
469*a159c266SJung-uk Kim 
470*a159c266SJung-uk Kim ACPI_STATUS
471*a159c266SJung-uk Kim AcpiDbReadTableFromFile (
472*a159c266SJung-uk Kim     char                    *Filename,
473*a159c266SJung-uk Kim     ACPI_TABLE_HEADER       **Table)
474*a159c266SJung-uk Kim {
475*a159c266SJung-uk Kim     FILE                    *fp;
476*a159c266SJung-uk Kim     UINT32                  TableLength;
477*a159c266SJung-uk Kim     ACPI_STATUS             Status;
478*a159c266SJung-uk Kim 
479*a159c266SJung-uk Kim 
480*a159c266SJung-uk Kim     /* Open the file */
481*a159c266SJung-uk Kim 
482*a159c266SJung-uk Kim     fp = fopen (Filename, "rb");
483*a159c266SJung-uk Kim     if (!fp)
484*a159c266SJung-uk Kim     {
485*a159c266SJung-uk Kim         AcpiOsPrintf ("Could not open input file %s\n", Filename);
486*a159c266SJung-uk Kim         return (AE_ERROR);
487*a159c266SJung-uk Kim     }
488*a159c266SJung-uk Kim 
489*a159c266SJung-uk Kim     /* Get the entire file */
490*a159c266SJung-uk Kim 
491*a159c266SJung-uk Kim     fprintf (stderr, "Loading Acpi table from file %s\n", Filename);
492*a159c266SJung-uk Kim     Status = AcpiDbReadTable (fp, Table, &TableLength);
493*a159c266SJung-uk Kim     fclose(fp);
494*a159c266SJung-uk Kim 
495*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
496*a159c266SJung-uk Kim     {
497*a159c266SJung-uk Kim         AcpiOsPrintf ("Could not get table from the file\n");
498*a159c266SJung-uk Kim         return (Status);
499*a159c266SJung-uk Kim     }
500*a159c266SJung-uk Kim 
501*a159c266SJung-uk Kim     return (AE_OK);
502*a159c266SJung-uk Kim  }
503*a159c266SJung-uk Kim #endif
504*a159c266SJung-uk Kim 
505*a159c266SJung-uk Kim 
506*a159c266SJung-uk Kim /*******************************************************************************
507*a159c266SJung-uk Kim  *
508*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbGetTableFromFile
509*a159c266SJung-uk Kim  *
510*a159c266SJung-uk Kim  * PARAMETERS:  Filename        - File where table is located
511*a159c266SJung-uk Kim  *              ReturnTable     - Where a pointer to the table is returned
512*a159c266SJung-uk Kim  *
513*a159c266SJung-uk Kim  * RETURN:      Status
514*a159c266SJung-uk Kim  *
515*a159c266SJung-uk Kim  * DESCRIPTION: Load an ACPI table from a file
516*a159c266SJung-uk Kim  *
517*a159c266SJung-uk Kim  ******************************************************************************/
518*a159c266SJung-uk Kim 
519*a159c266SJung-uk Kim ACPI_STATUS
520*a159c266SJung-uk Kim AcpiDbGetTableFromFile (
521*a159c266SJung-uk Kim     char                    *Filename,
522*a159c266SJung-uk Kim     ACPI_TABLE_HEADER       **ReturnTable)
523*a159c266SJung-uk Kim {
524*a159c266SJung-uk Kim #ifdef ACPI_APPLICATION
525*a159c266SJung-uk Kim     ACPI_STATUS             Status;
526*a159c266SJung-uk Kim     ACPI_TABLE_HEADER       *Table;
527*a159c266SJung-uk Kim     BOOLEAN                 IsAmlTable = TRUE;
528*a159c266SJung-uk Kim 
529*a159c266SJung-uk Kim 
530*a159c266SJung-uk Kim     Status = AcpiDbReadTableFromFile (Filename, &Table);
531*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
532*a159c266SJung-uk Kim     {
533*a159c266SJung-uk Kim         return (Status);
534*a159c266SJung-uk Kim     }
535*a159c266SJung-uk Kim 
536*a159c266SJung-uk Kim #ifdef ACPI_DATA_TABLE_DISASSEMBLY
537*a159c266SJung-uk Kim     IsAmlTable = AcpiUtIsAmlTable (Table);
538*a159c266SJung-uk Kim #endif
539*a159c266SJung-uk Kim 
540*a159c266SJung-uk Kim     if (IsAmlTable)
541*a159c266SJung-uk Kim     {
542*a159c266SJung-uk Kim         /* Attempt to recognize and install the table */
543*a159c266SJung-uk Kim 
544*a159c266SJung-uk Kim         Status = AeLocalLoadTable (Table);
545*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
546*a159c266SJung-uk Kim         {
547*a159c266SJung-uk Kim             if (Status == AE_ALREADY_EXISTS)
548*a159c266SJung-uk Kim             {
549*a159c266SJung-uk Kim                 AcpiOsPrintf ("Table %4.4s is already installed\n",
550*a159c266SJung-uk Kim                     Table->Signature);
551*a159c266SJung-uk Kim             }
552*a159c266SJung-uk Kim             else
553*a159c266SJung-uk Kim             {
554*a159c266SJung-uk Kim                 AcpiOsPrintf ("Could not install table, %s\n",
555*a159c266SJung-uk Kim                     AcpiFormatException (Status));
556*a159c266SJung-uk Kim             }
557*a159c266SJung-uk Kim 
558*a159c266SJung-uk Kim             return (Status);
559*a159c266SJung-uk Kim         }
560*a159c266SJung-uk Kim 
561*a159c266SJung-uk Kim         fprintf (stderr,
562*a159c266SJung-uk Kim             "Acpi table [%4.4s] successfully installed and loaded\n",
563*a159c266SJung-uk Kim             Table->Signature);
564*a159c266SJung-uk Kim     }
565*a159c266SJung-uk Kim 
566*a159c266SJung-uk Kim     AcpiGbl_AcpiHardwarePresent = FALSE;
567*a159c266SJung-uk Kim     if (ReturnTable)
568*a159c266SJung-uk Kim     {
569*a159c266SJung-uk Kim         *ReturnTable = Table;
570*a159c266SJung-uk Kim     }
571*a159c266SJung-uk Kim 
572*a159c266SJung-uk Kim 
573*a159c266SJung-uk Kim #endif  /* ACPI_APPLICATION */
574*a159c266SJung-uk Kim     return (AE_OK);
575*a159c266SJung-uk Kim }
576*a159c266SJung-uk Kim 
577*a159c266SJung-uk Kim #endif  /* ACPI_DEBUGGER */
578*a159c266SJung-uk Kim 
579