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>
137FILE                        *AcpiGbl_DebugFile = NULL;
138#endif
139
140
141#ifdef ACPI_DEBUGGER
142
143/* Local prototypes */
144
145#ifdef ACPI_APPLICATION
146
147static ACPI_STATUS
148AcpiDbCheckTextModeCorruption (
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
167void
168AcpiDbCloseDebugFile (
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
197void
198AcpiDbOpenDebugFile (
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
239static ACPI_STATUS
240AcpiDbCheckTextModeCorruption (
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
312static ACPI_STATUS
313AcpiDbReadTable (
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
469static ACPI_STATUS
470AeLocalLoadTable (
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
541ACPI_STATUS
542AcpiDbReadTableFromFile (
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
590ACPI_STATUS
591AcpiDbGetTableFromFile (
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