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