Skip to content

Commit

Permalink
ACPICA: Finish support for the CDAT table
Browse files Browse the repository at this point in the history
ACPICA commit 8ac4e5116f59d6f9ba2fbeb9ce22ab58237a278f

Finish support for the CDAT table, in both the data table compiler and
the disassembler.

Link: https://github.com/acpica/acpica/commit/8ac4e511
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Bob Moore authored and Rafael J. Wysocki committed Oct 28, 2022
1 parent 3f062a5 commit 51aad1a
Show file tree
Hide file tree
Showing 13 changed files with 311 additions and 88 deletions.
1 change: 1 addition & 0 deletions drivers/acpi/acpica/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ acpi-y += \
utalloc.o \
utascii.o \
utbuffer.o \
utcksum.o \
utcopy.o \
utexcep.o \
utdebug.o \
Expand Down
1 change: 1 addition & 0 deletions drivers/acpi/acpica/acglobal.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ ACPI_GLOBAL(struct acpi_table_list, acpi_gbl_root_table_list);

ACPI_GLOBAL(struct acpi_table_header *, acpi_gbl_DSDT);
ACPI_GLOBAL(struct acpi_table_header, acpi_gbl_original_dsdt_header);
ACPI_INIT_GLOBAL(char *, acpi_gbl_CDAT, NULL);
ACPI_INIT_GLOBAL(u32, acpi_gbl_dsdt_index, ACPI_INVALID_TABLE_INDEX);
ACPI_INIT_GLOBAL(u32, acpi_gbl_facs_index, ACPI_INVALID_TABLE_INDEX);
ACPI_INIT_GLOBAL(u32, acpi_gbl_xfacs_index, ACPI_INVALID_TABLE_INDEX);
Expand Down
5 changes: 0 additions & 5 deletions drivers/acpi/acpica/actables.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,6 @@ void
acpi_tb_print_table_header(acpi_physical_address address,
struct acpi_table_header *header);

u8 acpi_tb_checksum(u8 *buffer, u32 length);

acpi_status
acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length);

void acpi_tb_check_dsdt_header(void);

struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index);
Expand Down
13 changes: 13 additions & 0 deletions drivers/acpi/acpica/acutils.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,19 @@ u8 acpi_ut_valid_name_char(char character, u32 position);

void acpi_ut_check_and_repair_ascii(u8 *name, char *repaired_name, u32 count);

/*
* utcksum - Checksum utilities
*/
u8 acpi_ut_generate_checksum(void *table, u32 length, u8 original_checksum);

u8 acpi_ut_checksum(u8 *buffer, u32 length);

acpi_status
acpi_ut_verify_cdat_checksum(struct acpi_table_cdat *cdat_table, u32 length);

acpi_status
acpi_ut_verify_checksum(struct acpi_table_header *table, u32 length);

