195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 242f47869SBob Moore /****************************************************************************** 342f47869SBob Moore * 442f47869SBob Moore * Module Name: tbprint - Table output utilities 542f47869SBob Moore * 6487ea80aSBob Moore * Copyright (C) 2000 - 2022, Intel Corp. 742f47869SBob Moore * 895857638SErik Schmauss *****************************************************************************/ 942f47869SBob Moore 1042f47869SBob Moore #include <acpi/acpi.h> 1142f47869SBob Moore #include "accommon.h" 1242f47869SBob Moore #include "actables.h" 13*51aad1a6SBob Moore #include "acutils.h" 1442f47869SBob Moore 1542f47869SBob Moore #define _COMPONENT ACPI_TABLES 1642f47869SBob Moore ACPI_MODULE_NAME("tbprint") 1742f47869SBob Moore 1842f47869SBob Moore /* Local prototypes */ 1942f47869SBob Moore static void acpi_tb_fix_string(char *string, acpi_size length); 2042f47869SBob Moore 2142f47869SBob Moore static void 2242f47869SBob Moore acpi_tb_cleanup_table_header(struct acpi_table_header *out_header, 2342f47869SBob Moore struct acpi_table_header *header); 2442f47869SBob Moore 2542f47869SBob Moore /******************************************************************************* 2642f47869SBob Moore * 2742f47869SBob Moore * FUNCTION: acpi_tb_fix_string 2842f47869SBob Moore * 2942f47869SBob Moore * PARAMETERS: string - String to be repaired 3042f47869SBob Moore * length - Maximum length 3142f47869SBob Moore * 3242f47869SBob Moore * RETURN: None 3342f47869SBob Moore * 3442f47869SBob Moore * DESCRIPTION: Replace every non-printable or non-ascii byte in the string 3542f47869SBob Moore * with a question mark '?'. 3642f47869SBob Moore * 3742f47869SBob Moore ******************************************************************************/ 3842f47869SBob Moore 3942f47869SBob Moore static void acpi_tb_fix_string(char *string, acpi_size length) 4042f47869SBob Moore { 4142f47869SBob Moore 4242f47869SBob Moore while (length && *string) { 43*51aad1a6SBob Moore if (!isprint((int)(u8)*string)) { 4442f47869SBob Moore *string = '?'; 4542f47869SBob Moore } 461fad8738SBob Moore 4742f47869SBob Moore string++; 4842f47869SBob Moore length--; 4942f47869SBob Moore } 5042f47869SBob Moore } 5142f47869SBob Moore 5242f47869SBob Moore /******************************************************************************* 5342f47869SBob Moore * 5442f47869SBob Moore * FUNCTION: acpi_tb_cleanup_table_header 5542f47869SBob Moore * 5642f47869SBob Moore * PARAMETERS: out_header - Where the cleaned header is returned 5742f47869SBob Moore * header - Input ACPI table header 5842f47869SBob Moore * 5942f47869SBob Moore * RETURN: Returns the cleaned header in out_header 6042f47869SBob Moore * 6142f47869SBob Moore * DESCRIPTION: Copy the table header and ensure that all "string" fields in 6242f47869SBob Moore * the header consist of printable characters. 6342f47869SBob Moore * 6442f47869SBob Moore ******************************************************************************/ 6542f47869SBob Moore 6642f47869SBob Moore static void 6742f47869SBob Moore acpi_tb_cleanup_table_header(struct acpi_table_header *out_header, 6842f47869SBob Moore struct acpi_table_header *header) 6942f47869SBob Moore { 7042f47869SBob Moore 714fa4616eSBob Moore memcpy(out_header, header, sizeof(struct acpi_table_header)); 7242f47869SBob Moore 7332786755SBob Moore acpi_tb_fix_string(out_header->signature, ACPI_NAMESEG_SIZE); 7442f47869SBob Moore acpi_tb_fix_string(out_header->oem_id, ACPI_OEM_ID_SIZE); 7542f47869SBob Moore acpi_tb_fix_string(out_header->oem_table_id, ACPI_OEM_TABLE_ID_SIZE); 7632786755SBob Moore acpi_tb_fix_string(out_header->asl_compiler_id, ACPI_NAMESEG_SIZE); 7742f47869SBob Moore } 7842f47869SBob Moore 7942f47869SBob Moore /******************************************************************************* 8042f47869SBob Moore * 8142f47869SBob Moore * FUNCTION: acpi_tb_print_table_header 8242f47869SBob Moore * 8342f47869SBob Moore * PARAMETERS: address - Table physical address 8442f47869SBob Moore * header - Table header 8542f47869SBob Moore * 8642f47869SBob Moore * RETURN: None 8742f47869SBob Moore * 8842f47869SBob Moore * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. 8942f47869SBob Moore * 9042f47869SBob Moore ******************************************************************************/ 9142f47869SBob Moore 9242f47869SBob Moore void 9342f47869SBob Moore acpi_tb_print_table_header(acpi_physical_address address, 9442f47869SBob Moore struct acpi_table_header *header) 9542f47869SBob Moore { 9642f47869SBob Moore struct acpi_table_header local_header; 9742f47869SBob Moore 985599fb69SBob Moore if (ACPI_COMPARE_NAMESEG(header->signature, ACPI_SIG_FACS)) { 9942f47869SBob Moore 10042f47869SBob Moore /* FACS only has signature and length fields */ 10142f47869SBob Moore 10205fb04b5SBob Moore ACPI_INFO(("%-4.4s 0x%8.8X%8.8X %06X", 1031d0a0b2fSLv Zheng header->signature, ACPI_FORMAT_UINT64(address), 10442f47869SBob Moore header->length)); 105a3e525feSJessica Clarke } else if (ACPI_VALIDATE_RSDP_SIG(ACPI_CAST_PTR(struct acpi_table_rsdp, 106a3e525feSJessica Clarke header)->signature)) { 10742f47869SBob Moore 10842f47869SBob Moore /* RSDP has no common fields */ 10942f47869SBob Moore 1104fa4616eSBob Moore memcpy(local_header.oem_id, 1114fa4616eSBob Moore ACPI_CAST_PTR(struct acpi_table_rsdp, header)->oem_id, 1124fa4616eSBob Moore ACPI_OEM_ID_SIZE); 11342f47869SBob Moore acpi_tb_fix_string(local_header.oem_id, ACPI_OEM_ID_SIZE); 11442f47869SBob Moore 11505fb04b5SBob Moore ACPI_INFO(("RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)", 1161d0a0b2fSLv Zheng ACPI_FORMAT_UINT64(address), 11742f47869SBob Moore (ACPI_CAST_PTR(struct acpi_table_rsdp, header)-> 11842f47869SBob Moore revision > 11942f47869SBob Moore 0) ? ACPI_CAST_PTR(struct acpi_table_rsdp, 12042f47869SBob Moore header)->length : 20, 12142f47869SBob Moore ACPI_CAST_PTR(struct acpi_table_rsdp, 12242f47869SBob Moore header)->revision, 12342f47869SBob Moore local_header.oem_id)); 12442f47869SBob Moore } else { 12542f47869SBob Moore /* Standard ACPI table with full common header */ 12642f47869SBob Moore 12742f47869SBob Moore acpi_tb_cleanup_table_header(&local_header, header); 12842f47869SBob Moore 12905fb04b5SBob Moore ACPI_INFO(("%-4.4s 0x%8.8X%8.8X" 130c03775c0SBob Moore " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)", 1311d0a0b2fSLv Zheng local_header.signature, ACPI_FORMAT_UINT64(address), 13242f47869SBob Moore local_header.length, local_header.revision, 13342f47869SBob Moore local_header.oem_id, local_header.oem_table_id, 13442f47869SBob Moore local_header.oem_revision, 13542f47869SBob Moore local_header.asl_compiler_id, 13642f47869SBob Moore local_header.asl_compiler_revision)); 13742f47869SBob Moore } 13842f47869SBob Moore } 139