summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinrich Schuchardt <[email protected]>2026-04-20 18:47:25 +0200
committerSimon Glass <[email protected]>2026-05-11 12:04:43 -0600
commit3d09ec64ebabffdd962b1a683a6b239773065850 (patch)
tree8d6fc241034c12d2bb7a8f36435efbd736ee5a0c
parent22a285380e35a31d0a882af66278bc1edc1b917e (diff)
acpi: fix initial RSDT and XSDT size
When creating the RSDT and the XSDT table they contain no entries. The table size therefore must equal the header size. Without this change a NULL deference has been observed in acpi_find_table() when running `ut dm` on sandbox64_defconfig executed via `sudo ./u-boot -D`. Fixes: 94ba15a3f13f ("x86: Move base tables to a writer function") Fixes: 7e586f69070d ("acpi: Put table-setup code in its own function") Fixes: ab5efd576c4e ("x86: acpi: Adjust order in acpi_table.c") Fixes: 867bcb63e79f ("x86: Generate a valid ACPI table") Signed-off-by: Heinrich Schuchardt <[email protected]> Reviewed-by: Simon Glass <[email protected]> Update dm_test_acpi_ctx_and_base_tables() in test/dm/acpi.c to expect sizeof(struct acpi_table_header) for the initial table length (instead of sizeof(*rsdt) / sizeof(*xsdt)), and to compute the checksum over header->length bytes rather than the full struct size: Signed-off-by: Simon Glass <[email protected]>
-rw-r--r--lib/acpi/base.c4
-rw-r--r--test/dm/acpi.c8
2 files changed, 6 insertions, 6 deletions
diff --git a/lib/acpi/base.c b/lib/acpi/base.c
index 5c755b14c16..01ebad8994a 100644
--- a/lib/acpi/base.c
+++ b/lib/acpi/base.c
@@ -44,7 +44,7 @@ static void acpi_write_rsdt(struct acpi_rsdt *rsdt)
/* Fill out header fields */
acpi_fill_header(header, "RSDT");
- header->length = sizeof(struct acpi_rsdt);
+ header->length = sizeof(struct acpi_table_header);
header->revision = 1;
/* Entries are filled in later, we come with an empty set */
@@ -59,7 +59,7 @@ static void acpi_write_xsdt(struct acpi_xsdt *xsdt)
/* Fill out header fields */
acpi_fill_header(header, "XSDT");
- header->length = sizeof(struct acpi_xsdt);
+ header->length = sizeof(struct acpi_table_header);
header->revision = 1;
/* Entries are filled in later, we come with an empty set */
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index 559ea269de2..2de7983f9ae 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -374,14 +374,14 @@ static int dm_test_acpi_ctx_and_base_tables(struct unit_test_state *uts)
rsdt = PTR_ALIGN((void *)rsdp + sizeof(*rsdp), 16);
ut_asserteq_ptr(rsdt, ctx.rsdt);
ut_asserteq_mem("RSDT", rsdt->header.signature, ACPI_NAME_LEN);
- ut_asserteq(sizeof(*rsdt), rsdt->header.length);
- ut_assertok(table_compute_checksum(rsdt, sizeof(*rsdt)));
+ ut_asserteq(sizeof(struct acpi_table_header), rsdt->header.length);
+ ut_assertok(table_compute_checksum(rsdt, rsdt->header.length));
xsdt = PTR_ALIGN((void *)rsdt + sizeof(*rsdt), 16);
ut_asserteq_ptr(xsdt, ctx.xsdt);
ut_asserteq_mem("XSDT", xsdt->header.signature, ACPI_NAME_LEN);
- ut_asserteq(sizeof(*xsdt), xsdt->header.length);
- ut_assertok(table_compute_checksum(xsdt, sizeof(*xsdt)));
+ ut_asserteq(sizeof(struct acpi_table_header), xsdt->header.length);
+ ut_assertok(table_compute_checksum(xsdt, xsdt->header.length));
end = PTR_ALIGN((void *)xsdt + sizeof(*xsdt), 64);
ut_asserteq_ptr(end, ctx.current);