Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1498 serge 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 
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