/*
* utnonansi - Non-ANSI C library functions
*/
Expand Down
2 changes: 1 addition & 1 deletion drivers/acpi/acpica/tbdata.c
Original file line number Diff line number Diff line change
Expand Up @@ -522,7 +522,7 @@ acpi_tb_verify_temp_table(struct acpi_table_desc *table_desc,
/* Verify the checksum */

status =
acpi_tb_verify_checksum(table_desc->pointer,
acpi_ut_verify_checksum(table_desc->pointer,
table_desc->length);
if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY,
Expand Down
2 changes: 1 addition & 1 deletion drivers/acpi/acpica/tbfadt.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ void acpi_tb_parse_fadt(void)
* Validate the FADT checksum before we copy the table. Ignore
* checksum error as we want to try to get the DSDT and FACS.
*/
(void)acpi_tb_verify_checksum(table, length);
(void)acpi_ut_verify_checksum(table, length);

/* Create a local copy of the FADT in common ACPI 2.0+ format */

Expand Down
77 changes: 2 additions & 75 deletions drivers/acpi/acpica/tbprint.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <acpi/acpi.h>
#include "accommon.h"
#include "actables.h"
#include "acutils.h"

#define _COMPONENT ACPI_TABLES
ACPI_MODULE_NAME("tbprint")
Expand Down Expand Up @@ -39,7 +40,7 @@ static void acpi_tb_fix_string(char *string, acpi_size length)
{

while (length && *string) {
if (!isprint((int)*string)) {
if (!isprint((int)(u8)*string)) {
*string = '?';
}

Expand Down Expand Up @@ -135,77 +136,3 @@ acpi_tb_print_table_header(acpi_physical_address address,
local_header.asl_compiler_revision));
}
}

/*******************************************************************************
*
* FUNCTION: acpi_tb_validate_checksum
*
* PARAMETERS: table - ACPI table to verify
* length - Length of entire table
*
* RETURN: Status
*
* DESCRIPTION: Verifies that the table checksums to zero. Optionally returns
* exception on bad checksum.
*
******************************************************************************/

acpi_status acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length)
{
u8 checksum;

/*
* FACS/S3PT:
* They are the odd tables, have no standard ACPI header and no checksum
*/

if (ACPI_COMPARE_NAMESEG(table->signature, ACPI_SIG_S3PT) ||
ACPI_COMPARE_NAMESEG(table->signature, ACPI_SIG_FACS)) {
return (AE_OK);
}

/* Compute the checksum on the table */

checksum = acpi_tb_checksum(ACPI_CAST_PTR(u8, table), length);

/* Checksum ok? (should be zero) */

if (checksum) {
ACPI_BIOS_WARNING((AE_INFO,
"Incorrect checksum in table [%4.4s] - 0x%2.2X, "
"should be 0x%2.2X",
table->signature, table->checksum,
(u8)(table->checksum - checksum)));

#if (ACPI_CHECKSUM_ABORT)
return (AE_BAD_CHECKSUM);
#endif
}

return (AE_OK);
}

/*******************************************************************************
*
* FUNCTION: acpi_tb_checksum
*
* PARAMETERS: buffer - Pointer to memory region to be checked
* length - Length of this memory region
*
* RETURN: Checksum (u8)
*
* DESCRIPTION: Calculates circular checksum of memory region.
*
******************************************************************************/

u8 acpi_tb_checksum(u8 *buffer, u32 length)
{
u8 sum = 0;
u8 *end = buffer + length;

while (buffer < end) {
sum = (u8)(sum + *(buffer++));
}

return (sum);
}
2 changes: 1 addition & 1 deletion drivers/acpi/acpica/tbutils.c
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address)

/* Validate the root table checksum */

status = acpi_tb_verify_checksum(table, length);
status = acpi_ut_verify_checksum(table, length);
if (ACPI_FAILURE(status)) {
acpi_os_unmap_memory(table, length);
return_ACPI_STATUS(status);
Expand Down
4 changes: 2 additions & 2 deletions drivers/acpi/acpica/tbxfroot.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,14 @@ acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp)

/* Check the standard checksum */

