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

Ilias Apalodimas ilias.apalodimas at linaro.org
Thu Jul 2 10:55:24 CEST 2026


Hi Heinrich

[...]

> +               }
> +               if (!checksum_ok(rsdp, rsdp_len)) {
> +                       efi_st_error("Invalid RSDP extended checksum\n");
> +                       return EFI_ST_FAILURE;
> +               }
> +       }
> +
> +       memcpy(&rsdt_addr32, &rsdp->rsdt_address, sizeof(rsdt_addr32));
> +       rsdt_addr = rsdt_addr32;
> +
> +       xsdt_addr64 = 0;
> +       if (rsdp->revision >= ACPI_RSDP_REV_ACPI_2_0)
> +               memcpy(&xsdt_addr64, &rsdp->xsdt_address, sizeof(xsdt_addr64));
> +       xsdt_addr = xsdt_addr64;
> +
> +       if (!rsdt_addr && !xsdt_addr) {
> +               efi_st_error("Neither RSDT nor XSDT address is set\n");
> +               return EFI_ST_FAILURE;
> +       }
> +
> +       if (xsdt_addr) {
> +               table = (struct acpi_table_header *)xsdt_addr;
> +               if (!memcmp(table->signature, "XSDT", 4))
> +                       return EFI_ST_SUCCESS;

We should check for both the RSDT and XSDT.
Just invert the memcmp I guess?

Thanks
/Ilias
> +               efi_st_error("XSDT address does not point to XSDT\n");
> +       }
> +
> +       if (rsdt_addr) {
> +               table = (struct acpi_table_header *)rsdt_addr;
> +               if (!memcmp(table->signature, "RSDT", 4))
> +                       return EFI_ST_SUCCESS;
> +               efi_st_error("RSDT address does not point to RSDT\n");
> +       }
> +
> +       return EFI_ST_FAILURE;
> +}
> +
> +/**
> + * efi_st_acpi_execute() - execute ACPI selftest
> + *
> + * Return: status code
> + */
> +static int efi_st_acpi_execute(void)
> +{
> +       struct acpi_rsdp *rsdp2, *rsdp1;
> +       int ret;
> +
> +       rsdp2 = efi_st_get_config_table(&acpi2_guid);
> +       rsdp1 = efi_st_get_config_table(&acpi1_guid);
> +
> +       if (!rsdp2 && !rsdp1) {
> +               efi_st_printf("No ACPI configuration table, test skipped\n");
> +               return EFI_ST_SUCCESS;
> +       }
> +
> +       if (rsdp2) {
> +               ret = check_rsdp(rsdp2);
> +               if (ret != EFI_ST_SUCCESS)
> +                       return ret;
> +       }
> +
> +       if (rsdp1) {
> +               ret = check_rsdp(rsdp1);
> +               if (ret != EFI_ST_SUCCESS)
> +                       return ret;
> +       }
> +
> +       return EFI_ST_SUCCESS;
> +}
> +
> +EFI_UNIT_TEST(acpi) = {
> +       .name = "acpi",
> +       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
> +       .execute = efi_st_acpi_execute,
> +};
> --
> 2.53.0
>


More information about the U-Boot mailing list