1 1.1 jruoho /****************************************************************************** 2 1.1 jruoho * 3 1.1 jruoho * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code 4 1.1 jruoho * 5 1.1 jruoho *****************************************************************************/ 6 1.1 jruoho 7 1.18 christos /****************************************************************************** 8 1.18 christos * 9 1.18 christos * 1. Copyright Notice 10 1.18 christos * 11 1.19 christos * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp. 12 1.1 jruoho * All rights reserved. 13 1.1 jruoho * 14 1.18 christos * 2. License 15 1.18 christos * 16 1.18 christos * 2.1. This is your license from Intel Corp. under its intellectual property 17 1.18 christos * rights. You may have additional license terms from the party that provided 18 1.18 christos * you this software, covering your right to use that party's intellectual 19 1.18 christos * property rights. 20 1.18 christos * 21 1.18 christos * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22 1.18 christos * copy of the source code appearing in this file ("Covered Code") an 23 1.18 christos * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24 1.18 christos * base code distributed originally by Intel ("Original Intel Code") to copy, 25 1.18 christos * make derivatives, distribute, use and display any portion of the Covered 26 1.18 christos * Code in any form, with the right to sublicense such rights; and 27 1.18 christos * 28 1.18 christos * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29 1.18 christos * license (with the right to sublicense), under only those claims of Intel 30 1.18 christos * patents that are infringed by the Original Intel Code, to make, use, sell, 31 1.18 christos * offer to sell, and import the Covered Code and derivative works thereof 32 1.18 christos * solely to the minimum extent necessary to exercise the above copyright 33 1.18 christos * license, and in no event shall the patent license extend to any additions 34 1.18 christos * to or modifications of the Original Intel Code. No other license or right 35 1.18 christos * is granted directly or by implication, estoppel or otherwise; 36 1.18 christos * 37 1.18 christos * The above copyright and patent license is granted only if the following 38 1.18 christos * conditions are met: 39 1.18 christos * 40 1.18 christos * 3. Conditions 41 1.18 christos * 42 1.18 christos * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43 1.18 christos * Redistribution of source code of any substantial portion of the Covered 44 1.18 christos * Code or modification with rights to further distribute source must include 45 1.18 christos * the above Copyright Notice, the above License, this list of Conditions, 46 1.18 christos * and the following Disclaimer and Export Compliance provision. In addition, 47 1.18 christos * Licensee must cause all Covered Code to which Licensee contributes to 48 1.18 christos * contain a file documenting the changes Licensee made to create that Covered 49 1.18 christos * Code and the date of any change. Licensee must include in that file the 50 1.18 christos * documentation of any changes made by any predecessor Licensee. Licensee 51 1.18 christos * must include a prominent statement that the modification is derived, 52 1.18 christos * directly or indirectly, from Original Intel Code. 53 1.18 christos * 54 1.18 christos * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55 1.18 christos * Redistribution of source code of any substantial portion of the Covered 56 1.18 christos * Code or modification without rights to further distribute source must 57 1.18 christos * include the following Disclaimer and Export Compliance provision in the 58 1.18 christos * documentation and/or other materials provided with distribution. In 59 1.18 christos * addition, Licensee may not authorize further sublicense of source of any 60 1.18 christos * portion of the Covered Code, and must include terms to the effect that the 61 1.18 christos * license from Licensee to its licensee is limited to the intellectual 62 1.18 christos * property embodied in the software Licensee provides to its licensee, and 63 1.18 christos * not to intellectual property embodied in modifications its licensee may 64 1.18 christos * make. 65 1.18 christos * 66 1.18 christos * 3.3. Redistribution of Executable. Redistribution in executable form of any 67 1.18 christos * substantial portion of the Covered Code or modification must reproduce the 68 1.18 christos * above Copyright Notice, and the following Disclaimer and Export Compliance 69 1.18 christos * provision in the documentation and/or other materials provided with the 70 1.18 christos * distribution. 71 1.18 christos * 72 1.18 christos * 3.4. Intel retains all right, title, and interest in and to the Original 73 1.18 christos * Intel Code. 74 1.18 christos * 75 1.18 christos * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76 1.18 christos * Intel shall be used in advertising or otherwise to promote the sale, use or 77 1.18 christos * other dealings in products derived from or relating to the Covered Code 78 1.18 christos * without prior written authorization from Intel. 79 1.18 christos * 80 1.18 christos * 4. Disclaimer and Export Compliance 81 1.18 christos * 82 1.18 christos * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83 1.18 christos * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84 1.18 christos * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85 1.18 christos * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86 1.18 christos * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87 1.18 christos * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88 1.18 christos * PARTICULAR PURPOSE. 89 1.18 christos * 90 1.18 christos * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91 1.18 christos * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92 1.18 christos * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93 1.18 christos * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94 1.18 christos * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95 1.18 christos * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96 1.18 christos * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97 1.18 christos * LIMITED REMEDY. 98 1.18 christos * 99 1.18 christos * 4.3. Licensee shall not export, either directly or indirectly, any of this 100 1.18 christos * software or system incorporating such software without first obtaining any 101 1.18 christos * required license or other approval from the U. S. Department of Commerce or 102 1.18 christos * any other agency or department of the United States Government. In the 103 1.18 christos * event Licensee exports any such software from the United States or 104 1.18 christos * re-exports any such software from a foreign destination, Licensee shall 105 1.18 christos * ensure that the distribution and export/re-export of the software is in 106 1.18 christos * compliance with all laws, regulations, orders, or other restrictions of the 107 1.18 christos * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108 1.18 christos * any of its subsidiaries will export/re-export any technical data, process, 109 1.18 christos * software, or service, directly or indirectly, to any country for which the 110 1.18 christos * United States government or any agency thereof requires an export license, 111 1.18 christos * other governmental approval, or letter of assurance, without first obtaining 112 1.18 christos * such license, approval or letter. 113 1.18 christos * 114 1.18 christos ***************************************************************************** 115 1.18 christos * 116 1.18 christos * Alternatively, you may choose to be licensed under the terms of the 117 1.18 christos * following license: 118 1.18 christos * 119 1.2 christos * Redistribution and use in source and binary forms, with or without 120 1.2 christos * modification, are permitted provided that the following conditions 121 1.2 christos * are met: 122 1.2 christos * 1. Redistributions of source code must retain the above copyright 123 1.2 christos * notice, this list of conditions, and the following disclaimer, 124 1.2 christos * without modification. 125 1.2 christos * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126 1.2 christos * substantially similar to the "NO WARRANTY" disclaimer below 127 1.2 christos * ("Disclaimer") and any redistribution must be conditioned upon 128 1.2 christos * including a substantially similar Disclaimer requirement for further 129 1.2 christos * binary redistribution. 130 1.2 christos * 3. Neither the names of the above-listed copyright holders nor the names 131 1.2 christos * of any contributors may be used to endorse or promote products derived 132 1.2 christos * from this software without specific prior written permission. 133 1.2 christos * 134 1.2 christos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135 1.2 christos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136 1.13 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137 1.2 christos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138 1.18 christos * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139 1.18 christos * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140 1.18 christos * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141 1.18 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142 1.18 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143 1.18 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144 1.18 christos * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145 1.18 christos * 146 1.18 christos * Alternatively, you may choose to be licensed under the terms of the 147 1.18 christos * GNU General Public License ("GPL") version 2 as published by the Free 148 1.18 christos * Software Foundation. 149 1.18 christos * 150 1.18 christos *****************************************************************************/ 151 1.1 jruoho 152 1.1 jruoho #include "acpi.h" 153 1.1 jruoho #include "accommon.h" 154 1.1 jruoho #include "acdisasm.h" 155 1.1 jruoho #include "actables.h" 156 1.1 jruoho 157 1.1 jruoho /* This module used for application-level code only */ 158 1.1 jruoho 159 1.1 jruoho #define _COMPONENT ACPI_CA_DISASSEMBLER 160 1.1 jruoho ACPI_MODULE_NAME ("dmtbdump") 161 1.1 jruoho 162 1.1 jruoho 163 1.7 christos /* Local prototypes */ 164 1.2 christos 165 1.7 christos static void 166 1.7 christos AcpiDmValidateFadtLength ( 167 1.7 christos UINT32 Revision, 168 1.7 christos UINT32 Length); 169 1.2 christos 170 1.2 christos 171 1.2 christos /******************************************************************************* 172 1.2 christos * 173 1.2 christos * FUNCTION: AcpiDmDumpBuffer 174 1.2 christos * 175 1.2 christos * PARAMETERS: Table - ACPI Table or subtable 176 1.2 christos * BufferOffset - Offset of buffer from Table above 177 1.2 christos * Length - Length of the buffer 178 1.2 christos * AbsoluteOffset - Offset of buffer in the main ACPI table 179 1.2 christos * Header - Name of the buffer field (printed on the 180 1.2 christos * first line only.) 181 1.2 christos * 182 1.2 christos * RETURN: None 183 1.2 christos * 184 1.2 christos * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the 185 1.2 christos * disassembler output format.) 186 1.2 christos * 187 1.2 christos ******************************************************************************/ 188 1.2 christos 189 1.2 christos void 190 1.2 christos AcpiDmDumpBuffer ( 191 1.2 christos void *Table, 192 1.2 christos UINT32 BufferOffset, 193 1.2 christos UINT32 Length, 194 1.2 christos UINT32 AbsoluteOffset, 195 1.3 christos char *Header) 196 1.2 christos { 197 1.2 christos UINT8 *Buffer; 198 1.17 christos UINT8 BufChar; 199 1.2 christos UINT32 i; 200 1.17 christos UINT32 j; 201 1.2 christos 202 1.2 christos 203 1.2 christos if (!Length) 204 1.2 christos { 205 1.2 christos return; 206 1.2 christos } 207 1.2 christos 208 1.2 christos Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset; 209 1.2 christos i = 0; 210 1.2 christos 211 1.2 christos while (i < Length) 212 1.2 christos { 213 1.17 christos if ((Length > 16) && (i != 0)) 214 1.2 christos { 215 1.17 christos if ((Length - i) < 16) 216 1.17 christos AcpiOsPrintf ("\n/* %3.3Xh %4.4u %3u */ ", AbsoluteOffset, AbsoluteOffset, Length - i); 217 1.17 christos else 218 1.17 christos AcpiOsPrintf ("\n/* %3.3Xh %4.4u 16 */ ", AbsoluteOffset, AbsoluteOffset); 219 1.17 christos } 220 1.17 christos AbsoluteOffset += 16; 221 1.17 christos 222 1.17 christos /* Emit the raw data bytes*/ 223 1.3 christos 224 1.17 christos for (j = 0; j < 16; j++) 225 1.17 christos { 226 1.17 christos if (i + j >= Length) 227 1.2 christos { 228 1.17 christos /* Dump fill spaces */ 229 1.17 christos 230 1.17 christos AcpiOsPrintf ("%*s", (48 - (3 * (Length -i))), " "); 231 1.17 christos break; 232 1.2 christos } 233 1.17 christos AcpiOsPrintf ("%.02X ", Buffer[(ACPI_SIZE) i + j]); 234 1.2 christos } 235 1.2 christos 236 1.17 christos /* Emit the ASCII equivalent to the raw data bytes */ 237 1.17 christos 238 1.17 christos for (j = 0; j < 16; j++) 239 1.17 christos { 240 1.17 christos if (i + j >= Length) 241 1.17 christos { 242 1.17 christos AcpiOsPrintf (" */\\\n"); 243 1.17 christos return; 244 1.17 christos } 245 1.17 christos 246 1.17 christos /* 247 1.17 christos * Add comment characters so rest of line is ignored when 248 1.17 christos * compiled 249 1.17 christos */ 250 1.17 christos if (j == 0) 251 1.17 christos { 252 1.17 christos AcpiOsPrintf ("/* "); 253 1.17 christos } 254 1.17 christos 255 1.17 christos BufChar = Buffer[(ACPI_SIZE) i + j]; 256 1.17 christos if (isprint (BufChar)) 257 1.17 christos { 258 1.17 christos AcpiOsPrintf ("%c", BufChar); 259 1.17 christos } 260 1.17 christos else 261 1.17 christos { 262 1.17 christos AcpiOsPrintf ("."); 263 1.17 christos } 264 1.17 christos } 265 1.17 christos 266 1.17 christos /* Done with that line. */ 267 1.17 christos /* Close the comment and insert a backslash - line continuation character */ 268 1.17 christos 269 1.17 christos AcpiOsPrintf (" */\\"); 270 1.17 christos 271 1.17 christos i += 16; /* Point to next line */ 272 1.2 christos } 273 1.2 christos 274 1.2 christos AcpiOsPrintf ("\n"); 275 1.2 christos } 276 1.2 christos 277 1.2 christos 278 1.1 jruoho /******************************************************************************* 279 1.1 jruoho * 280 1.3 christos * FUNCTION: AcpiDmDumpUnicode 281 1.3 christos * 282 1.3 christos * PARAMETERS: Table - ACPI Table or subtable 283 1.3 christos * BufferOffset - Offset of buffer from Table above 284 1.3 christos * ByteLength - Length of the buffer 285 1.3 christos * 286 1.3 christos * RETURN: None 287 1.3 christos * 288 1.3 christos * DESCRIPTION: Validate and dump the contents of a buffer that contains 289 1.3 christos * unicode data. The output is a standard ASCII string. If it 290 1.3 christos * appears that the data is not unicode, the buffer is dumped 291 1.3 christos * as hex characters. 292 1.3 christos * 293 1.3 christos ******************************************************************************/ 294 1.3 christos 295 1.3 christos void 296 1.3 christos AcpiDmDumpUnicode ( 297 1.3 christos void *Table, 298 1.3 christos UINT32 BufferOffset, 299 1.3 christos UINT32 ByteLength) 300 1.3 christos { 301 1.3 christos UINT8 *Buffer; 302 1.3 christos UINT32 Length; 303 1.3 christos UINT32 i; 304 1.3 christos 305 1.3 christos 306 1.3 christos Buffer = ((UINT8 *) Table) + BufferOffset; 307 1.3 christos Length = ByteLength - 2; /* Last two bytes are the null terminator */ 308 1.3 christos 309 1.3 christos /* Ensure all low bytes are entirely printable ASCII */ 310 1.3 christos 311 1.3 christos for (i = 0; i < Length; i += 2) 312 1.3 christos { 313 1.3 christos if (!isprint (Buffer[i])) 314 1.3 christos { 315 1.3 christos goto DumpRawBuffer; 316 1.3 christos } 317 1.3 christos } 318 1.3 christos 319 1.3 christos /* Ensure all high bytes are zero */ 320 1.3 christos 321 1.3 christos for (i = 1; i < Length; i += 2) 322 1.3 christos { 323 1.3 christos if (Buffer[i]) 324 1.3 christos { 325 1.3 christos goto DumpRawBuffer; 326 1.3 christos } 327 1.3 christos } 328 1.3 christos 329 1.3 christos /* Dump the buffer as a normal string */ 330 1.3 christos 331 1.3 christos AcpiOsPrintf ("\""); 332 1.3 christos for (i = 0; i < Length; i += 2) 333 1.3 christos { 334 1.3 christos AcpiOsPrintf ("%c", Buffer[i]); 335 1.3 christos } 336 1.4 christos 337 1.3 christos AcpiOsPrintf ("\"\n"); 338 1.3 christos return; 339 1.3 christos 340 1.3 christos DumpRawBuffer: 341 1.3 christos AcpiDmDumpBuffer (Table, BufferOffset, ByteLength, 342 1.3 christos BufferOffset, NULL); 343 1.3 christos AcpiOsPrintf ("\n"); 344 1.3 christos } 345 1.3 christos 346 1.3 christos 347 1.3 christos /******************************************************************************* 348 1.3 christos * 349 1.1 jruoho * FUNCTION: AcpiDmDumpRsdp 350 1.1 jruoho * 351 1.1 jruoho * PARAMETERS: Table - A RSDP 352 1.1 jruoho * 353 1.2 christos * RETURN: Length of the table (there is not always a length field, 354 1.2 christos * use revision or length if available (ACPI 2.0+)) 355 1.1 jruoho * 356 1.1 jruoho * DESCRIPTION: Format the contents of a RSDP 357 1.1 jruoho * 358 1.1 jruoho ******************************************************************************/ 359 1.1 jruoho 360 1.1 jruoho UINT32 361 1.1 jruoho AcpiDmDumpRsdp ( 362 1.1 jruoho ACPI_TABLE_HEADER *Table) 363 1.1 jruoho { 364 1.2 christos ACPI_TABLE_RSDP *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table); 365 1.2 christos UINT32 Length = sizeof (ACPI_RSDP_COMMON); 366 1.2 christos UINT8 Checksum; 367 1.3 christos ACPI_STATUS Status; 368 1.1 jruoho 369 1.1 jruoho 370 1.1 jruoho /* Dump the common ACPI 1.0 portion */ 371 1.1 jruoho 372 1.3 christos Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1); 373 1.3 christos if (ACPI_FAILURE (Status)) 374 1.3 christos { 375 1.3 christos return (Length); 376 1.3 christos } 377 1.1 jruoho 378 1.2 christos /* Validate the first checksum */ 379 1.2 christos 380 1.15 christos Checksum = AcpiUtGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON), 381 1.4 christos Rsdp->Checksum); 382 1.2 christos if (Checksum != Rsdp->Checksum) 383 1.2 christos { 384 1.2 christos AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n", 385 1.2 christos Checksum); 386 1.2 christos } 387 1.2 christos 388 1.2 christos /* The RSDP for ACPI 2.0+ contains more data and has a Length field */ 389 1.1 jruoho 390 1.2 christos if (Rsdp->Revision > 0) 391 1.1 jruoho { 392 1.2 christos Length = Rsdp->Length; 393 1.3 christos Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2); 394 1.3 christos if (ACPI_FAILURE (Status)) 395 1.3 christos { 396 1.3 christos return (Length); 397 1.3 christos } 398 1.2 christos 399 1.2 christos /* Validate the extended checksum over entire RSDP */ 400 1.2 christos 401 1.15 christos Checksum = AcpiUtGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP), 402 1.4 christos Rsdp->ExtendedChecksum); 403 1.2 christos if (Checksum != Rsdp->ExtendedChecksum) 404 1.2 christos { 405 1.2 christos AcpiOsPrintf ( 406 1.2 christos "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n", 407 1.2 christos Checksum); 408 1.2 christos } 409 1.1 jruoho } 410 1.1 jruoho 411 1.1 jruoho return (Length); 412 1.1 jruoho } 413 1.1 jruoho 414 1.1 jruoho 415 1.1 jruoho /******************************************************************************* 416 1.1 jruoho * 417 1.1 jruoho * FUNCTION: AcpiDmDumpRsdt 418 1.1 jruoho * 419 1.1 jruoho * PARAMETERS: Table - A RSDT 420 1.1 jruoho * 421 1.1 jruoho * RETURN: None 422 1.1 jruoho * 423 1.1 jruoho * DESCRIPTION: Format the contents of a RSDT 424 1.1 jruoho * 425 1.1 jruoho ******************************************************************************/ 426 1.1 jruoho 427 1.1 jruoho void 428 1.1 jruoho AcpiDmDumpRsdt ( 429 1.1 jruoho ACPI_TABLE_HEADER *Table) 430 1.1 jruoho { 431 1.1 jruoho UINT32 *Array; 432 1.1 jruoho UINT32 Entries; 433 1.1 jruoho UINT32 Offset; 434 1.1 jruoho UINT32 i; 435 1.1 jruoho 436 1.1 jruoho 437 1.1 jruoho /* Point to start of table pointer array */ 438 1.1 jruoho 439 1.1 jruoho Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry; 440 1.1 jruoho Offset = sizeof (ACPI_TABLE_HEADER); 441 1.1 jruoho 442 1.1 jruoho /* RSDT uses 32-bit pointers */ 443 1.1 jruoho 444 1.1 jruoho Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32); 445 1.1 jruoho 446 1.1 jruoho for (i = 0; i < Entries; i++) 447 1.1 jruoho { 448 1.1 jruoho AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i); 449 1.1 jruoho AcpiOsPrintf ("%8.8X\n", Array[i]); 450 1.1 jruoho Offset += sizeof (UINT32); 451 1.1 jruoho } 452 1.1 jruoho } 453 1.1 jruoho 454 1.1 jruoho 455 1.1 jruoho /******************************************************************************* 456 1.1 jruoho * 457 1.1 jruoho * FUNCTION: AcpiDmDumpXsdt 458 1.1 jruoho * 459 1.1 jruoho * PARAMETERS: Table - A XSDT 460 1.1 jruoho * 461 1.1 jruoho * RETURN: None 462 1.1 jruoho * 463 1.1 jruoho * DESCRIPTION: Format the contents of a XSDT 464 1.1 jruoho * 465 1.1 jruoho ******************************************************************************/ 466 1.1 jruoho 467 1.1 jruoho void 468 1.1 jruoho AcpiDmDumpXsdt ( 469 1.1 jruoho ACPI_TABLE_HEADER *Table) 470 1.1 jruoho { 471 1.1 jruoho UINT64 *Array; 472 1.1 jruoho UINT32 Entries; 473 1.1 jruoho UINT32 Offset; 474 1.1 jruoho UINT32 i; 475 1.1 jruoho 476 1.1 jruoho 477 1.1 jruoho /* Point to start of table pointer array */ 478 1.1 jruoho 479 1.1 jruoho Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry; 480 1.1 jruoho Offset = sizeof (ACPI_TABLE_HEADER); 481 1.1 jruoho 482 1.1 jruoho /* XSDT uses 64-bit pointers */ 483 1.1 jruoho 484 1.1 jruoho Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64); 485 1.1 jruoho 486 1.1 jruoho for (i = 0; i < Entries; i++) 487 1.1 jruoho { 488 1.1 jruoho AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i); 489 1.1 jruoho AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i])); 490 1.1 jruoho Offset += sizeof (UINT64); 491 1.1 jruoho } 492 1.1 jruoho } 493 1.1 jruoho 494 1.1 jruoho 495 1.1 jruoho /******************************************************************************* 496 1.1 jruoho * 497 1.1 jruoho * FUNCTION: AcpiDmDumpFadt 498 1.1 jruoho * 499 1.1 jruoho * PARAMETERS: Table - A FADT 500 1.1 jruoho * 501 1.1 jruoho * RETURN: None 502 1.1 jruoho * 503 1.1 jruoho * DESCRIPTION: Format the contents of a FADT 504 1.1 jruoho * 505 1.2 christos * NOTE: We cannot depend on the FADT version to indicate the actual 506 1.2 christos * contents of the FADT because of BIOS bugs. The table length 507 1.2 christos * is the only reliable indicator. 508 1.2 christos * 509 1.1 jruoho ******************************************************************************/ 510 1.1 jruoho 511 1.1 jruoho void 512 1.1 jruoho AcpiDmDumpFadt ( 513 1.1 jruoho ACPI_TABLE_HEADER *Table) 514 1.1 jruoho { 515 1.3 christos ACPI_STATUS Status; 516 1.6 christos 517 1.3 christos 518 1.7 christos /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */ 519 1.1 jruoho 520 1.7 christos Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 521 1.7 christos AcpiDmTableInfoFadt1); 522 1.7 christos if (ACPI_FAILURE (Status)) 523 1.3 christos { 524 1.3 christos return; 525 1.3 christos } 526 1.1 jruoho 527 1.7 christos /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */ 528 1.7 christos 529 1.7 christos if ((Table->Length > ACPI_FADT_V1_SIZE) && 530 1.7 christos (Table->Length <= ACPI_FADT_V2_SIZE)) 531 1.6 christos { 532 1.7 christos Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 533 1.7 christos AcpiDmTableInfoFadt2); 534 1.7 christos if (ACPI_FAILURE (Status)) 535 1.3 christos { 536 1.7 christos return; 537 1.3 christos } 538 1.1 jruoho } 539 1.1 jruoho 540 1.7 christos /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */ 541 1.7 christos 542 1.7 christos else if (Table->Length > ACPI_FADT_V2_SIZE) 543 1.1 jruoho { 544 1.7 christos Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 545 1.7 christos AcpiDmTableInfoFadt3); 546 1.7 christos if (ACPI_FAILURE (Status)) 547 1.3 christos { 548 1.7 christos return; 549 1.3 christos } 550 1.2 christos 551 1.7 christos /* Check for FADT revision 5 fields and up (ACPI 5.0+) */ 552 1.2 christos 553 1.7 christos if (Table->Length > ACPI_FADT_V3_SIZE) 554 1.2 christos { 555 1.7 christos Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 556 1.7 christos AcpiDmTableInfoFadt5); 557 1.7 christos if (ACPI_FAILURE (Status)) 558 1.7 christos { 559 1.7 christos return; 560 1.7 christos } 561 1.3 christos } 562 1.3 christos 563 1.7 christos /* Check for FADT revision 6 fields and up (ACPI 6.0+) */ 564 1.7 christos 565 1.17 christos if (Table->Length > ACPI_FADT_V5_SIZE) 566 1.3 christos { 567 1.7 christos Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 568 1.7 christos AcpiDmTableInfoFadt6); 569 1.7 christos if (ACPI_FAILURE (Status)) 570 1.7 christos { 571 1.7 christos return; 572 1.7 christos } 573 1.2 christos } 574 1.1 jruoho } 575 1.1 jruoho 576 1.7 christos /* Validate various fields in the FADT, including length */ 577 1.1 jruoho 578 1.1 jruoho AcpiTbCreateLocalFadt (Table, Table->Length); 579 1.7 christos 580 1.7 christos /* Validate FADT length against the revision */ 581 1.7 christos 582 1.7 christos AcpiDmValidateFadtLength (Table->Revision, Table->Length); 583 1.7 christos } 584 1.7 christos 585 1.7 christos 586 1.7 christos /******************************************************************************* 587 1.7 christos * 588 1.7 christos * FUNCTION: AcpiDmValidateFadtLength 589 1.7 christos * 590 1.7 christos * PARAMETERS: Revision - FADT revision (Header->Revision) 591 1.7 christos * Length - FADT length (Header->Length 592 1.7 christos * 593 1.7 christos * RETURN: None 594 1.7 christos * 595 1.7 christos * DESCRIPTION: Check the FADT revision against the expected table length for 596 1.7 christos * that revision. Issue a warning if the length is not what was 597 1.7 christos * expected. This seems to be such a common BIOS bug that the 598 1.7 christos * FADT revision has been rendered virtually meaningless. 599 1.7 christos * 600 1.7 christos ******************************************************************************/ 601 1.7 christos 602 1.7 christos static void 603 1.7 christos AcpiDmValidateFadtLength ( 604 1.7 christos UINT32 Revision, 605 1.7 christos UINT32 Length) 606 1.7 christos { 607 1.7 christos UINT32 ExpectedLength; 608 1.7 christos 609 1.7 christos 610 1.7 christos switch (Revision) 611 1.7 christos { 612 1.7 christos case 0: 613 1.7 christos 614 1.7 christos AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n"); 615 1.7 christos return; 616 1.7 christos 617 1.7 christos case 1: 618 1.7 christos 619 1.7 christos ExpectedLength = ACPI_FADT_V1_SIZE; 620 1.7 christos break; 621 1.7 christos 622 1.7 christos case 2: 623 1.7 christos 624 1.7 christos ExpectedLength = ACPI_FADT_V2_SIZE; 625 1.7 christos break; 626 1.7 christos 627 1.7 christos case 3: 628 1.7 christos case 4: 629 1.7 christos 630 1.7 christos ExpectedLength = ACPI_FADT_V3_SIZE; 631 1.7 christos break; 632 1.7 christos 633 1.7 christos case 5: 634 1.7 christos 635 1.7 christos ExpectedLength = ACPI_FADT_V5_SIZE; 636 1.7 christos break; 637 1.7 christos 638 1.17 christos case 6: 639 1.17 christos 640 1.17 christos ExpectedLength = ACPI_FADT_V6_SIZE; 641 1.17 christos break; 642 1.17 christos 643 1.7 christos default: 644 1.7 christos 645 1.7 christos return; 646 1.7 christos } 647 1.7 christos 648 1.7 christos if (Length == ExpectedLength) 649 1.7 christos { 650 1.7 christos return; 651 1.7 christos } 652 1.7 christos 653 1.7 christos AcpiOsPrintf ( 654 1.7 christos "\n// ACPI Warning: FADT revision %X does not match length: " 655 1.7 christos "found %X expected %X\n", 656 1.7 christos Revision, Length, ExpectedLength); 657 1.1 jruoho } 658