Message ID | 20190225194732.28455-1-alex.hung@canonical.com |
---|---|
State | Accepted |
Headers | show |
Series | lib: fwts_acpi_tables: add a new function to check reserved values | expand |
On 2/26/19 3:47 AM, Alex Hung wrote: > This is similar to fwts_acpi_reserved_zero_check but is used to check > reserved that is not 8, 16, 32 or 64 bits long. > > Signed-off-by: Alex Hung <alex.hung@canonical.com> > --- > src/lib/include/fwts_acpi_tables.h | 1 + > src/lib/src/fwts_acpi_tables.c | 33 ++++++++++++++++++++++++++++++ > 2 files changed, 34 insertions(+) > > diff --git a/src/lib/include/fwts_acpi_tables.h b/src/lib/include/fwts_acpi_tables.h > index 19c13710..f88e7a03 100644 > --- a/src/lib/include/fwts_acpi_tables.h > +++ b/src/lib/include/fwts_acpi_tables.h > @@ -54,6 +54,7 @@ bool fwts_acpi_obj_find(fwts_framework *fw, const char *obj_name); > fwts_bool fwts_acpi_is_reduced_hardware(const fwts_acpi_table_fadt *fadt); > > void fwts_acpi_reserved_zero_check(fwts_framework *fw, const char *table, const char *field, uint64_t value, uint8_t size, bool *passed); > +void fwts_acpi_reserved_zero_array_check(fwts_framework *fw, const char *table, const char *field, uint8_t* data, uint8_t length, bool *passed); > void fwts_acpi_reserved_bits_check(fwts_framework *fw, const char *table, const char *field, uint64_t value, uint8_t size, uint8_t min, uint8_t max, bool *passed); > void fwts_acpi_reserved_type_check(fwts_framework *fw, const char *table, uint8_t value, uint8_t min, uint8_t reserved, bool *passed); > bool fwts_acpi_subtable_length_check(fwts_framework *fw, const char *table, uint8_t subtable_type, uint32_t subtable_length, uint32_t size); > diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c > index dcf8efd1..1332e228 100644 > --- a/src/lib/src/fwts_acpi_tables.c > +++ b/src/lib/src/fwts_acpi_tables.c > @@ -1435,6 +1435,39 @@ void fwts_acpi_reserved_zero_check( > } > } > > +/* > + * fwts_acpi_reserved_zero_array_check() > + * verify whether the reserved array is all zeroed > + */ > +void fwts_acpi_reserved_zero_array_check( > + fwts_framework *fw, > + const char *table, > + const char *field, > + uint8_t* data, > + uint8_t length, > + bool *passed) > +{ > + uint32_t value = 0; > + char label[20]; > + uint8_t i; > + > + strncpy(label + 4, "ReservedNonZero", sizeof(label) - 4); > + strncpy(label, table, 4); /* ACPI table name is 4 char long */ > + > + for (i = 0; i < length; i++) > + value += data[i]; > + > + if (value != 0) { > + *passed = false; > + fwts_failed(fw, LOG_LEVEL_MEDIUM, label, > + "%4.4s %s field must be all zero, got below instead", > + table, field); > + > + for (i = 0; i < length; i++) > + fwts_log_info_verbatim(fw, " %s [%2.2" PRId8 "] = 0x%2.2" PRIx8, field, i, data[i]); > + } > +} > + > /* > * fwts_acpi_reserved_bits_check() > * verify whether the reserved bits are zero Acked-by: Ivan Hu <ivan.hu@canonical.com>
On 25/02/2019 19:47, Alex Hung wrote: > This is similar to fwts_acpi_reserved_zero_check but is used to check > reserved that is not 8, 16, 32 or 64 bits long. > > Signed-off-by: Alex Hung <alex.hung@canonical.com> > --- > src/lib/include/fwts_acpi_tables.h | 1 + > src/lib/src/fwts_acpi_tables.c | 33 ++++++++++++++++++++++++++++++ > 2 files changed, 34 insertions(+) > > diff --git a/src/lib/include/fwts_acpi_tables.h b/src/lib/include/fwts_acpi_tables.h > index 19c13710..f88e7a03 100644 > --- a/src/lib/include/fwts_acpi_tables.h > +++ b/src/lib/include/fwts_acpi_tables.h > @@ -54,6 +54,7 @@ bool fwts_acpi_obj_find(fwts_framework *fw, const char *obj_name); > fwts_bool fwts_acpi_is_reduced_hardware(const fwts_acpi_table_fadt *fadt); > > void fwts_acpi_reserved_zero_check(fwts_framework *fw, const char *table, const char *field, uint64_t value, uint8_t size, bool *passed); > +void fwts_acpi_reserved_zero_array_check(fwts_framework *fw, const char *table, const char *field, uint8_t* data, uint8_t length, bool *passed); > void fwts_acpi_reserved_bits_check(fwts_framework *fw, const char *table, const char *field, uint64_t value, uint8_t size, uint8_t min, uint8_t max, bool *passed); > void fwts_acpi_reserved_type_check(fwts_framework *fw, const char *table, uint8_t value, uint8_t min, uint8_t reserved, bool *passed); > bool fwts_acpi_subtable_length_check(fwts_framework *fw, const char *table, uint8_t subtable_type, uint32_t subtable_length, uint32_t size); > diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c > index dcf8efd1..1332e228 100644 > --- a/src/lib/src/fwts_acpi_tables.c > +++ b/src/lib/src/fwts_acpi_tables.c > @@ -1435,6 +1435,39 @@ void fwts_acpi_reserved_zero_check( > } > } > > +/* > + * fwts_acpi_reserved_zero_array_check() > + * verify whether the reserved array is all zeroed > + */ > +void fwts_acpi_reserved_zero_array_check( > + fwts_framework *fw, > + const char *table, > + const char *field, > + uint8_t* data, > + uint8_t length, > + bool *passed) > +{ > + uint32_t value = 0; > + char label[20]; > + uint8_t i; > + > + strncpy(label + 4, "ReservedNonZero", sizeof(label) - 4); > + strncpy(label, table, 4); /* ACPI table name is 4 char long */ > + > + for (i = 0; i < length; i++) > + value += data[i]; > + > + if (value != 0) { > + *passed = false; > + fwts_failed(fw, LOG_LEVEL_MEDIUM, label, > + "%4.4s %s field must be all zero, got below instead", > + table, field); > + > + for (i = 0; i < length; i++) > + fwts_log_info_verbatim(fw, " %s [%2.2" PRId8 "] = 0x%2.2" PRIx8, field, i, data[i]); > + } > +} > + > /* > * fwts_acpi_reserved_bits_check() > * verify whether the reserved bits are zero > Acked-by: Colin Ian King <colin.king@canonical.com>
diff --git a/src/lib/include/fwts_acpi_tables.h b/src/lib/include/fwts_acpi_tables.h index 19c13710..f88e7a03 100644 --- a/src/lib/include/fwts_acpi_tables.h +++ b/src/lib/include/fwts_acpi_tables.h @@ -54,6 +54,7 @@ bool fwts_acpi_obj_find(fwts_framework *fw, const char *obj_name); fwts_bool fwts_acpi_is_reduced_hardware(const fwts_acpi_table_fadt *fadt); void fwts_acpi_reserved_zero_check(fwts_framework *fw, const char *table, const char *field, uint64_t value, uint8_t size, bool *passed); +void fwts_acpi_reserved_zero_array_check(fwts_framework *fw, const char *table, const char *field, uint8_t* data, uint8_t length, bool *passed); void fwts_acpi_reserved_bits_check(fwts_framework *fw, const char *table, const char *field, uint64_t value, uint8_t size, uint8_t min, uint8_t max, bool *passed); void fwts_acpi_reserved_type_check(fwts_framework *fw, const char *table, uint8_t value, uint8_t min, uint8_t reserved, bool *passed); bool fwts_acpi_subtable_length_check(fwts_framework *fw, const char *table, uint8_t subtable_type, uint32_t subtable_length, uint32_t size); diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c index dcf8efd1..1332e228 100644 --- a/src/lib/src/fwts_acpi_tables.c +++ b/src/lib/src/fwts_acpi_tables.c @@ -1435,6 +1435,39 @@ void fwts_acpi_reserved_zero_check( } } +/* + * fwts_acpi_reserved_zero_array_check() + * verify whether the reserved array is all zeroed + */ +void fwts_acpi_reserved_zero_array_check( + fwts_framework *fw, + const char *table, + const char *field, + uint8_t* data, + uint8_t length, + bool *passed) +{ + uint32_t value = 0; + char label[20]; + uint8_t i; + + strncpy(label + 4, "ReservedNonZero", sizeof(label) - 4); + strncpy(label, table, 4); /* ACPI table name is 4 char long */ + + for (i = 0; i < length; i++) + value += data[i]; + + if (value != 0) { + *passed = false; + fwts_failed(fw, LOG_LEVEL_MEDIUM, label, + "%4.4s %s field must be all zero, got below instead", + table, field); + + for (i = 0; i < length; i++) + fwts_log_info_verbatim(fw, " %s [%2.2" PRId8 "] = 0x%2.2" PRIx8, field, i, data[i]); + } +} + /* * fwts_acpi_reserved_bits_check() * verify whether the reserved bits are zero
This is similar to fwts_acpi_reserved_zero_check but is used to check reserved that is not 8, 16, 32 or 64 bits long. Signed-off-by: Alex Hung <alex.hung@canonical.com> --- src/lib/include/fwts_acpi_tables.h | 1 + src/lib/src/fwts_acpi_tables.c | 33 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+)