Message ID | 20200526171312.828540-1-alex.hung@canonical.com |
---|---|
State | Accepted |
Headers | show |
Series | [V2] acpitables: test ACPI versions vs. ACPI table revisions | expand |
On 26/05/2020 18:13, Alex Hung wrote: > BugLink: https://bugs.launchpad.net/bugs/1880590 > > Signed-off-by: Alex Hung <alex.hung@canonical.com> > --- > src/acpi/acpitables/acpitables.c | 160 ++++++++++++++++++++++++++++++- > 1 file changed, 159 insertions(+), 1 deletion(-) > > diff --git a/src/acpi/acpitables/acpitables.c b/src/acpi/acpitables/acpitables.c > index e2511e15..a6b7120a 100644 > --- a/src/acpi/acpitables/acpitables.c > +++ b/src/acpi/acpitables/acpitables.c > @@ -27,6 +27,11 @@ > #include <unistd.h> > #include <inttypes.h> > > +typedef struct { > + const char *name; > + const uint8_t revision; > +} fwts_acpi_table_rev; > + > static bool acpi_table_check_field(const char *field, const size_t len) > { > size_t i; > @@ -117,8 +122,160 @@ static int acpi_table_check_test1(fwts_framework *fw) > return FWTS_OK; > } > > +/* Supported ACPI tables (see Table 5-30 in ACPI spec) > + * Note: OEMx (N/A) and PSDT (deleted) aren't included. > + */ > +static const fwts_acpi_table_rev acpi_61_rev[] = { > + {"APIC", 4}, > + {"BERT", 1}, > + {"BGRT", 1}, > + {"CPEP", 1}, > + {"DSDT", 2}, > + {"ECDT", 1}, > + {"EINJ", 1}, > + {"ERST", 1}, > + {"FACP", 6}, > + {"FPDT", 1}, > + {"GTDT", 2}, > + {"HEST", 1}, > + {"MSCT", 1}, > + {"MPST", 1}, > + {"NFIT", 1}, > + {"PCCT", 1}, > + {"PMTT", 1}, > + {"RASF", 1}, > + {"RSDT", 1}, > + {"SBST", 1}, > + {"SLIT", 1}, > + {"SRAT", 3}, > + {"SSDT", 2}, > + {"XSDT", 1}, > + {NULL, 0xff} // end of table > +}; > + > +static const fwts_acpi_table_rev acpi_62_rev[] = { > + {"APIC", 4}, > + {"BERT", 1}, > + {"BGRT", 1}, > + {"CPEP", 1}, > + {"DSDT", 2}, > + {"ECDT", 1}, > + {"EINJ", 1}, > + {"ERST", 1}, > + {"FACP", 6}, > + {"FPDT", 1}, > + {"GTDT", 2}, > + {"HEST", 1}, > + {"MSCT", 1}, > + {"MPST", 1}, > + {"NFIT", 1}, > + {"PCCT", 1}, > + {"PMTT", 1}, > + {"RASF", 1}, > + {"RSDT", 1}, > + {"SBST", 1}, > + {"SLIT", 1}, > + {"SRAT", 3}, > + {"SSDT", 2}, > + {"XSDT", 1}, > + {NULL, 0xff} // end of table > +}; > + > +static const fwts_acpi_table_rev acpi_63_rev[] = { > + {"APIC", 5}, > + {"BERT", 1}, > + {"BGRT", 1}, > + {"CPEP", 1}, > + {"DSDT", 2}, > + {"ECDT", 1}, > + {"EINJ", 1}, > + {"ERST", 1}, > + {"FACP", 6}, > + {"FPDT", 1}, > + {"GTDT", 3}, > + {"HEST", 1}, > + {"MSCT", 1}, > + {"MPST", 1}, > + {"NFIT", 1}, > + {"PCCT", 2}, > + {"PMTT", 1}, > + {"RASF", 1}, > + {"RSDT", 1}, > + {"SBST", 1}, > + {"SDEV", 1}, > + {"SLIT", 1}, > + {"SRAT", 3}, > + {"SSDT", 2}, > + {"XSDT", 1}, > + {NULL, 0xff} // end of table > +}; > + > +static int acpi_table_check_test2(fwts_framework *fw) > +{ > + const fwts_acpi_table_rev *tables_rev; > + bool failed = false; > + uint32_t version; > + int i; > + > + version = fwts_get_acpi_version(fw); > + fwts_log_info_verbatim(fw, "System supports ACPI %4.4" PRIx32, version); > + > + switch (version) { > + case FWTS_ACPI_VERSION_61: > + tables_rev = acpi_61_rev; > + break; > + case FWTS_ACPI_VERSION_62: > + tables_rev = acpi_62_rev; > + break; > + case FWTS_ACPI_VERSION_63: > + tables_rev = acpi_63_rev; > + break; > + default: > + fwts_log_info_verbatim(fw, "This test does not support ACPI %4.4" PRIx32 ".", version); > + return FWTS_SKIP; > + } > + > + for (i = 0; ; i++) { > + const fwts_acpi_table_rev *table_rev; > + fwts_acpi_table_header *hdr; > + fwts_acpi_table_info *info; > + > + if (fwts_acpi_get_table(fw, i, &info) != FWTS_OK) > + break; > + if (info == NULL) > + continue; > + > + if (!strcmp(info->name, "FACP") || > + !strcmp(info->name, "FACS") || > + !strcmp(info->name, "RSDP")) > + continue; > + > + hdr = (fwts_acpi_table_header *) info->data; > + for (table_rev = tables_rev; ; table_rev++) { > + > + if (!table_rev->name) > + break; > + > + if (!strncmp(info->name, table_rev->name, 4) && > + table_rev->revision != hdr->revision) { > + failed = true; > + fwts_failed(fw, LOG_LEVEL_MEDIUM, "ACPITableBadRevision", > + "ACPI Table %s revision was expected to be %" PRIu8 > + ", got %" PRIu8 ".", info->name, table_rev->revision, > + hdr->revision); > + } > + } > + } > + > + if (!failed) > + fwts_passed(fw, "ACPI spec %4.4" PRIx32 " has matched table revisions.", version); > + > + return FWTS_OK; > +} > + > static fwts_framework_minor_test acpi_table_check_tests[] = { > { acpi_table_check_test1, "Test ACPI headers." }, > + { acpi_table_check_test2, "Test ACPI spec versus table revisions." }, > { NULL, NULL } > }; > > @@ -127,6 +284,7 @@ static fwts_framework_ops acpi_table_check_ops = { > .minor_tests = acpi_table_check_tests > }; > > -FWTS_REGISTER("acpitables", &acpi_table_check_ops, FWTS_TEST_ANYTIME, FWTS_FLAG_BATCH | FWTS_FLAG_TEST_ACPI | FWTS_FLAG_TEST_SBBR) > +FWTS_REGISTER("acpitables", &acpi_table_check_ops, FWTS_TEST_ANYTIME, > + FWTS_FLAG_BATCH | FWTS_FLAG_TEST_ACPI | FWTS_FLAG_TEST_SBBR) > > #endif > Acked-by: Colin Ian King <colin.king@canonical.com>
On 5/27/20 1:13 AM, Alex Hung wrote: > BugLink: https://bugs.launchpad.net/bugs/1880590 > > Signed-off-by: Alex Hung <alex.hung@canonical.com> > --- > src/acpi/acpitables/acpitables.c | 160 ++++++++++++++++++++++++++++++- > 1 file changed, 159 insertions(+), 1 deletion(-) > > diff --git a/src/acpi/acpitables/acpitables.c b/src/acpi/acpitables/acpitables.c > index e2511e15..a6b7120a 100644 > --- a/src/acpi/acpitables/acpitables.c > +++ b/src/acpi/acpitables/acpitables.c > @@ -27,6 +27,11 @@ > #include <unistd.h> > #include <inttypes.h> > > +typedef struct { > + const char *name; > + const uint8_t revision; > +} fwts_acpi_table_rev; > + > static bool acpi_table_check_field(const char *field, const size_t len) > { > size_t i; > @@ -117,8 +122,160 @@ static int acpi_table_check_test1(fwts_framework *fw) > return FWTS_OK; > } > > +/* Supported ACPI tables (see Table 5-30 in ACPI spec) > + * Note: OEMx (N/A) and PSDT (deleted) aren't included. > + */ > +static const fwts_acpi_table_rev acpi_61_rev[] = { > + {"APIC", 4}, > + {"BERT", 1}, > + {"BGRT", 1}, > + {"CPEP", 1}, > + {"DSDT", 2}, > + {"ECDT", 1}, > + {"EINJ", 1}, > + {"ERST", 1}, > + {"FACP", 6}, > + {"FPDT", 1}, > + {"GTDT", 2}, > + {"HEST", 1}, > + {"MSCT", 1}, > + {"MPST", 1}, > + {"NFIT", 1}, > + {"PCCT", 1}, > + {"PMTT", 1}, > + {"RASF", 1}, > + {"RSDT", 1}, > + {"SBST", 1}, > + {"SLIT", 1}, > + {"SRAT", 3}, > + {"SSDT", 2}, > + {"XSDT", 1}, > + {NULL, 0xff} // end of table > +}; > + > +static const fwts_acpi_table_rev acpi_62_rev[] = { > + {"APIC", 4}, > + {"BERT", 1}, > + {"BGRT", 1}, > + {"CPEP", 1}, > + {"DSDT", 2}, > + {"ECDT", 1}, > + {"EINJ", 1}, > + {"ERST", 1}, > + {"FACP", 6}, > + {"FPDT", 1}, > + {"GTDT", 2}, > + {"HEST", 1}, > + {"MSCT", 1}, > + {"MPST", 1}, > + {"NFIT", 1}, > + {"PCCT", 1}, > + {"PMTT", 1}, > + {"RASF", 1}, > + {"RSDT", 1}, > + {"SBST", 1}, > + {"SLIT", 1}, > + {"SRAT", 3}, > + {"SSDT", 2}, > + {"XSDT", 1}, > + {NULL, 0xff} // end of table > +}; > + > +static const fwts_acpi_table_rev acpi_63_rev[] = { > + {"APIC", 5}, > + {"BERT", 1}, > + {"BGRT", 1}, > + {"CPEP", 1}, > + {"DSDT", 2}, > + {"ECDT", 1}, > + {"EINJ", 1}, > + {"ERST", 1}, > + {"FACP", 6}, > + {"FPDT", 1}, > + {"GTDT", 3}, > + {"HEST", 1}, > + {"MSCT", 1}, > + {"MPST", 1}, > + {"NFIT", 1}, > + {"PCCT", 2}, > + {"PMTT", 1}, > + {"RASF", 1}, > + {"RSDT", 1}, > + {"SBST", 1}, > + {"SDEV", 1}, > + {"SLIT", 1}, > + {"SRAT", 3}, > + {"SSDT", 2}, > + {"XSDT", 1}, > + {NULL, 0xff} // end of table > +}; > + > +static int acpi_table_check_test2(fwts_framework *fw) > +{ > + const fwts_acpi_table_rev *tables_rev; > + bool failed = false; > + uint32_t version; > + int i; > + > + version = fwts_get_acpi_version(fw); > + fwts_log_info_verbatim(fw, "System supports ACPI %4.4" PRIx32, version); > + > + switch (version) { > + case FWTS_ACPI_VERSION_61: > + tables_rev = acpi_61_rev; > + break; > + case FWTS_ACPI_VERSION_62: > + tables_rev = acpi_62_rev; > + break; > + case FWTS_ACPI_VERSION_63: > + tables_rev = acpi_63_rev; > + break; > + default: > + fwts_log_info_verbatim(fw, "This test does not support ACPI %4.4" PRIx32 ".", version); > + return FWTS_SKIP; > + } > + > + for (i = 0; ; i++) { > + const fwts_acpi_table_rev *table_rev; > + fwts_acpi_table_header *hdr; > + fwts_acpi_table_info *info; > + > + if (fwts_acpi_get_table(fw, i, &info) != FWTS_OK) > + break; > + if (info == NULL) > + continue; > + > + if (!strcmp(info->name, "FACP") || > + !strcmp(info->name, "FACS") || > + !strcmp(info->name, "RSDP")) > + continue; > + > + hdr = (fwts_acpi_table_header *) info->data; > + for (table_rev = tables_rev; ; table_rev++) { > + > + if (!table_rev->name) > + break; > + > + if (!strncmp(info->name, table_rev->name, 4) && > + table_rev->revision != hdr->revision) { > + failed = true; > + fwts_failed(fw, LOG_LEVEL_MEDIUM, "ACPITableBadRevision", > + "ACPI Table %s revision was expected to be %" PRIu8 > + ", got %" PRIu8 ".", info->name, table_rev->revision, > + hdr->revision); > + } > + } > + } > + > + if (!failed) > + fwts_passed(fw, "ACPI spec %4.4" PRIx32 " has matched table revisions.", version); > + > + return FWTS_OK; > +} > + > static fwts_framework_minor_test acpi_table_check_tests[] = { > { acpi_table_check_test1, "Test ACPI headers." }, > + { acpi_table_check_test2, "Test ACPI spec versus table revisions." }, > { NULL, NULL } > }; > > @@ -127,6 +284,7 @@ static fwts_framework_ops acpi_table_check_ops = { > .minor_tests = acpi_table_check_tests > }; > > -FWTS_REGISTER("acpitables", &acpi_table_check_ops, FWTS_TEST_ANYTIME, FWTS_FLAG_BATCH | FWTS_FLAG_TEST_ACPI | FWTS_FLAG_TEST_SBBR) > +FWTS_REGISTER("acpitables", &acpi_table_check_ops, FWTS_TEST_ANYTIME, > + FWTS_FLAG_BATCH | FWTS_FLAG_TEST_ACPI | FWTS_FLAG_TEST_SBBR) > > #endif > Acked-by: Ivan Hu <ivan.hu@canonical.com>
diff --git a/src/acpi/acpitables/acpitables.c b/src/acpi/acpitables/acpitables.c index e2511e15..a6b7120a 100644 --- a/src/acpi/acpitables/acpitables.c +++ b/src/acpi/acpitables/acpitables.c @@ -27,6 +27,11 @@ #include <unistd.h> #include <inttypes.h> +typedef struct { + const char *name; + const uint8_t revision; +} fwts_acpi_table_rev; + static bool acpi_table_check_field(const char *field, const size_t len) { size_t i; @@ -117,8 +122,160 @@ static int acpi_table_check_test1(fwts_framework *fw) return FWTS_OK; } +/* Supported ACPI tables (see Table 5-30 in ACPI spec) + * Note: OEMx (N/A) and PSDT (deleted) aren't included. + */ +static const fwts_acpi_table_rev acpi_61_rev[] = { + {"APIC", 4}, + {"BERT", 1}, + {"BGRT", 1}, + {"CPEP", 1}, + {"DSDT", 2}, + {"ECDT", 1}, + {"EINJ", 1}, + {"ERST", 1}, + {"FACP", 6}, + {"FPDT", 1}, + {"GTDT", 2}, + {"HEST", 1}, + {"MSCT", 1}, + {"MPST", 1}, + {"NFIT", 1}, + {"PCCT", 1}, + {"PMTT", 1}, + {"RASF", 1}, + {"RSDT", 1}, + {"SBST", 1}, + {"SLIT", 1}, + {"SRAT", 3}, + {"SSDT", 2}, + {"XSDT", 1}, + {NULL, 0xff} // end of table +}; + +static const fwts_acpi_table_rev acpi_62_rev[] = { + {"APIC", 4}, + {"BERT", 1}, + {"BGRT", 1}, + {"CPEP", 1}, + {"DSDT", 2}, + {"ECDT", 1}, + {"EINJ", 1}, + {"ERST", 1}, + {"FACP", 6}, + {"FPDT", 1}, + {"GTDT", 2}, + {"HEST", 1}, + {"MSCT", 1}, + {"MPST", 1}, + {"NFIT", 1}, + {"PCCT", 1}, + {"PMTT", 1}, + {"RASF", 1}, + {"RSDT", 1}, + {"SBST", 1}, + {"SLIT", 1}, + {"SRAT", 3}, + {"SSDT", 2}, + {"XSDT", 1}, + {NULL, 0xff} // end of table +}; + +static const fwts_acpi_table_rev acpi_63_rev[] = { + {"APIC", 5}, + {"BERT", 1}, + {"BGRT", 1}, + {"CPEP", 1}, + {"DSDT", 2}, + {"ECDT", 1}, + {"EINJ", 1}, + {"ERST", 1}, + {"FACP", 6}, + {"FPDT", 1}, + {"GTDT", 3}, + {"HEST", 1}, + {"MSCT", 1}, + {"MPST", 1}, + {"NFIT", 1}, + {"PCCT", 2}, + {"PMTT", 1}, + {"RASF", 1}, + {"RSDT", 1}, + {"SBST", 1}, + {"SDEV", 1}, + {"SLIT", 1}, + {"SRAT", 3}, + {"SSDT", 2}, + {"XSDT", 1}, + {NULL, 0xff} // end of table +}; + +static int acpi_table_check_test2(fwts_framework *fw) +{ + const fwts_acpi_table_rev *tables_rev; + bool failed = false; + uint32_t version; + int i; + + version = fwts_get_acpi_version(fw); + fwts_log_info_verbatim(fw, "System supports ACPI %4.4" PRIx32, version); + + switch (version) { + case FWTS_ACPI_VERSION_61: + tables_rev = acpi_61_rev; + break; + case FWTS_ACPI_VERSION_62: + tables_rev = acpi_62_rev; + break; + case FWTS_ACPI_VERSION_63: + tables_rev = acpi_63_rev; + break; + default: + fwts_log_info_verbatim(fw, "This test does not support ACPI %4.4" PRIx32 ".", version); + return FWTS_SKIP; + } + + for (i = 0; ; i++) { + const fwts_acpi_table_rev *table_rev; + fwts_acpi_table_header *hdr; + fwts_acpi_table_info *info; + + if (fwts_acpi_get_table(fw, i, &info) != FWTS_OK) + break; + if (info == NULL) + continue; + + if (!strcmp(info->name, "FACP") || + !strcmp(info->name, "FACS") || + !strcmp(info->name, "RSDP")) + continue; + + hdr = (fwts_acpi_table_header *) info->data; + for (table_rev = tables_rev; ; table_rev++) { + + if (!table_rev->name) + break; + + if (!strncmp(info->name, table_rev->name, 4) && + table_rev->revision != hdr->revision) { + failed = true; + fwts_failed(fw, LOG_LEVEL_MEDIUM, "ACPITableBadRevision", + "ACPI Table %s revision was expected to be %" PRIu8 + ", got %" PRIu8 ".", info->name, table_rev->revision, + hdr->revision); + } + } + } + + if (!failed) + fwts_passed(fw, "ACPI spec %4.4" PRIx32 " has matched table revisions.", version); + + return FWTS_OK; +} + static fwts_framework_minor_test acpi_table_check_tests[] = { { acpi_table_check_test1, "Test ACPI headers." }, + { acpi_table_check_test2, "Test ACPI spec versus table revisions." }, { NULL, NULL } }; @@ -127,6 +284,7 @@ static fwts_framework_ops acpi_table_check_ops = { .minor_tests = acpi_table_check_tests }; -FWTS_REGISTER("acpitables", &acpi_table_check_ops, FWTS_TEST_ANYTIME, FWTS_FLAG_BATCH | FWTS_FLAG_TEST_ACPI | FWTS_FLAG_TEST_SBBR) +FWTS_REGISTER("acpitables", &acpi_table_check_ops, FWTS_TEST_ANYTIME, + FWTS_FLAG_BATCH | FWTS_FLAG_TEST_ACPI | FWTS_FLAG_TEST_SBBR) #endif
BugLink: https://bugs.launchpad.net/bugs/1880590 Signed-off-by: Alex Hung <alex.hung@canonical.com> --- src/acpi/acpitables/acpitables.c | 160 ++++++++++++++++++++++++++++++- 1 file changed, 159 insertions(+), 1 deletion(-)