if (acpi_tb_checksum((u8 *) rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) {
if (acpi_ut_checksum((u8 *)rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) {
return (AE_BAD_CHECKSUM);
}

/* Check extended checksum if table version >= 2 */

if ((rsdp->revision >= 2) &&
(acpi_tb_checksum((u8 *) rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0)) {
(acpi_ut_checksum((u8 *)rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0)) {
return (AE_BAD_CHECKSUM);
}

Expand Down
170 changes: 170 additions & 0 deletions drivers/acpi/acpica/utcksum.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
/******************************************************************************
*
* Module Name: utcksum - Support generating table checksums
*
* Copyright (C) 2000 - 2022, Intel Corp.
*
*****************************************************************************/

#include <acpi/acpi.h>
#include "accommon.h"
#include "acutils.h"

/* This module used for application-level code only */

#define _COMPONENT ACPI_CA_DISASSEMBLER
ACPI_MODULE_NAME("utcksum")

/*******************************************************************************
*
* FUNCTION: acpi_ut_verify_checksum
*
* PARAMETERS: table - ACPI table to verify
* length - Length of entire table
*
* RETURN: Status
*
* DESCRIPTION: Verifies that the table checksums to zero. Optionally returns
* exception on bad checksum.
* Note: We don't have to check for a CDAT here, since CDAT is
* not in the RSDT/XSDT, and the CDAT table is never installed
* via ACPICA.
*
******************************************************************************/
acpi_status acpi_ut_verify_checksum(struct acpi_table_header *table, u32 length)
{
u8 checksum;

/*
* FACS/S3PT:
* They are the odd tables, have no standard ACPI header and no checksum
*/
if (ACPI_COMPARE_NAMESEG(table->signature, ACPI_SIG_S3PT) ||
ACPI_COMPARE_NAMESEG(table->signature, ACPI_SIG_FACS)) {
return (AE_OK);
}

/* Compute the checksum on the table */

length = table->length;
checksum =
acpi_ut_generate_checksum(ACPI_CAST_PTR(u8, table), length,
table->checksum);

/* Computed checksum matches table? */

if (checksum != table->checksum) {
ACPI_BIOS_WARNING((AE_INFO,
"Incorrect checksum in table [%4.4s] - 0x%2.2X, "
"should be 0x%2.2X",
table->signature, table->checksum,
table->checksum - checksum));

#if (ACPI_CHECKSUM_ABORT)
return (AE_BAD_CHECKSUM);
#endif
}

return (AE_OK);
}

/*******************************************************************************
*
* FUNCTION: acpi_ut_verify_cdat_checksum
*
* PARAMETERS: table - CDAT ACPI table to verify
* length - Length of entire table
*
* RETURN: Status
*
* DESCRIPTION: Verifies that the CDAT table checksums to zero. Optionally
* returns an exception on bad checksum.
*
******************************************************************************/

acpi_status
acpi_ut_verify_cdat_checksum(struct acpi_table_cdat *cdat_table, u32 length)
{
u8 checksum;

/* Compute the checksum on the table */

checksum = acpi_ut_generate_checksum(ACPI_CAST_PTR(u8, cdat_table),
cdat_table->length,
cdat_table->checksum);

/* Computed checksum matches table? */

if (checksum != cdat_table->checksum) {
ACPI_BIOS_WARNING((AE_INFO,
"Incorrect checksum in table [%4.4s] - 0x%2.2X, "
"should be 0x%2.2X",
acpi_gbl_CDAT, cdat_table->checksum,
checksum));

#if (ACPI_CHECKSUM_ABORT)
return (AE_BAD_CHECKSUM);
#endif
}

cdat_table->checksum = checksum;
return (AE_OK);
}

/*******************************************************************************
*
* FUNCTION: acpi_ut_generate_checksum
*
* PARAMETERS: table - Pointer to table to be checksummed
* length - Length of the table
* original_checksum - Value of the checksum field
*
* RETURN: 8 bit checksum of buffer
*
* DESCRIPTION: Computes an 8 bit checksum of the table.
*
******************************************************************************/

u8 acpi_ut_generate_checksum(void *table, u32 length, u8 original_checksum)
{
u8 checksum;

/* Sum the entire table as-is */

checksum = acpi_ut_checksum((u8 *)table, length);

/* Subtract off the existing checksum value in the table */

checksum = (u8)(checksum - original_checksum);

/* Compute and return the final checksum */

checksum = (u8)(0 - checksum);
return (checksum);
}

/*******************************************************************************
*
* FUNCTION: acpi_ut_checksum
*
* PARAMETERS: buffer - Pointer to memory region to be checked
* length - Length of this memory region
*
* RETURN: Checksum (u8)
*
* DESCRIPTION: Calculates circular checksum of memory region.
*
******************************************************************************/

u8 acpi_ut_checksum(u8 *buffer, u32 length)
{
u8 sum = 0;
u8 *end = buffer + length;

while (buffer < end) {
sum = (u8)(sum + *(buffer++));
}

return (sum);
}
Loading

0 comments on commit 51aad1a

Please sign in to comment.