1 /****************************************************************************** 2 * 3 * Module Name: tbprint - Table output utilities 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2015, 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 <contrib/dev/acpica/include/acpi.h> 45 #include <contrib/dev/acpica/include/accommon.h> 46 #include <contrib/dev/acpica/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 String++; 92 Length--; 93 } 94 } 95 96 97 /******************************************************************************* 98 * 99 * FUNCTION: AcpiTbCleanupTableHeader 100 * 101 * PARAMETERS: OutHeader - Where the cleaned header is returned 102 * Header - Input ACPI table header 103 * 104 * RETURN: Returns the cleaned header in OutHeader 105 * 106 * DESCRIPTION: Copy the table header and ensure that all "string" fields in 107 * the header consist of printable characters. 108 * 109 ******************************************************************************/ 110 111 static void 112 AcpiTbCleanupTableHeader ( 113 ACPI_TABLE_HEADER *OutHeader, 114 ACPI_TABLE_HEADER *Header) 115 { 116 117 memcpy (OutHeader, Header, sizeof (ACPI_TABLE_HEADER)); 118 119 AcpiTbFixString (OutHeader->Signature, ACPI_NAME_SIZE); 120 AcpiTbFixString (OutHeader->OemId, ACPI_OEM_ID_SIZE); 121 AcpiTbFixString (OutHeader->OemTableId, ACPI_OEM_TABLE_ID_SIZE); 122 AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE); 123 } 124 125 126 /******************************************************************************* 127 * 128 * FUNCTION: AcpiTbPrintTableHeader 129 * 130 * PARAMETERS: Address - Table physical address 131 * Header - Table header 132 * 133 * RETURN: None 134 * 135 * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. 136 * 137 ******************************************************************************/ 138 139 void 140 AcpiTbPrintTableHeader ( 141 ACPI_PHYSICAL_ADDRESS Address, 142 ACPI_TABLE_HEADER *Header) 143 { 144 ACPI_TABLE_HEADER LocalHeader; 145 146 147 if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS)) 148 { 149 /* FACS only has signature and length fields */ 150 151 ACPI_INFO ((AE_INFO, "%-4.4s 0x%8.8X%8.8X %06X", 152 Header->Signature, ACPI_FORMAT_UINT64 (Address), 153 Header->Length)); 154 } 155 else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature)) 156 { 157 /* RSDP has no common fields */ 158 159 memcpy (LocalHeader.OemId, 160 ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->OemId, ACPI_OEM_ID_SIZE); 161 AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE); 162 163 ACPI_INFO ((AE_INFO, "RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)", 164 ACPI_FORMAT_UINT64 (Address), 165 (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ? 166 ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20, 167 ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision, 168 LocalHeader.OemId)); 169 } 170 else 171 { 172 /* Standard ACPI table with full common header */ 173 174 AcpiTbCleanupTableHeader (&LocalHeader, Header); 175 176 ACPI_INFO ((AE_INFO, 177 "%-4.4s 0x%8.8X%8.8X" 178 " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)", 179 LocalHeader.Signature, ACPI_FORMAT_UINT64 (Address), 180 LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId, 181 LocalHeader.OemTableId, LocalHeader.OemRevision, 182 LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision)); 183 } 184 } 185 186 187 /******************************************************************************* 188 * 189 * FUNCTION: AcpiTbValidateChecksum 190 * 191 * PARAMETERS: Table - ACPI table to verify 192 * Length - Length of entire table 193 * 194 * RETURN: Status 195 * 196 * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns 197 * exception on bad checksum. 198 * 199 ******************************************************************************/ 200 201 ACPI_STATUS 202 AcpiTbVerifyChecksum ( 203 ACPI_TABLE_HEADER *Table, 204 UINT32 Length) 205 { 206 UINT8 Checksum; 207 208 209 /* 210 * FACS/S3PT: 211 * They are the odd tables, have no standard ACPI header and no checksum 212 */ 213 214 if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT) || 215 ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) 216 { 217 return (AE_OK); 218 } 219 220 /* Compute the checksum on the table */ 221 222 Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); 223 224 /* Checksum ok? (should be zero) */ 225 226 if (Checksum) 227 { 228 ACPI_BIOS_WARNING ((AE_INFO, 229 "Incorrect checksum in table [%4.4s] - 0x%2.2X, " 230 "should be 0x%2.2X", 231 Table->Signature, Table->Checksum, 232 (UINT8) (Table->Checksum - Checksum))); 233 234 #if (ACPI_CHECKSUM_ABORT) 235 return (AE_BAD_CHECKSUM); 236 #endif 237 } 238 239 return (AE_OK); 240 } 241 242 243 /******************************************************************************* 244 * 245 * FUNCTION: AcpiTbChecksum 246 * 247 * PARAMETERS: Buffer - Pointer to memory region to be checked 248 * Length - Length of this memory region 249 * 250 * RETURN: Checksum (UINT8) 251 * 252 * DESCRIPTION: Calculates circular checksum of memory region. 253 * 254 ******************************************************************************/ 255 256 UINT8 257 AcpiTbChecksum ( 258 UINT8 *Buffer, 259 UINT32 Length) 260 { 261 UINT8 Sum = 0; 262 UINT8 *End = Buffer + Length; 263 264 265 while (Buffer < End) 266 { 267 Sum = (UINT8) (Sum + *(Buffer++)); 268 } 269 270 return (Sum); 271 } 272