[PATCH v2 02/11] efi_selftest: add ACPI configuration table test
Simon Glass
sjg at chromium.org
Thu Jun 25 17:35:32 CEST 2026
Hi Heinrich,
On Thu, 25 Jun 2026 at 16:23, Heinrich Schuchardt
<heinrich.schuchardt at canonical.com> wrote:
>
> On 6/25/26 16:55, Simon Glass wrote:
> > 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.
>
> The field length does not exist in ACPI 1.0. So it does not make any
> sense to relate to it for calculating the checksum field.
Well in v1.0 we would just have used sizeof() of the whole struct.
Creating v2 created the length field.
>
> >
> >>
> >> 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?
>
> That is beyond the scope of this series. It has enough patches.
>
> Let's do it separately.
Yes, sounds good. Either offsetof() or 20 is fine by me.
Regards,
Simon
More information about the U-Boot
mailing list