1a9d8d09cSJung-uk Kim /****************************************************************************** 2a9d8d09cSJung-uk Kim * 3a9d8d09cSJung-uk Kim * Module Name: tbprint - Table output utilities 4a9d8d09cSJung-uk Kim * 5a9d8d09cSJung-uk Kim *****************************************************************************/ 6a9d8d09cSJung-uk Kim 7a9d8d09cSJung-uk Kim /* 81c0e1b6dSJung-uk Kim * Copyright (C) 2000 - 2015, Intel Corp. 9a9d8d09cSJung-uk Kim * All rights reserved. 10a9d8d09cSJung-uk Kim * 11a9d8d09cSJung-uk Kim * Redistribution and use in source and binary forms, with or without 12a9d8d09cSJung-uk Kim * modification, are permitted provided that the following conditions 13a9d8d09cSJung-uk Kim * are met: 14a9d8d09cSJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15a9d8d09cSJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16a9d8d09cSJung-uk Kim * without modification. 17a9d8d09cSJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18a9d8d09cSJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19a9d8d09cSJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20a9d8d09cSJung-uk Kim * including a substantially similar Disclaimer requirement for further 21a9d8d09cSJung-uk Kim * binary redistribution. 22a9d8d09cSJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23a9d8d09cSJung-uk Kim * of any contributors may be used to endorse or promote products derived 24a9d8d09cSJung-uk Kim * from this software without specific prior written permission. 25a9d8d09cSJung-uk Kim * 26a9d8d09cSJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27a9d8d09cSJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28a9d8d09cSJung-uk Kim * Software Foundation. 29a9d8d09cSJung-uk Kim * 30a9d8d09cSJung-uk Kim * NO WARRANTY 31a9d8d09cSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32a9d8d09cSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33a9d8d09cSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34a9d8d09cSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35a9d8d09cSJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36a9d8d09cSJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37a9d8d09cSJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38a9d8d09cSJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39a9d8d09cSJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40a9d8d09cSJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41a9d8d09cSJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42a9d8d09cSJung-uk Kim */ 43a9d8d09cSJung-uk Kim 44a9d8d09cSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 45a9d8d09cSJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 46a9d8d09cSJung-uk Kim #include <contrib/dev/acpica/include/actables.h> 47a9d8d09cSJung-uk Kim 48a9d8d09cSJung-uk Kim #define _COMPONENT ACPI_TABLES 49a9d8d09cSJung-uk Kim ACPI_MODULE_NAME ("tbprint") 50a9d8d09cSJung-uk Kim 51a9d8d09cSJung-uk Kim 52a9d8d09cSJung-uk Kim /* Local prototypes */ 53a9d8d09cSJung-uk Kim 54a9d8d09cSJung-uk Kim static void 55a9d8d09cSJung-uk Kim AcpiTbFixString ( 56a9d8d09cSJung-uk Kim char *String, 57a9d8d09cSJung-uk Kim ACPI_SIZE Length); 58a9d8d09cSJung-uk Kim 59a9d8d09cSJung-uk Kim static void 60a9d8d09cSJung-uk Kim AcpiTbCleanupTableHeader ( 61a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *OutHeader, 62a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *Header); 63a9d8d09cSJung-uk Kim 64a9d8d09cSJung-uk Kim 65a9d8d09cSJung-uk Kim /******************************************************************************* 66a9d8d09cSJung-uk Kim * 67a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbFixString 68a9d8d09cSJung-uk Kim * 69a9d8d09cSJung-uk Kim * PARAMETERS: String - String to be repaired 70a9d8d09cSJung-uk Kim * Length - Maximum length 71a9d8d09cSJung-uk Kim * 72a9d8d09cSJung-uk Kim * RETURN: None 73a9d8d09cSJung-uk Kim * 74a9d8d09cSJung-uk Kim * DESCRIPTION: Replace every non-printable or non-ascii byte in the string 75a9d8d09cSJung-uk Kim * with a question mark '?'. 76a9d8d09cSJung-uk Kim * 77a9d8d09cSJung-uk Kim ******************************************************************************/ 78a9d8d09cSJung-uk Kim 79a9d8d09cSJung-uk Kim static void 80a9d8d09cSJung-uk Kim AcpiTbFixString ( 81a9d8d09cSJung-uk Kim char *String, 82a9d8d09cSJung-uk Kim ACPI_SIZE Length) 83a9d8d09cSJung-uk Kim { 84a9d8d09cSJung-uk Kim 85a9d8d09cSJung-uk Kim while (Length && *String) 86a9d8d09cSJung-uk Kim { 87a9d8d09cSJung-uk Kim if (!ACPI_IS_PRINT (*String)) 88a9d8d09cSJung-uk Kim { 89a9d8d09cSJung-uk Kim *String = '?'; 90a9d8d09cSJung-uk Kim } 91a9d8d09cSJung-uk Kim String++; 92a9d8d09cSJung-uk Kim Length--; 93a9d8d09cSJung-uk Kim } 94a9d8d09cSJung-uk Kim } 95a9d8d09cSJung-uk Kim 96a9d8d09cSJung-uk Kim 97a9d8d09cSJung-uk Kim /******************************************************************************* 98a9d8d09cSJung-uk Kim * 99a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbCleanupTableHeader 100a9d8d09cSJung-uk Kim * 101a9d8d09cSJung-uk Kim * PARAMETERS: OutHeader - Where the cleaned header is returned 102a9d8d09cSJung-uk Kim * Header - Input ACPI table header 103a9d8d09cSJung-uk Kim * 104a9d8d09cSJung-uk Kim * RETURN: Returns the cleaned header in OutHeader 105a9d8d09cSJung-uk Kim * 106a9d8d09cSJung-uk Kim * DESCRIPTION: Copy the table header and ensure that all "string" fields in 107a9d8d09cSJung-uk Kim * the header consist of printable characters. 108a9d8d09cSJung-uk Kim * 109a9d8d09cSJung-uk Kim ******************************************************************************/ 110a9d8d09cSJung-uk Kim 111a9d8d09cSJung-uk Kim static void 112a9d8d09cSJung-uk Kim AcpiTbCleanupTableHeader ( 113a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *OutHeader, 114a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *Header) 115a9d8d09cSJung-uk Kim { 116a9d8d09cSJung-uk Kim 117a9d8d09cSJung-uk Kim ACPI_MEMCPY (OutHeader, Header, sizeof (ACPI_TABLE_HEADER)); 118a9d8d09cSJung-uk Kim 119a9d8d09cSJung-uk Kim AcpiTbFixString (OutHeader->Signature, ACPI_NAME_SIZE); 120a9d8d09cSJung-uk Kim AcpiTbFixString (OutHeader->OemId, ACPI_OEM_ID_SIZE); 121a9d8d09cSJung-uk Kim AcpiTbFixString (OutHeader->OemTableId, ACPI_OEM_TABLE_ID_SIZE); 122a9d8d09cSJung-uk Kim AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE); 123a9d8d09cSJung-uk Kim } 124a9d8d09cSJung-uk Kim 125a9d8d09cSJung-uk Kim 126a9d8d09cSJung-uk Kim /******************************************************************************* 127a9d8d09cSJung-uk Kim * 128a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbPrintTableHeader 129a9d8d09cSJung-uk Kim * 130a9d8d09cSJung-uk Kim * PARAMETERS: Address - Table physical address 131a9d8d09cSJung-uk Kim * Header - Table header 132a9d8d09cSJung-uk Kim * 133a9d8d09cSJung-uk Kim * RETURN: None 134a9d8d09cSJung-uk Kim * 135a9d8d09cSJung-uk Kim * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. 136a9d8d09cSJung-uk Kim * 137a9d8d09cSJung-uk Kim ******************************************************************************/ 138a9d8d09cSJung-uk Kim 139a9d8d09cSJung-uk Kim void 140a9d8d09cSJung-uk Kim AcpiTbPrintTableHeader ( 141a9d8d09cSJung-uk Kim ACPI_PHYSICAL_ADDRESS Address, 142a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *Header) 143a9d8d09cSJung-uk Kim { 144a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER LocalHeader; 145a9d8d09cSJung-uk Kim 146a9d8d09cSJung-uk Kim 147a9d8d09cSJung-uk Kim if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS)) 148a9d8d09cSJung-uk Kim { 149a9d8d09cSJung-uk Kim /* FACS only has signature and length fields */ 150a9d8d09cSJung-uk Kim 151*7cf3e94aSJung-uk Kim ACPI_INFO ((AE_INFO, "%-4.4s 0x%8.8X%8.8X %06X", 152*7cf3e94aSJung-uk Kim Header->Signature, ACPI_FORMAT_UINT64 (Address), 153a9d8d09cSJung-uk Kim Header->Length)); 154a9d8d09cSJung-uk Kim } 15579c6d946SJung-uk Kim else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature)) 156a9d8d09cSJung-uk Kim { 157a9d8d09cSJung-uk Kim /* RSDP has no common fields */ 158a9d8d09cSJung-uk Kim 159a9d8d09cSJung-uk Kim ACPI_MEMCPY (LocalHeader.OemId, 160a9d8d09cSJung-uk Kim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->OemId, ACPI_OEM_ID_SIZE); 161a9d8d09cSJung-uk Kim AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE); 162a9d8d09cSJung-uk Kim 163*7cf3e94aSJung-uk Kim ACPI_INFO ((AE_INFO, "RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)", 164*7cf3e94aSJung-uk Kim ACPI_FORMAT_UINT64 (Address), 165a9d8d09cSJung-uk Kim (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ? 166a9d8d09cSJung-uk Kim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20, 167a9d8d09cSJung-uk Kim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision, 168a9d8d09cSJung-uk Kim LocalHeader.OemId)); 169a9d8d09cSJung-uk Kim } 170a9d8d09cSJung-uk Kim else 171a9d8d09cSJung-uk Kim { 172a9d8d09cSJung-uk Kim /* Standard ACPI table with full common header */ 173a9d8d09cSJung-uk Kim 174a9d8d09cSJung-uk Kim AcpiTbCleanupTableHeader (&LocalHeader, Header); 175a9d8d09cSJung-uk Kim 176a9d8d09cSJung-uk Kim ACPI_INFO ((AE_INFO, 177*7cf3e94aSJung-uk Kim "%-4.4s 0x%8.8X%8.8X" 178313a0c13SJung-uk Kim " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)", 179*7cf3e94aSJung-uk Kim LocalHeader.Signature, ACPI_FORMAT_UINT64 (Address), 180a9d8d09cSJung-uk Kim LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId, 181a9d8d09cSJung-uk Kim LocalHeader.OemTableId, LocalHeader.OemRevision, 182a9d8d09cSJung-uk Kim LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision)); 183a9d8d09cSJung-uk Kim } 184a9d8d09cSJung-uk Kim } 185a9d8d09cSJung-uk Kim 186a9d8d09cSJung-uk Kim 187a9d8d09cSJung-uk Kim /******************************************************************************* 188a9d8d09cSJung-uk Kim * 189a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbValidateChecksum 190a9d8d09cSJung-uk Kim * 191a9d8d09cSJung-uk Kim * PARAMETERS: Table - ACPI table to verify 192a9d8d09cSJung-uk Kim * Length - Length of entire table 193a9d8d09cSJung-uk Kim * 194a9d8d09cSJung-uk Kim * RETURN: Status 195a9d8d09cSJung-uk Kim * 196a9d8d09cSJung-uk Kim * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns 197a9d8d09cSJung-uk Kim * exception on bad checksum. 198a9d8d09cSJung-uk Kim * 199a9d8d09cSJung-uk Kim ******************************************************************************/ 200a9d8d09cSJung-uk Kim 201a9d8d09cSJung-uk Kim ACPI_STATUS 202a9d8d09cSJung-uk Kim AcpiTbVerifyChecksum ( 203a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *Table, 204a9d8d09cSJung-uk Kim UINT32 Length) 205a9d8d09cSJung-uk Kim { 206a9d8d09cSJung-uk Kim UINT8 Checksum; 207a9d8d09cSJung-uk Kim 208a9d8d09cSJung-uk Kim 20979c6d946SJung-uk Kim /* 21079c6d946SJung-uk Kim * FACS/S3PT: 21179c6d946SJung-uk Kim * They are the odd tables, have no standard ACPI header and no checksum 21279c6d946SJung-uk Kim */ 21379c6d946SJung-uk Kim 21479c6d946SJung-uk Kim if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT) || 21579c6d946SJung-uk Kim ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) 21679c6d946SJung-uk Kim { 21779c6d946SJung-uk Kim return (AE_OK); 21879c6d946SJung-uk Kim } 21979c6d946SJung-uk Kim 220a9d8d09cSJung-uk Kim /* Compute the checksum on the table */ 221a9d8d09cSJung-uk Kim 222a9d8d09cSJung-uk Kim Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); 223a9d8d09cSJung-uk Kim 224a9d8d09cSJung-uk Kim /* Checksum ok? (should be zero) */ 225a9d8d09cSJung-uk Kim 226a9d8d09cSJung-uk Kim if (Checksum) 227a9d8d09cSJung-uk Kim { 228a9d8d09cSJung-uk Kim ACPI_BIOS_WARNING ((AE_INFO, 229a9d8d09cSJung-uk Kim "Incorrect checksum in table [%4.4s] - 0x%2.2X, " 230a9d8d09cSJung-uk Kim "should be 0x%2.2X", 231a9d8d09cSJung-uk Kim Table->Signature, Table->Checksum, 232a9d8d09cSJung-uk Kim (UINT8) (Table->Checksum - Checksum))); 233a9d8d09cSJung-uk Kim 234a9d8d09cSJung-uk Kim #if (ACPI_CHECKSUM_ABORT) 235a9d8d09cSJung-uk Kim return (AE_BAD_CHECKSUM); 236a9d8d09cSJung-uk Kim #endif 237a9d8d09cSJung-uk Kim } 238a9d8d09cSJung-uk Kim 239a9d8d09cSJung-uk Kim return (AE_OK); 240a9d8d09cSJung-uk Kim } 241a9d8d09cSJung-uk Kim 242a9d8d09cSJung-uk Kim 243a9d8d09cSJung-uk Kim /******************************************************************************* 244a9d8d09cSJung-uk Kim * 245a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbChecksum 246a9d8d09cSJung-uk Kim * 247a9d8d09cSJung-uk Kim * PARAMETERS: Buffer - Pointer to memory region to be checked 248a9d8d09cSJung-uk Kim * Length - Length of this memory region 249a9d8d09cSJung-uk Kim * 250a9d8d09cSJung-uk Kim * RETURN: Checksum (UINT8) 251a9d8d09cSJung-uk Kim * 252a9d8d09cSJung-uk Kim * DESCRIPTION: Calculates circular checksum of memory region. 253a9d8d09cSJung-uk Kim * 254a9d8d09cSJung-uk Kim ******************************************************************************/ 255a9d8d09cSJung-uk Kim 256a9d8d09cSJung-uk Kim UINT8 257a9d8d09cSJung-uk Kim AcpiTbChecksum ( 258a9d8d09cSJung-uk Kim UINT8 *Buffer, 259a9d8d09cSJung-uk Kim UINT32 Length) 260a9d8d09cSJung-uk Kim { 261a9d8d09cSJung-uk Kim UINT8 Sum = 0; 262a9d8d09cSJung-uk Kim UINT8 *End = Buffer + Length; 263a9d8d09cSJung-uk Kim 264a9d8d09cSJung-uk Kim 265a9d8d09cSJung-uk Kim while (Buffer < End) 266a9d8d09cSJung-uk Kim { 267a9d8d09cSJung-uk Kim Sum = (UINT8) (Sum + *(Buffer++)); 268a9d8d09cSJung-uk Kim } 269a9d8d09cSJung-uk Kim 270a9d8d09cSJung-uk Kim return (Sum); 271a9d8d09cSJung-uk Kim } 272