[PATCH v2 02/11] efi_selftest: add ACPI configuration table test

Simon Glass sjg at chromium.org
Thu Jun 25 16:55:07 CEST 2026


Hi Heinrich,

On Thu, 25 Jun 2026 at 12:26, Heinrich Schuchardt
<heinrich.schuchardt at canonical.com> wrote:
>
> On 6/25/26 10:52, Simon Glass wrote:
> > Hi Heinrich,
> >
> > On 2026-06-21T08:19:04, Heinrich Schuchardt
> > <heinrich.schuchardt at canonical.com> wrote:
> >> efi_selftest: add ACPI configuration table test
> >>
> >> The new unit test checks if ACPI tables are available.
> >>
> >> If yes, it checks if the RSDP correctly points to the RSDT or XSDT.
> >>
> >> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> >>
> >> lib/efi_selftest/Makefile            |   1 +
> >>   lib/efi_selftest/efi_selftest_acpi.c | 138 +++++++++++++++++++++++++++++++++++
> >>   2 files changed, 139 insertions(+)
> >
> > Reviewed-by: Simon Glass <sjg at chromium.org>
> >
> >> diff --git a/lib/efi_selftest/efi_selftest_acpi.c b/lib/efi_selftest/efi_selftest_acpi.c
> >> @@ -0,0 +1,138 @@
> >> +     if (!checksum_ok(rsdp, 20)) {
> >> +             efi_st_error("Invalid RSDP checksum\n");
> >> +             return EFI_ST_FAILURE;
> >> +     }
> >
> > Please avoid the magic 20 - how about offsetof(struct acpi_rsdp,
> > length) or a named constant?
> >
> > Regards,
> > Simon
>
> Thank you for reviewing.
>
> 20 is not an offset. It is the length of the ACPI 1.0 RSDP header.

...which is the offset of the length field. See the struct:

struct __packed acpi_rsdp {
   char signature[8];   /* RSDP signature */
   u8 checksum;      /* Checksum of the first 20 bytes */
   char oem_id[6];      /* OEM ID */
   u8 revision;      /* 0 for ACPI 1.0, others 2 */
   u32 rsdt_address;   /* Physical address of RSDT (32 bits) */
   u32 length;      /* Total RSDP length (incl. extended part) */
   u64 xsdt_address;   /* Physical address of XSDT (64 bits) */
   u8 ext_checksum;   /* Checksum of the whole table */
   u8 reserved[3];
};

The original struct ended with rsdt_address as the final field. Then
they added a length and some more information. So the offset of
'length' is actually what you want.

My failure to use offsetof() was probably just that I didn't know it
existed, or perhaps because some of the code came from coreboot.

>
> Below is the precedent that Bin and you have been setting:
>
> arch/x86/lib/acpi.c:18: if (table_compute_checksum((void *)rsdp, 20) != 0)
> drivers/misc/qfw_acpi.c:310:    rsdp->checksum =
> table_compute_checksum(rsdp, 20);
> lib/acpi/base.c:36:     rsdp->checksum = table_compute_checksum(rsdp, 20);
> test/dm/acpi.c:371:     ut_assertok(table_compute_checksum(rsdp, 20));

Yes, this is quite common. How about declaring a constant for it?

Regards,
Simon


More information about the U-Boot mailing list