1250757Sjkim/****************************************************************************** 2250757Sjkim * 3250757Sjkim * Module Name: tbprint - Table output utilities 4250757Sjkim * 5250757Sjkim *****************************************************************************/ 6250757Sjkim 7250757Sjkim/* 8281075Sdim * Copyright (C) 2000 - 2015, Intel Corp. 9250757Sjkim * All rights reserved. 10250757Sjkim * 11250757Sjkim * Redistribution and use in source and binary forms, with or without 12250757Sjkim * modification, are permitted provided that the following conditions 13250757Sjkim * are met: 14250757Sjkim * 1. Redistributions of source code must retain the above copyright 15250757Sjkim * notice, this list of conditions, and the following disclaimer, 16250757Sjkim * without modification. 17250757Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18250757Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19250757Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20250757Sjkim * including a substantially similar Disclaimer requirement for further 21250757Sjkim * binary redistribution. 22250757Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23250757Sjkim * of any contributors may be used to endorse or promote products derived 24250757Sjkim * from this software without specific prior written permission. 25250757Sjkim * 26250757Sjkim * Alternatively, this software may be distributed under the terms of the 27250757Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28250757Sjkim * Software Foundation. 29250757Sjkim * 30250757Sjkim * NO WARRANTY 31250757Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32250757Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33250757Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34250757Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35250757Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36250757Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37250757Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38250757Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39250757Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40250757Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41250757Sjkim * POSSIBILITY OF SUCH DAMAGES. 42250757Sjkim */ 43250757Sjkim 44250838Sjkim#include <contrib/dev/acpica/include/acpi.h> 45250838Sjkim#include <contrib/dev/acpica/include/accommon.h> 46250838Sjkim#include <contrib/dev/acpica/include/actables.h> 47250757Sjkim 48250757Sjkim#define _COMPONENT ACPI_TABLES 49250757Sjkim ACPI_MODULE_NAME ("tbprint") 50250757Sjkim 51250757Sjkim 52250757Sjkim/* Local prototypes */ 53250757Sjkim 54250757Sjkimstatic void 55250757SjkimAcpiTbFixString ( 56250757Sjkim char *String, 57250757Sjkim ACPI_SIZE Length); 58250757Sjkim 59250757Sjkimstatic void 60250757SjkimAcpiTbCleanupTableHeader ( 61250757Sjkim ACPI_TABLE_HEADER *OutHeader, 62250757Sjkim ACPI_TABLE_HEADER *Header); 63250757Sjkim 64250757Sjkim 65250757Sjkim/******************************************************************************* 66250757Sjkim * 67250757Sjkim * FUNCTION: AcpiTbFixString 68250757Sjkim * 69250757Sjkim * PARAMETERS: String - String to be repaired 70250757Sjkim * Length - Maximum length 71250757Sjkim * 72250757Sjkim * RETURN: None 73250757Sjkim * 74250757Sjkim * DESCRIPTION: Replace every non-printable or non-ascii byte in the string 75250757Sjkim * with a question mark '?'. 76250757Sjkim * 77250757Sjkim ******************************************************************************/ 78250757Sjkim 79250757Sjkimstatic void 80250757SjkimAcpiTbFixString ( 81250757Sjkim char *String, 82250757Sjkim ACPI_SIZE Length) 83250757Sjkim{ 84250757Sjkim 85250757Sjkim while (Length && *String) 86250757Sjkim { 87250757Sjkim if (!ACPI_IS_PRINT (*String)) 88250757Sjkim { 89250757Sjkim *String = '?'; 90250757Sjkim } 91250757Sjkim String++; 92250757Sjkim Length--; 93250757Sjkim } 94250757Sjkim} 95250757Sjkim 96250757Sjkim 97250757Sjkim/******************************************************************************* 98250757Sjkim * 99250757Sjkim * FUNCTION: AcpiTbCleanupTableHeader 100250757Sjkim * 101250757Sjkim * PARAMETERS: OutHeader - Where the cleaned header is returned 102250757Sjkim * Header - Input ACPI table header 103250757Sjkim * 104250757Sjkim * RETURN: Returns the cleaned header in OutHeader 105250757Sjkim * 106250757Sjkim * DESCRIPTION: Copy the table header and ensure that all "string" fields in 107250757Sjkim * the header consist of printable characters. 108250757Sjkim * 109250757Sjkim ******************************************************************************/ 110250757Sjkim 111250757Sjkimstatic void 112250757SjkimAcpiTbCleanupTableHeader ( 113250757Sjkim ACPI_TABLE_HEADER *OutHeader, 114250757Sjkim ACPI_TABLE_HEADER *Header) 115250757Sjkim{ 116250757Sjkim 117250757Sjkim ACPI_MEMCPY (OutHeader, Header, sizeof (ACPI_TABLE_HEADER)); 118250757Sjkim 119250757Sjkim AcpiTbFixString (OutHeader->Signature, ACPI_NAME_SIZE); 120250757Sjkim AcpiTbFixString (OutHeader->OemId, ACPI_OEM_ID_SIZE); 121250757Sjkim AcpiTbFixString (OutHeader->OemTableId, ACPI_OEM_TABLE_ID_SIZE); 122250757Sjkim AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE); 123250757Sjkim} 124250757Sjkim 125250757Sjkim 126250757Sjkim/******************************************************************************* 127250757Sjkim * 128250757Sjkim * FUNCTION: AcpiTbPrintTableHeader 129250757Sjkim * 130250757Sjkim * PARAMETERS: Address - Table physical address 131250757Sjkim * Header - Table header 132250757Sjkim * 133250757Sjkim * RETURN: None 134250757Sjkim * 135250757Sjkim * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. 136250757Sjkim * 137250757Sjkim ******************************************************************************/ 138250757Sjkim 139250757Sjkimvoid 140250757SjkimAcpiTbPrintTableHeader ( 141250757Sjkim ACPI_PHYSICAL_ADDRESS Address, 142250757Sjkim ACPI_TABLE_HEADER *Header) 143250757Sjkim{ 144250757Sjkim ACPI_TABLE_HEADER LocalHeader; 145250757Sjkim 146250757Sjkim 147250757Sjkim if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS)) 148250757Sjkim { 149250757Sjkim /* FACS only has signature and length fields */ 150250757Sjkim 151281687Sjkim ACPI_INFO ((AE_INFO, "%-4.4s 0x%8.8X%8.8X %06X", 152281687Sjkim Header->Signature, ACPI_FORMAT_UINT64 (Address), 153250757Sjkim Header->Length)); 154250757Sjkim } 155254745Sjkim else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature)) 156250757Sjkim { 157250757Sjkim /* RSDP has no common fields */ 158250757Sjkim 159250757Sjkim ACPI_MEMCPY (LocalHeader.OemId, 160250757Sjkim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->OemId, ACPI_OEM_ID_SIZE); 161250757Sjkim AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE); 162250757Sjkim 163281687Sjkim ACPI_INFO ((AE_INFO, "RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)", 164281687Sjkim ACPI_FORMAT_UINT64 (Address), 165250757Sjkim (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ? 166250757Sjkim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20, 167250757Sjkim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision, 168250757Sjkim LocalHeader.OemId)); 169250757Sjkim } 170250757Sjkim else 171250757Sjkim { 172250757Sjkim /* Standard ACPI table with full common header */ 173250757Sjkim 174250757Sjkim AcpiTbCleanupTableHeader (&LocalHeader, Header); 175250757Sjkim 176250757Sjkim ACPI_INFO ((AE_INFO, 177281687Sjkim "%-4.4s 0x%8.8X%8.8X" 178281075Sdim " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)", 179281687Sjkim LocalHeader.Signature, ACPI_FORMAT_UINT64 (Address), 180250757Sjkim LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId, 181250757Sjkim LocalHeader.OemTableId, LocalHeader.OemRevision, 182250757Sjkim LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision)); 183250757Sjkim } 184250757Sjkim} 185250757Sjkim 186250757Sjkim 187250757Sjkim/******************************************************************************* 188250757Sjkim * 189250757Sjkim * FUNCTION: AcpiTbValidateChecksum 190250757Sjkim * 191250757Sjkim * PARAMETERS: Table - ACPI table to verify 192250757Sjkim * Length - Length of entire table 193250757Sjkim * 194250757Sjkim * RETURN: Status 195250757Sjkim * 196250757Sjkim * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns 197250757Sjkim * exception on bad checksum. 198250757Sjkim * 199250757Sjkim ******************************************************************************/ 200250757Sjkim 201250757SjkimACPI_STATUS 202250757SjkimAcpiTbVerifyChecksum ( 203250757Sjkim ACPI_TABLE_HEADER *Table, 204250757Sjkim UINT32 Length) 205250757Sjkim{ 206250757Sjkim UINT8 Checksum; 207250757Sjkim 208250757Sjkim 209254745Sjkim /* 210254745Sjkim * FACS/S3PT: 211254745Sjkim * They are the odd tables, have no standard ACPI header and no checksum 212254745Sjkim */ 213254745Sjkim 214254745Sjkim if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT) || 215254745Sjkim ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) 216254745Sjkim { 217254745Sjkim return (AE_OK); 218254745Sjkim } 219254745Sjkim 220250757Sjkim /* Compute the checksum on the table */ 221250757Sjkim 222250757Sjkim Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); 223250757Sjkim 224250757Sjkim /* Checksum ok? (should be zero) */ 225250757Sjkim 226250757Sjkim if (Checksum) 227250757Sjkim { 228250757Sjkim ACPI_BIOS_WARNING ((AE_INFO, 229250757Sjkim "Incorrect checksum in table [%4.4s] - 0x%2.2X, " 230250757Sjkim "should be 0x%2.2X", 231250757Sjkim Table->Signature, Table->Checksum, 232250757Sjkim (UINT8) (Table->Checksum - Checksum))); 233250757Sjkim 234250757Sjkim#if (ACPI_CHECKSUM_ABORT) 235250757Sjkim return (AE_BAD_CHECKSUM); 236250757Sjkim#endif 237250757Sjkim } 238250757Sjkim 239250757Sjkim return (AE_OK); 240250757Sjkim} 241250757Sjkim 242250757Sjkim 243250757Sjkim/******************************************************************************* 244250757Sjkim * 245250757Sjkim * FUNCTION: AcpiTbChecksum 246250757Sjkim * 247250757Sjkim * PARAMETERS: Buffer - Pointer to memory region to be checked 248250757Sjkim * Length - Length of this memory region 249250757Sjkim * 250250757Sjkim * RETURN: Checksum (UINT8) 251250757Sjkim * 252250757Sjkim * DESCRIPTION: Calculates circular checksum of memory region. 253250757Sjkim * 254250757Sjkim ******************************************************************************/ 255250757Sjkim 256250757SjkimUINT8 257250757SjkimAcpiTbChecksum ( 258250757Sjkim UINT8 *Buffer, 259250757Sjkim UINT32 Length) 260250757Sjkim{ 261250757Sjkim UINT8 Sum = 0; 262250757Sjkim UINT8 *End = Buffer + Length; 263250757Sjkim 264250757Sjkim 265250757Sjkim while (Buffer < End) 266250757Sjkim { 267250757Sjkim Sum = (UINT8) (Sum + *(Buffer++)); 268250757Sjkim } 269250757Sjkim 270250757Sjkim return (Sum); 271250757Sjkim} 272