[PATCH v2 3/3] ACPI: MADT: add in compliance checks for the GIC ITS subtable
Colin Ian King
colin.king at canonical.com
Tue Jan 12 10:28:47 UTC 2016
On 11/01/16 23:23, Al Stone wrote:
> Having previously added the proper structs for the GIC ITS subtable
> of the MADT, add in test to make sure the content is reasonably correct
> if one is being used.
>
> Signed-off-by: Al Stone <al.stone at linaro.org>
> ---
> src/acpi/compliance/madt.c | 83 ++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 81 insertions(+), 2 deletions(-)
>
> diff --git a/src/acpi/compliance/madt.c b/src/acpi/compliance/madt.c
> index 78cf4ac..8ba16ed 100644
> --- a/src/acpi/compliance/madt.c
> +++ b/src/acpi/compliance/madt.c
> @@ -202,6 +202,7 @@ static fwts_acpi_table_info *mtable;
> static fwts_acpi_table_info *ftable;
>
> static fwts_list msi_frame_ids;
> +static fwts_list its_ids;
>
> static int spec_madt_init(fwts_framework *fw)
> {
> @@ -253,8 +254,12 @@ static int spec_madt_init(fwts_framework *fw)
> ms++;
> }
>
> - /* initialize the MSI frame ID list should we need it later */
> + /*
> + * Initialize the MSI frame ID and ITS ID lists should we need
> + * them later
> + */
> fwts_list_init(&msi_frame_ids);
> + fwts_list_init(&its_ids);
>
> return (!spec_data) ? FWTS_ERROR : FWTS_OK;
> }
> @@ -1090,6 +1095,75 @@ static int spec_madt_gicr(fwts_framework *fw,
> return (hdr->length - sizeof(fwts_acpi_madt_sub_table_header));
> }
>
> +static int spec_madt_gic_its(fwts_framework *fw,
> + fwts_acpi_madt_sub_table_header *hdr,
> + const uint8_t *data)
> +{
> + /* specific checks for subtable type 0xf: GIC ITS */
> + fwts_acpi_madt_gic_its *gic_its = (fwts_acpi_madt_gic_its *)data;
> + fwts_list_link *item;
> + bool found;
> +
> + if (gic_its->reserved)
> + fwts_failed(fw, LOG_LEVEL_LOW,
> + "SPECMADTGICITSReservedNonZero",
> + "MADT %s first reserved field should be zero, "
> + "instead got 0x%" PRIx32 ".",
> + spec_madt_sub_names[hdr->type], gic_its->reserved);
> + else
> + fwts_passed(fw,
> + "MADT %s first reserved field is properly set "
> + "to zero.",
> + spec_madt_sub_names[hdr->type]);
> +
> + /*
> + * Check ITS ID against previously found IDs to see if it
> + * is unique. According to the spec, they must be.
> + */
> + found = false;
> + fwts_list_foreach(item, &its_ids) {
> + uint32_t *its_id = fwts_list_data(uint32_t *, item);
> +
> + if (*its_id == gic_its->its_id)
> + found = true;
> + }
> + if (found) {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "SPECMADTGICITSNonUniqueId",
> + "MADT %s ITS ID 0x%" PRIx32 " is not unique "
> + "and has already be defined in a previous %s.",
> + spec_madt_sub_names[hdr->type],
> + gic_its->its_id,
> + spec_madt_sub_names[hdr->type]);
> + } else {
> + fwts_list_append(&its_ids, &(gic_its->its_id));
> + fwts_passed(fw,
> + "MADT %s ITS ID 0x%" PRIx32 " is unique "
> + "as is required.",
> + spec_madt_sub_names[hdr->type],
> + gic_its->its_id);
> + }
> +
> + /*
> + * TODO: can the physical base address be tested, or is zero
> + * allowed?
> + */
> +
> + if (gic_its->reserved2)
> + fwts_failed(fw, LOG_LEVEL_LOW,
> + "SPECMADTGICITSReserved2NonZero",
> + "MADT %s second reserved field should be zero, "
> + "instead got 0x%" PRIx32 ".",
> + spec_madt_sub_names[hdr->type], gic_its->reserved2);
> + else
> + fwts_passed(fw,
> + "MADT %s second reserved field is properly set "
> + "to zero.",
> + spec_madt_sub_names[hdr->type]);
> +
> + return (hdr->length - sizeof(fwts_acpi_madt_sub_table_header));
> +}
> +
> static int spec_madt_subtables(fwts_framework *fw)
> {
> fwts_acpi_table_madt *madt = (fwts_acpi_table_madt *)mtable->data;
> @@ -1238,6 +1312,10 @@ static int spec_madt_subtables(fwts_framework *fw)
> skip = spec_madt_gicr(fw, hdr, data);
> break;
>
> + case FWTS_ACPI_MADT_GIC_ITS:
> + skip = spec_madt_gic_its(fw, hdr, data);
> + break;
> +
> default:
> if (hdr->type >= 0x10 && hdr->type <= 0x7f)
> fwts_failed(fw, LOG_LEVEL_MEDIUM,
> @@ -1268,8 +1346,9 @@ static int spec_madt_subtables(fwts_framework *fw)
>
> static int spec_madt_deinit(fwts_framework *fw)
> {
> - /* only one minor clean up needed */
> + /* only minor clean up needed */
> fwts_list_free_items(&msi_frame_ids, NULL);
> + fwts_list_free_items(&its_ids, NULL);
>
> return (fw) ? FWTS_ERROR : FWTS_OK;
> }
>
Let's review this on the next spin of this patch set if that's OK
Colin
More information about the fwts-devel
mailing list