7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek/******************************************************************************
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Module Name: tbprint - Table output utilities
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *****************************************************************************/
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek/*
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * All rights reserved.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Redistribution and use in source and binary forms, with or without
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * modification, are permitted provided that the following conditions
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * are met:
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * 1. Redistributions of source code must retain the above copyright
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * notice, this list of conditions, and the following disclaimer,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * without modification.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * 2. Redistributions in binary form must reproduce at minimum a disclaimer
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * substantially similar to the "NO WARRANTY" disclaimer below
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * ("Disclaimer") and any redistribution must be conditioned upon
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * including a substantially similar Disclaimer requirement for further
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * binary redistribution.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * 3. Neither the names of the above-listed copyright holders nor the names
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * of any contributors may be used to endorse or promote products derived
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * from this software without specific prior written permission.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Alternatively, this software may be distributed under the terms of the
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * GNU General Public License ("GPL") version 2 as published by the Free
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Software Foundation.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * NO WARRANTY
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * POSSIBILITY OF SUCH DAMAGES.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek */
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek#include "acpi.h"
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek#include "accommon.h"
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek#include "actables.h"
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek#define _COMPONENT ACPI_TABLES
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_MODULE_NAME ("tbprint")
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek/* Local prototypes */
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic void
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry JelinekAcpiTbFixString (
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek char *String,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_SIZE Length);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic void
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry JelinekAcpiTbCleanupTableHeader (
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_TABLE_HEADER *OutHeader,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_TABLE_HEADER *Header);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek/*******************************************************************************
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * FUNCTION: AcpiTbFixString
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * PARAMETERS: String - String to be repaired
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Length - Maximum length
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * RETURN: None
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * DESCRIPTION: Replace every non-printable or non-ascii byte in the string
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * with a question mark '?'.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ******************************************************************************/
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic void
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry JelinekAcpiTbFixString (
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek char *String,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_SIZE Length)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek{
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek while (Length && *String)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek {
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek if (!isprint ((int) *String))
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek {
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *String = '?';
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek }
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek String++;
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek Length--;
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek }
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek}
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek/*******************************************************************************
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * FUNCTION: AcpiTbCleanupTableHeader
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * PARAMETERS: OutHeader - Where the cleaned header is returned
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Header - Input ACPI table header
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * RETURN: Returns the cleaned header in OutHeader
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * DESCRIPTION: Copy the table header and ensure that all "string" fields in
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * the header consist of printable characters.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ******************************************************************************/
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekstatic void
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry JelinekAcpiTbCleanupTableHeader (
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_TABLE_HEADER *OutHeader,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_TABLE_HEADER *Header)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek{
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek memcpy (OutHeader, Header, sizeof (ACPI_TABLE_HEADER));
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek AcpiTbFixString (OutHeader->Signature, ACPI_NAME_SIZE);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek AcpiTbFixString (OutHeader->OemId, ACPI_OEM_ID_SIZE);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek AcpiTbFixString (OutHeader->OemTableId, ACPI_OEM_TABLE_ID_SIZE);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek}
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek/*******************************************************************************
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * FUNCTION: AcpiTbPrintTableHeader
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * PARAMETERS: Address - Table physical address
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Header - Table header
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * RETURN: None
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ******************************************************************************/
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinekvoid
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry JelinekAcpiTbPrintTableHeader (
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_PHYSICAL_ADDRESS Address,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_TABLE_HEADER *Header)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek{
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_TABLE_HEADER LocalHeader;
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS))
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek {
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek /* FACS only has signature and length fields */
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_INFO (("%-4.4s 0x%8.8X%8.8X %06X",
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek Header->Signature, ACPI_FORMAT_UINT64 (Address),
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek Header->Length));
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek }
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature))
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek {
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek /* RSDP has no common fields */
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek memcpy (LocalHeader.OemId, ACPI_CAST_PTR (ACPI_TABLE_RSDP,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek Header)->OemId, ACPI_OEM_ID_SIZE);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_INFO (("RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)",
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_FORMAT_UINT64 (Address),
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ?
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek LocalHeader.OemId));
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek }
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek else
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek {
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek /* Standard ACPI table with full common header */
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek AcpiTbCleanupTableHeader (&LocalHeader, Header);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_INFO ((
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek "%-4.4s 0x%8.8X%8.8X"
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)",
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek LocalHeader.Signature, ACPI_FORMAT_UINT64 (Address),
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek LocalHeader.OemTableId, LocalHeader.OemRevision,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision));
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek }
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek}
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek/*******************************************************************************
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * FUNCTION: AcpiTbValidateChecksum
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * PARAMETERS: Table - ACPI table to verify
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Length - Length of entire table
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * RETURN: Status
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * exception on bad checksum.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ******************************************************************************/
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry JelinekACPI_STATUS
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry JelinekAcpiTbVerifyChecksum (
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_TABLE_HEADER *Table,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek UINT32 Length)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek{
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek UINT8 Checksum;
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek /*
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * FACS/S3PT:
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * They are the odd tables, have no standard ACPI header and no checksum
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek */
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT) ||
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS))
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek {
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek return (AE_OK);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek }
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek /* Compute the checksum on the table */
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek /* Checksum ok? (should be zero) */
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek if (Checksum)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek {
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ACPI_BIOS_WARNING ((AE_INFO,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek "Incorrect checksum in table [%4.4s] - 0x%2.2X, "
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek "should be 0x%2.2X",
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek Table->Signature, Table->Checksum,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek (UINT8) (Table->Checksum - Checksum)));
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek#if (ACPI_CHECKSUM_ABORT)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek return (AE_BAD_CHECKSUM);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek#endif
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek }
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek return (AE_OK);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek}
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek/*******************************************************************************
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * FUNCTION: AcpiTbChecksum
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * PARAMETERS: Buffer - Pointer to memory region to be checked
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Length - Length of this memory region
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * RETURN: Checksum (UINT8)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * DESCRIPTION: Calculates circular checksum of memory region.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek ******************************************************************************/
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry JelinekUINT8
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry JelinekAcpiTbChecksum (
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek UINT8 *Buffer,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek UINT32 Length)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek{
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek UINT8 Sum = 0;
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek UINT8 *End = Buffer + Length;
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek while (Buffer < End)
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek {
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek Sum = (UINT8) (Sum + *(Buffer++));
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek }
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek return (Sum);
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek}