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