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 /* 8*f8146b88SJung-uk Kim * Copyright (C) 2000 - 2016, 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 { 875ef50723SJung-uk Kim if (!isprint ((int) *String)) 88a9d8d09cSJung-uk Kim { 89a9d8d09cSJung-uk Kim *String = '?'; 90a9d8d09cSJung-uk Kim } 91*f8146b88SJung-uk Kim 92a9d8d09cSJung-uk Kim String++; 93a9d8d09cSJung-uk Kim Length--; 94a9d8d09cSJung-uk Kim } 95a9d8d09cSJung-uk Kim } 96a9d8d09cSJung-uk Kim 97a9d8d09cSJung-uk Kim 98a9d8d09cSJung-uk Kim /******************************************************************************* 99a9d8d09cSJung-uk Kim * 100a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbCleanupTableHeader 101a9d8d09cSJung-uk Kim * 102a9d8d09cSJung-uk Kim * PARAMETERS: OutHeader - Where the cleaned header is returned 103a9d8d09cSJung-uk Kim * Header - Input ACPI table header 104a9d8d09cSJung-uk Kim * 105a9d8d09cSJung-uk Kim * RETURN: Returns the cleaned header in OutHeader 106a9d8d09cSJung-uk Kim * 107a9d8d09cSJung-uk Kim * DESCRIPTION: Copy the table header and ensure that all "string" fields in 108a9d8d09cSJung-uk Kim * the header consist of printable characters. 109a9d8d09cSJung-uk Kim * 110a9d8d09cSJung-uk Kim ******************************************************************************/ 111a9d8d09cSJung-uk Kim 112a9d8d09cSJung-uk Kim static void 113a9d8d09cSJung-uk Kim AcpiTbCleanupTableHeader ( 114a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *OutHeader, 115a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *Header) 116a9d8d09cSJung-uk Kim { 117a9d8d09cSJung-uk Kim 1185ef50723SJung-uk Kim memcpy (OutHeader, Header, sizeof (ACPI_TABLE_HEADER)); 119a9d8d09cSJung-uk Kim 120a9d8d09cSJung-uk Kim AcpiTbFixString (OutHeader->Signature, ACPI_NAME_SIZE); 121a9d8d09cSJung-uk Kim AcpiTbFixString (OutHeader->OemId, ACPI_OEM_ID_SIZE); 122a9d8d09cSJung-uk Kim AcpiTbFixString (OutHeader->OemTableId, ACPI_OEM_TABLE_ID_SIZE); 123a9d8d09cSJung-uk Kim AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE); 124a9d8d09cSJung-uk Kim } 125a9d8d09cSJung-uk Kim 126a9d8d09cSJung-uk Kim 127a9d8d09cSJung-uk Kim /******************************************************************************* 128a9d8d09cSJung-uk Kim * 129a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbPrintTableHeader 130a9d8d09cSJung-uk Kim * 131a9d8d09cSJung-uk Kim * PARAMETERS: Address - Table physical address 132a9d8d09cSJung-uk Kim * Header - Table header 133a9d8d09cSJung-uk Kim * 134a9d8d09cSJung-uk Kim * RETURN: None 135a9d8d09cSJung-uk Kim * 136a9d8d09cSJung-uk Kim * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. 137a9d8d09cSJung-uk Kim * 138a9d8d09cSJung-uk Kim ******************************************************************************/ 139a9d8d09cSJung-uk Kim 140a9d8d09cSJung-uk Kim void 141a9d8d09cSJung-uk Kim AcpiTbPrintTableHeader ( 142a9d8d09cSJung-uk Kim ACPI_PHYSICAL_ADDRESS Address, 143a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *Header) 144a9d8d09cSJung-uk Kim { 145a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER LocalHeader; 146a9d8d09cSJung-uk Kim 147a9d8d09cSJung-uk Kim 148a9d8d09cSJung-uk Kim if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS)) 149a9d8d09cSJung-uk Kim { 150a9d8d09cSJung-uk Kim /* FACS only has signature and length fields */ 151a9d8d09cSJung-uk Kim 152*f8146b88SJung-uk Kim ACPI_INFO (("%-4.4s 0x%8.8X%8.8X %06X", 1537cf3e94aSJung-uk Kim Header->Signature, ACPI_FORMAT_UINT64 (Address), 154a9d8d09cSJung-uk Kim Header->Length)); 155a9d8d09cSJung-uk Kim } 15679c6d946SJung-uk Kim else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature)) 157a9d8d09cSJung-uk Kim { 158a9d8d09cSJung-uk Kim /* RSDP has no common fields */ 159a9d8d09cSJung-uk Kim 160*f8146b88SJung-uk Kim memcpy (LocalHeader.OemId, ACPI_CAST_PTR (ACPI_TABLE_RSDP, 161*f8146b88SJung-uk Kim Header)->OemId, ACPI_OEM_ID_SIZE); 162a9d8d09cSJung-uk Kim AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE); 163a9d8d09cSJung-uk Kim 164*f8146b88SJung-uk Kim ACPI_INFO (("RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)", 1657cf3e94aSJung-uk Kim ACPI_FORMAT_UINT64 (Address), 166a9d8d09cSJung-uk Kim (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ? 167a9d8d09cSJung-uk Kim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20, 168a9d8d09cSJung-uk Kim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision, 169a9d8d09cSJung-uk Kim LocalHeader.OemId)); 170a9d8d09cSJung-uk Kim } 171a9d8d09cSJung-uk Kim else 172a9d8d09cSJung-uk Kim { 173a9d8d09cSJung-uk Kim /* Standard ACPI table with full common header */ 174a9d8d09cSJung-uk Kim 175a9d8d09cSJung-uk Kim AcpiTbCleanupTableHeader (&LocalHeader, Header); 176a9d8d09cSJung-uk Kim 177*f8146b88SJung-uk Kim ACPI_INFO (( 1787cf3e94aSJung-uk Kim "%-4.4s 0x%8.8X%8.8X" 179313a0c13SJung-uk Kim " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)", 1807cf3e94aSJung-uk Kim LocalHeader.Signature, ACPI_FORMAT_UINT64 (Address), 181a9d8d09cSJung-uk Kim LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId, 182a9d8d09cSJung-uk Kim LocalHeader.OemTableId, LocalHeader.OemRevision, 183a9d8d09cSJung-uk Kim LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision)); 184a9d8d09cSJung-uk Kim } 185a9d8d09cSJung-uk Kim } 186a9d8d09cSJung-uk Kim 187a9d8d09cSJung-uk Kim 188a9d8d09cSJung-uk Kim /******************************************************************************* 189a9d8d09cSJung-uk Kim * 190a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbValidateChecksum 191a9d8d09cSJung-uk Kim * 192a9d8d09cSJung-uk Kim * PARAMETERS: Table - ACPI table to verify 193a9d8d09cSJung-uk Kim * Length - Length of entire table 194a9d8d09cSJung-uk Kim * 195a9d8d09cSJung-uk Kim * RETURN: Status 196a9d8d09cSJung-uk Kim * 197a9d8d09cSJung-uk Kim * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns 198a9d8d09cSJung-uk Kim * exception on bad checksum. 199a9d8d09cSJung-uk Kim * 200a9d8d09cSJung-uk Kim ******************************************************************************/ 201a9d8d09cSJung-uk Kim 202a9d8d09cSJung-uk Kim ACPI_STATUS 203a9d8d09cSJung-uk Kim AcpiTbVerifyChecksum ( 204a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *Table, 205a9d8d09cSJung-uk Kim UINT32 Length) 206a9d8d09cSJung-uk Kim { 207a9d8d09cSJung-uk Kim UINT8 Checksum; 208a9d8d09cSJung-uk Kim 209a9d8d09cSJung-uk Kim 21079c6d946SJung-uk Kim /* 21179c6d946SJung-uk Kim * FACS/S3PT: 21279c6d946SJung-uk Kim * They are the odd tables, have no standard ACPI header and no checksum 21379c6d946SJung-uk Kim */ 21479c6d946SJung-uk Kim 21579c6d946SJung-uk Kim if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT) || 21679c6d946SJung-uk Kim ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) 21779c6d946SJung-uk Kim { 21879c6d946SJung-uk Kim return (AE_OK); 21979c6d946SJung-uk Kim } 22079c6d946SJung-uk Kim 221a9d8d09cSJung-uk Kim /* Compute the checksum on the table */ 222a9d8d09cSJung-uk Kim 223a9d8d09cSJung-uk Kim Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); 224a9d8d09cSJung-uk Kim 225a9d8d09cSJung-uk Kim /* Checksum ok? (should be zero) */ 226a9d8d09cSJung-uk Kim 227a9d8d09cSJung-uk Kim if (Checksum) 228a9d8d09cSJung-uk Kim { 229a9d8d09cSJung-uk Kim ACPI_BIOS_WARNING ((AE_INFO, 230a9d8d09cSJung-uk Kim "Incorrect checksum in table [%4.4s] - 0x%2.2X, " 231a9d8d09cSJung-uk Kim "should be 0x%2.2X", 232a9d8d09cSJung-uk Kim Table->Signature, Table->Checksum, 233a9d8d09cSJung-uk Kim (UINT8) (Table->Checksum - Checksum))); 234a9d8d09cSJung-uk Kim 235a9d8d09cSJung-uk Kim #if (ACPI_CHECKSUM_ABORT) 236a9d8d09cSJung-uk Kim return (AE_BAD_CHECKSUM); 237a9d8d09cSJung-uk Kim #endif 238a9d8d09cSJung-uk Kim } 239a9d8d09cSJung-uk Kim 240a9d8d09cSJung-uk Kim return (AE_OK); 241a9d8d09cSJung-uk Kim } 242a9d8d09cSJung-uk Kim 243a9d8d09cSJung-uk Kim 244a9d8d09cSJung-uk Kim /******************************************************************************* 245a9d8d09cSJung-uk Kim * 246a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbChecksum 247a9d8d09cSJung-uk Kim * 248a9d8d09cSJung-uk Kim * PARAMETERS: Buffer - Pointer to memory region to be checked 249a9d8d09cSJung-uk Kim * Length - Length of this memory region 250a9d8d09cSJung-uk Kim * 251a9d8d09cSJung-uk Kim * RETURN: Checksum (UINT8) 252a9d8d09cSJung-uk Kim * 253a9d8d09cSJung-uk Kim * DESCRIPTION: Calculates circular checksum of memory region. 254a9d8d09cSJung-uk Kim * 255a9d8d09cSJung-uk Kim ******************************************************************************/ 256a9d8d09cSJung-uk Kim 257a9d8d09cSJung-uk Kim UINT8 258a9d8d09cSJung-uk Kim AcpiTbChecksum ( 259a9d8d09cSJung-uk Kim UINT8 *Buffer, 260a9d8d09cSJung-uk Kim UINT32 Length) 261a9d8d09cSJung-uk Kim { 262a9d8d09cSJung-uk Kim UINT8 Sum = 0; 263a9d8d09cSJung-uk Kim UINT8 *End = Buffer + Length; 264a9d8d09cSJung-uk Kim 265a9d8d09cSJung-uk Kim 266a9d8d09cSJung-uk Kim while (Buffer < End) 267a9d8d09cSJung-uk Kim { 268a9d8d09cSJung-uk Kim Sum = (UINT8) (Sum + *(Buffer++)); 269a9d8d09cSJung-uk Kim } 270a9d8d09cSJung-uk Kim 271a9d8d09cSJung-uk Kim return (Sum); 272a9d8d09cSJung-uk Kim } 273