1250757Sjkim/****************************************************************************** 2250757Sjkim * 3250757Sjkim * Module Name: tbprint - Table output utilities 4250757Sjkim * 5250757Sjkim *****************************************************************************/ 6250757Sjkim 7250757Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, 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 { 87306536Sjkim if (!isprint ((int) *String)) 88250757Sjkim { 89250757Sjkim *String = '?'; 90250757Sjkim } 91306536Sjkim 92250757Sjkim String++; 93250757Sjkim Length--; 94250757Sjkim } 95250757Sjkim} 96250757Sjkim 97250757Sjkim 98250757Sjkim/******************************************************************************* 99250757Sjkim * 100250757Sjkim * FUNCTION: AcpiTbCleanupTableHeader 101250757Sjkim * 102250757Sjkim * PARAMETERS: OutHeader - Where the cleaned header is returned 103250757Sjkim * Header - Input ACPI table header 104250757Sjkim * 105250757Sjkim * RETURN: Returns the cleaned header in OutHeader 106250757Sjkim * 107250757Sjkim * DESCRIPTION: Copy the table header and ensure that all "string" fields in 108250757Sjkim * the header consist of printable characters. 109250757Sjkim * 110250757Sjkim ******************************************************************************/ 111250757Sjkim 112250757Sjkimstatic void 113250757SjkimAcpiTbCleanupTableHeader ( 114250757Sjkim ACPI_TABLE_HEADER *OutHeader, 115250757Sjkim ACPI_TABLE_HEADER *Header) 116250757Sjkim{ 117250757Sjkim 118306536Sjkim memcpy (OutHeader, Header, sizeof (ACPI_TABLE_HEADER)); 119250757Sjkim 120250757Sjkim AcpiTbFixString (OutHeader->Signature, ACPI_NAME_SIZE); 121250757Sjkim AcpiTbFixString (OutHeader->OemId, ACPI_OEM_ID_SIZE); 122250757Sjkim AcpiTbFixString (OutHeader->OemTableId, ACPI_OEM_TABLE_ID_SIZE); 123250757Sjkim AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE); 124250757Sjkim} 125250757Sjkim 126250757Sjkim 127250757Sjkim/******************************************************************************* 128250757Sjkim * 129250757Sjkim * FUNCTION: AcpiTbPrintTableHeader 130250757Sjkim * 131250757Sjkim * PARAMETERS: Address - Table physical address 132250757Sjkim * Header - Table header 133250757Sjkim * 134250757Sjkim * RETURN: None 135250757Sjkim * 136250757Sjkim * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. 137250757Sjkim * 138250757Sjkim ******************************************************************************/ 139250757Sjkim 140250757Sjkimvoid 141250757SjkimAcpiTbPrintTableHeader ( 142250757Sjkim ACPI_PHYSICAL_ADDRESS Address, 143250757Sjkim ACPI_TABLE_HEADER *Header) 144250757Sjkim{ 145250757Sjkim ACPI_TABLE_HEADER LocalHeader; 146250757Sjkim 147250757Sjkim 148250757Sjkim if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS)) 149250757Sjkim { 150250757Sjkim /* FACS only has signature and length fields */ 151250757Sjkim 152306536Sjkim ACPI_INFO (("%-4.4s 0x%8.8X%8.8X %06X", 153281687Sjkim Header->Signature, ACPI_FORMAT_UINT64 (Address), 154250757Sjkim Header->Length)); 155250757Sjkim } 156254745Sjkim else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature)) 157250757Sjkim { 158250757Sjkim /* RSDP has no common fields */ 159250757Sjkim 160306536Sjkim memcpy (LocalHeader.OemId, ACPI_CAST_PTR (ACPI_TABLE_RSDP, 161306536Sjkim Header)->OemId, ACPI_OEM_ID_SIZE); 162250757Sjkim AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE); 163250757Sjkim 164306536Sjkim ACPI_INFO (("RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)", 165281687Sjkim ACPI_FORMAT_UINT64 (Address), 166250757Sjkim (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ? 167250757Sjkim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20, 168250757Sjkim ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision, 169250757Sjkim LocalHeader.OemId)); 170250757Sjkim } 171250757Sjkim else 172250757Sjkim { 173250757Sjkim /* Standard ACPI table with full common header */ 174250757Sjkim 175250757Sjkim AcpiTbCleanupTableHeader (&LocalHeader, Header); 176250757Sjkim 177306536Sjkim ACPI_INFO (( 178281687Sjkim "%-4.4s 0x%8.8X%8.8X" 179281075Sdim " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)", 180281687Sjkim LocalHeader.Signature, ACPI_FORMAT_UINT64 (Address), 181250757Sjkim LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId, 182250757Sjkim LocalHeader.OemTableId, LocalHeader.OemRevision, 183250757Sjkim LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision)); 184250757Sjkim } 185250757Sjkim} 186250757Sjkim 187250757Sjkim 188250757Sjkim/******************************************************************************* 189250757Sjkim * 190250757Sjkim * FUNCTION: AcpiTbValidateChecksum 191250757Sjkim * 192250757Sjkim * PARAMETERS: Table - ACPI table to verify 193250757Sjkim * Length - Length of entire table 194250757Sjkim * 195250757Sjkim * RETURN: Status 196250757Sjkim * 197250757Sjkim * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns 198250757Sjkim * exception on bad checksum. 199250757Sjkim * 200250757Sjkim ******************************************************************************/ 201250757Sjkim 202250757SjkimACPI_STATUS 203250757SjkimAcpiTbVerifyChecksum ( 204250757Sjkim ACPI_TABLE_HEADER *Table, 205250757Sjkim UINT32 Length) 206250757Sjkim{ 207250757Sjkim UINT8 Checksum; 208250757Sjkim 209250757Sjkim 210254745Sjkim /* 211254745Sjkim * FACS/S3PT: 212254745Sjkim * They are the odd tables, have no standard ACPI header and no checksum 213254745Sjkim */ 214254745Sjkim 215254745Sjkim if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT) || 216254745Sjkim ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) 217254745Sjkim { 218254745Sjkim return (AE_OK); 219254745Sjkim } 220254745Sjkim 221250757Sjkim /* Compute the checksum on the table */ 222250757Sjkim 223250757Sjkim Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); 224250757Sjkim 225250757Sjkim /* Checksum ok? (should be zero) */ 226250757Sjkim 227250757Sjkim if (Checksum) 228250757Sjkim { 229250757Sjkim ACPI_BIOS_WARNING ((AE_INFO, 230250757Sjkim "Incorrect checksum in table [%4.4s] - 0x%2.2X, " 231250757Sjkim "should be 0x%2.2X", 232250757Sjkim Table->Signature, Table->Checksum, 233250757Sjkim (UINT8) (Table->Checksum - Checksum))); 234250757Sjkim 235250757Sjkim#if (ACPI_CHECKSUM_ABORT) 236250757Sjkim return (AE_BAD_CHECKSUM); 237250757Sjkim#endif 238250757Sjkim } 239250757Sjkim 240250757Sjkim return (AE_OK); 241250757Sjkim} 242250757Sjkim 243250757Sjkim 244250757Sjkim/******************************************************************************* 245250757Sjkim * 246250757Sjkim * FUNCTION: AcpiTbChecksum 247250757Sjkim * 248250757Sjkim * PARAMETERS: Buffer - Pointer to memory region to be checked 249250757Sjkim * Length - Length of this memory region 250250757Sjkim * 251250757Sjkim * RETURN: Checksum (UINT8) 252250757Sjkim * 253250757Sjkim * DESCRIPTION: Calculates circular checksum of memory region. 254250757Sjkim * 255250757Sjkim ******************************************************************************/ 256250757Sjkim 257250757SjkimUINT8 258250757SjkimAcpiTbChecksum ( 259250757Sjkim UINT8 *Buffer, 260250757Sjkim UINT32 Length) 261250757Sjkim{ 262250757Sjkim UINT8 Sum = 0; 263250757Sjkim UINT8 *End = Buffer + Length; 264250757Sjkim 265250757Sjkim 266250757Sjkim while (Buffer < End) 267250757Sjkim { 268250757Sjkim Sum = (UINT8) (Sum + *(Buffer++)); 269250757Sjkim } 270250757Sjkim 271250757Sjkim return (Sum); 272250757Sjkim} 273