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