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*313a0c13SJung-uk Kim * Copyright (C) 2000 - 2014, 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 #define __TBPRINT_C__ 45a9d8d09cSJung-uk Kim 46a9d8d09cSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 47a9d8d09cSJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 48a9d8d09cSJung-uk Kim #include <contrib/dev/acpica/include/actables.h> 49a9d8d09cSJung-uk Kim 50a9d8d09cSJung-uk Kim #define _COMPONENT ACPI_TABLES 51a9d8d09cSJung-uk Kim ACPI_MODULE_NAME ("tbprint") 52a9d8d09cSJung-uk Kim 53a9d8d09cSJung-uk Kim 54a9d8d09cSJung-uk Kim /* Local prototypes */ 55a9d8d09cSJung-uk Kim 56a9d8d09cSJung-uk Kim static void 57a9d8d09cSJung-uk Kim AcpiTbFixString ( 58a9d8d09cSJung-uk Kim char *String, 59a9d8d09cSJung-uk Kim ACPI_SIZE Length); 60a9d8d09cSJung-uk Kim 61a9d8d09cSJung-uk Kim static void 62a9d8d09cSJung-uk Kim AcpiTbCleanupTableHeader ( 63a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *OutHeader, 64a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *Header); 65a9d8d09cSJung-uk Kim 66a9d8d09cSJung-uk Kim 67a9d8d09cSJung-uk Kim /******************************************************************************* 68a9d8d09cSJung-uk Kim * 69a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbFixString 70a9d8d09cSJung-uk Kim * 71a9d8d09cSJung-uk Kim * PARAMETERS: String - String to be repaired 72a9d8d09cSJung-uk Kim * Length - Maximum length 73a9d8d09cSJung-uk Kim * 74a9d8d09cSJung-uk Kim * RETURN: None 75a9d8d09cSJung-uk Kim * 76a9d8d09cSJung-uk Kim * DESCRIPTION: Replace every non-printable or non-ascii byte in the string 77a9d8d09cSJung-uk Kim * with a question mark '?'. 78a9d8d09cSJung-uk Kim * 79a9d8d09cSJung-uk Kim ******************************************************************************/ 80a9d8d09cSJung-uk Kim 81a9d8d09cSJung-uk Kim static void 82a9d8d09cSJung-uk Kim AcpiTbFixString ( 83a9d8d09cSJung-uk Kim char *String, 84a9d8d09cSJung-uk Kim ACPI_SIZE Length) 85a9d8d09cSJung-uk Kim { 86a9d8d09cSJung-uk Kim 87a9d8d09cSJung-uk Kim while (Length && *String) 88a9d8d09cSJung-uk Kim { 89a9d8d09cSJung-uk Kim if (!ACPI_IS_PRINT (*String)) 90a9d8d09cSJung-uk Kim { 91a9d8d09cSJung-uk Kim *String = '?'; 92a9d8d09cSJung-uk Kim } 93a9d8d09cSJung-uk Kim String++; 94a9d8d09cSJung-uk Kim Length--; 95a9d8d09cSJung-uk Kim } 96a9d8d09cSJung-uk Kim } 97a9d8d09cSJung-uk Kim 98a9d8d09cSJung-uk Kim 99a9d8d09cSJung-uk Kim /******************************************************************************* 100a9d8d09cSJung-uk Kim * 101a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbCleanupTableHeader 102a9d8d09cSJung-uk Kim * 103a9d8d09cSJung-uk Kim * PARAMETERS: OutHeader - Where the cleaned header is returned 104a9d8d09cSJung-uk Kim * Header - Input ACPI table header 105a9d8d09cSJung-uk Kim * 106a9d8d09cSJung-uk Kim * RETURN: Returns the cleaned header in OutHeader 107a9d8d09cSJung-uk Kim * 108a9d8d09cSJung-uk Kim * DESCRIPTION: Copy the table header and ensure that all "string" fields in 109a9d8d09cSJung-uk Kim * the header consist of printable characters. 110a9d8d09cSJung-uk Kim * 111a9d8d09cSJung-uk Kim ******************************************************************************/ 112a9d8d09cSJung-uk Kim 113a9d8d09cSJung-uk Kim static void 114a9d8d09cSJung-uk Kim AcpiTbCleanupTableHeader ( 115a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *OutHeader, 116a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *Header) 117a9d8d09cSJung-uk Kim { 118a9d8d09cSJung-uk Kim 119a9d8d09cSJung-uk Kim ACPI_MEMCPY (OutHeader, Header, sizeof (ACPI_TABLE_HEADER)); 120a9d8d09cSJung-uk Kim 121a9d8d09cSJung-uk Kim AcpiTbFixString (OutHeader->Signature, ACPI_NAME_SIZE); 122a9d8d09cSJung-uk Kim AcpiTbFixString (OutHeader->OemId, ACPI_OEM_ID_SIZE); 123a9d8d09cSJung-uk Kim AcpiTbFixString (OutHeader->OemTableId, ACPI_OEM_TABLE_ID_SIZE); 124a9d8d09cSJung-uk Kim AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE); 125a9d8d09cSJung-uk Kim } 126a9d8d09cSJung-uk Kim 127a9d8d09cSJung-uk Kim 128a9d8d09cSJung-uk Kim /******************************************************************************* 129a9d8d09cSJung-uk Kim * 130a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbPrintTableHeader 131a9d8d09cSJung-uk Kim * 132a9d8d09cSJung-uk Kim * PARAMETERS: Address - Table physical address 133a9d8d09cSJung-uk Kim * Header - Table header 134a9d8d09cSJung-uk Kim * 135a9d8d09cSJung-uk Kim * RETURN: None 136a9d8d09cSJung-uk Kim * 137a9d8d09cSJung-uk Kim * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. 138a9d8d09cSJung-uk Kim * 139a9d8d09cSJung-uk Kim ******************************************************************************/ 140a9d8d09cSJung-uk Kim 141a9d8d09cSJung-uk Kim void 142a9d8d09cSJung-uk Kim AcpiTbPrintTableHeader ( 143a9d8d09cSJung-uk Kim ACPI_PHYSICAL_ADDRESS Address, 144a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *Header) 145a9d8d09cSJung-uk Kim { 146a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER LocalHeader; 147a9d8d09cSJung-uk Kim 148a9d8d09cSJung-uk Kim 149a9d8d09cSJung-uk Kim /* 150*313a0c13SJung-uk Kim * The reason that we use ACPI_PRINTF_UINT and ACPI_FORMAT_TO_UINT is to 151*313a0c13SJung-uk Kim * support both 32-bit and 64-bit hosts/addresses in a consistent manner. 152*313a0c13SJung-uk Kim * The %p specifier does not emit uniform output on all hosts. On some, 153*313a0c13SJung-uk Kim * leading zeros are not supported. 154a9d8d09cSJung-uk Kim */ 155a9d8d09cSJung-uk Kim if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS)) 156a9d8d09cSJung-uk Kim { 157a9d8d09cSJung-uk Kim /* FACS only has signature and length fields */ 158a9d8d09cSJung-uk Kim 159*313a0c13SJung-uk Kim ACPI_INFO ((AE_INFO, "%-4.4s " ACPI_PRINTF_UINT " %06X", 160*313a0c13SJung-uk Kim Header->Signature, ACPI_FORMAT_TO_UINT (Address), 161a9d8d09cSJung-uk Kim Header->Length)); 162a9d8d09cSJung-uk Kim } 16379c6d946SJung-uk Kim else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature)) 164a9d8d09cSJung-uk Kim { 165a9d8d09cSJung-uk Kim /* RSDP has no common fields */ 166a9d8d09cSJung-uk Kim 167a9d8d09cSJung-uk Kim ACPI_MEMCPY (LocalHeader.OemId, 168a9d8d09cSJung-uk Kim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->OemId, ACPI_OEM_ID_SIZE); 169a9d8d09cSJung-uk Kim AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE); 170a9d8d09cSJung-uk Kim 171*313a0c13SJung-uk Kim ACPI_INFO ((AE_INFO, "RSDP " ACPI_PRINTF_UINT " %06X (v%.2d %-6.6s)", 172*313a0c13SJung-uk Kim ACPI_FORMAT_TO_UINT (Address), 173a9d8d09cSJung-uk Kim (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ? 174a9d8d09cSJung-uk Kim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20, 175a9d8d09cSJung-uk Kim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision, 176a9d8d09cSJung-uk Kim LocalHeader.OemId)); 177a9d8d09cSJung-uk Kim } 178a9d8d09cSJung-uk Kim else 179a9d8d09cSJung-uk Kim { 180a9d8d09cSJung-uk Kim /* Standard ACPI table with full common header */ 181a9d8d09cSJung-uk Kim 182a9d8d09cSJung-uk Kim AcpiTbCleanupTableHeader (&LocalHeader, Header); 183a9d8d09cSJung-uk Kim 184a9d8d09cSJung-uk Kim ACPI_INFO ((AE_INFO, 185*313a0c13SJung-uk Kim "%-4.4s " ACPI_PRINTF_UINT 186*313a0c13SJung-uk Kim " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)", 187*313a0c13SJung-uk Kim LocalHeader.Signature, ACPI_FORMAT_TO_UINT (Address), 188a9d8d09cSJung-uk Kim LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId, 189a9d8d09cSJung-uk Kim LocalHeader.OemTableId, LocalHeader.OemRevision, 190a9d8d09cSJung-uk Kim LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision)); 191a9d8d09cSJung-uk Kim } 192a9d8d09cSJung-uk Kim } 193a9d8d09cSJung-uk Kim 194a9d8d09cSJung-uk Kim 195a9d8d09cSJung-uk Kim /******************************************************************************* 196a9d8d09cSJung-uk Kim * 197a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbValidateChecksum 198a9d8d09cSJung-uk Kim * 199a9d8d09cSJung-uk Kim * PARAMETERS: Table - ACPI table to verify 200a9d8d09cSJung-uk Kim * Length - Length of entire table 201a9d8d09cSJung-uk Kim * 202a9d8d09cSJung-uk Kim * RETURN: Status 203a9d8d09cSJung-uk Kim * 204a9d8d09cSJung-uk Kim * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns 205a9d8d09cSJung-uk Kim * exception on bad checksum. 206a9d8d09cSJung-uk Kim * 207a9d8d09cSJung-uk Kim ******************************************************************************/ 208a9d8d09cSJung-uk Kim 209a9d8d09cSJung-uk Kim ACPI_STATUS 210a9d8d09cSJung-uk Kim AcpiTbVerifyChecksum ( 211a9d8d09cSJung-uk Kim ACPI_TABLE_HEADER *Table, 212a9d8d09cSJung-uk Kim UINT32 Length) 213a9d8d09cSJung-uk Kim { 214a9d8d09cSJung-uk Kim UINT8 Checksum; 215a9d8d09cSJung-uk Kim 216a9d8d09cSJung-uk Kim 21779c6d946SJung-uk Kim /* 21879c6d946SJung-uk Kim * FACS/S3PT: 21979c6d946SJung-uk Kim * They are the odd tables, have no standard ACPI header and no checksum 22079c6d946SJung-uk Kim */ 22179c6d946SJung-uk Kim 22279c6d946SJung-uk Kim if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT) || 22379c6d946SJung-uk Kim ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) 22479c6d946SJung-uk Kim { 22579c6d946SJung-uk Kim return (AE_OK); 22679c6d946SJung-uk Kim } 22779c6d946SJung-uk Kim 228a9d8d09cSJung-uk Kim /* Compute the checksum on the table */ 229a9d8d09cSJung-uk Kim 230a9d8d09cSJung-uk Kim Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); 231a9d8d09cSJung-uk Kim 232a9d8d09cSJung-uk Kim /* Checksum ok? (should be zero) */ 233a9d8d09cSJung-uk Kim 234a9d8d09cSJung-uk Kim if (Checksum) 235a9d8d09cSJung-uk Kim { 236a9d8d09cSJung-uk Kim ACPI_BIOS_WARNING ((AE_INFO, 237a9d8d09cSJung-uk Kim "Incorrect checksum in table [%4.4s] - 0x%2.2X, " 238a9d8d09cSJung-uk Kim "should be 0x%2.2X", 239a9d8d09cSJung-uk Kim Table->Signature, Table->Checksum, 240a9d8d09cSJung-uk Kim (UINT8) (Table->Checksum - Checksum))); 241a9d8d09cSJung-uk Kim 242a9d8d09cSJung-uk Kim #if (ACPI_CHECKSUM_ABORT) 243a9d8d09cSJung-uk Kim return (AE_BAD_CHECKSUM); 244a9d8d09cSJung-uk Kim #endif 245a9d8d09cSJung-uk Kim } 246a9d8d09cSJung-uk Kim 247a9d8d09cSJung-uk Kim return (AE_OK); 248a9d8d09cSJung-uk Kim } 249a9d8d09cSJung-uk Kim 250a9d8d09cSJung-uk Kim 251a9d8d09cSJung-uk Kim /******************************************************************************* 252a9d8d09cSJung-uk Kim * 253a9d8d09cSJung-uk Kim * FUNCTION: AcpiTbChecksum 254a9d8d09cSJung-uk Kim * 255a9d8d09cSJung-uk Kim * PARAMETERS: Buffer - Pointer to memory region to be checked 256a9d8d09cSJung-uk Kim * Length - Length of this memory region 257a9d8d09cSJung-uk Kim * 258a9d8d09cSJung-uk Kim * RETURN: Checksum (UINT8) 259a9d8d09cSJung-uk Kim * 260a9d8d09cSJung-uk Kim * DESCRIPTION: Calculates circular checksum of memory region. 261a9d8d09cSJung-uk Kim * 262a9d8d09cSJung-uk Kim ******************************************************************************/ 263a9d8d09cSJung-uk Kim 264a9d8d09cSJung-uk Kim UINT8 265a9d8d09cSJung-uk Kim AcpiTbChecksum ( 266a9d8d09cSJung-uk Kim UINT8 *Buffer, 267a9d8d09cSJung-uk Kim UINT32 Length) 268a9d8d09cSJung-uk Kim { 269a9d8d09cSJung-uk Kim UINT8 Sum = 0; 270a9d8d09cSJung-uk Kim UINT8 *End = Buffer + Length; 271a9d8d09cSJung-uk Kim 272a9d8d09cSJung-uk Kim 273a9d8d09cSJung-uk Kim while (Buffer < End) 274a9d8d09cSJung-uk Kim { 275a9d8d09cSJung-uk Kim Sum = (UINT8) (Sum + *(Buffer++)); 276a9d8d09cSJung-uk Kim } 277a9d8d09cSJung-uk Kim 278a9d8d09cSJung-uk Kim return (Sum); 279a9d8d09cSJung-uk Kim } 280