[PATCH 4/4] acpi: method: check fixed package by fwts_method_package_elements_type
Alex Hung
alex.hung at canonical.com
Wed Jan 20 23:23:04 UTC 2021
Also include count check (fwts_method_package_count_equal) in
fwts_method_package_elements_type
Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
src/acpi/method/method.c | 83 +++++++++++++++--------------
src/lib/src/fwts_acpi_object_eval.c | 23 ++++----
2 files changed, 52 insertions(+), 54 deletions(-)
diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
index f4b24bb1..b018b733 100644
--- a/src/acpi/method/method.c
+++ b/src/acpi/method/method.c
@@ -1553,15 +1553,16 @@ static void method_test_PRR_return(
ACPI_OBJECT *obj,
void *private)
{
+ static const fwts_package_element elements[] = {
+ { ACPI_TYPE_LOCAL_REFERENCE, "Power Reset Resource" },
+ };
+
FWTS_UNUSED(private);
if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
return;
- if (fwts_method_package_count_equal(fw, name, obj, 1) != FWTS_OK)
- return;
-
- if (fwts_method_package_elements_all_type(fw, name, obj, ACPI_TYPE_LOCAL_REFERENCE) != FWTS_OK)
+ if (fwts_method_package_elements_type(fw, name, obj, elements) != FWTS_OK)
return;
fwts_method_passed_sane(fw, name, "package");
@@ -2097,17 +2098,17 @@ static void method_test_PCT_return(
ACPI_OBJECT *obj,
void *private)
{
+ static const fwts_package_element elements[] = {
+ { ACPI_TYPE_BUFFER, "ControlRegister" },
+ { ACPI_TYPE_BUFFER, "StatusRegister" },
+ };
+
FWTS_UNUSED(private);
if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
return;
- /* Something is really wrong if we don't have any elements in _PCT */
- if (fwts_method_package_count_min(fw, name, obj, 2) != FWTS_OK)
- return;
-
- if (fwts_method_package_elements_all_type(fw, name,
- obj, ACPI_TYPE_BUFFER) != FWTS_OK)
+ if (fwts_method_package_elements_type(fw, name, obj, elements) != FWTS_OK)
return;
fwts_method_passed_sane(fw, name, "package");
@@ -3079,15 +3080,19 @@ static void method_test_UPC_return(
{
uint32_t i, connector_type;
+ static const fwts_package_element elements[] = {
+ { ACPI_TYPE_INTEGER, "Connectable" },
+ { ACPI_TYPE_INTEGER, "Type" },
+ { ACPI_TYPE_INTEGER, "Reserved0" },
+ { ACPI_TYPE_INTEGER, "Reserved1" },
+ };
+
FWTS_UNUSED(private);
if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
return;
- if (fwts_method_package_count_equal(fw, name, obj, 4) != FWTS_OK)
- return;
-
- if (fwts_method_package_elements_all_type(fw, name, obj, ACPI_TYPE_INTEGER) != FWTS_OK)
+ if (fwts_method_package_elements_type(fw, name, obj, elements) != FWTS_OK)
return;
connector_type = obj->Package.Elements[1].Integer.Value;
@@ -3612,38 +3617,34 @@ static void method_test_PMC_return(
ACPI_OBJECT *obj,
void *private)
{
- uint32_t i;
bool failed = false;
ACPI_OBJECT *element;
+ static const fwts_package_element elements[] = {
+ { ACPI_TYPE_INTEGER, "Supported Capabilities" },
+ { ACPI_TYPE_INTEGER, "Measurement" },
+ { ACPI_TYPE_INTEGER, "Measurement Type" },
+ { ACPI_TYPE_INTEGER, "Measurement Accuracy" },
+ { ACPI_TYPE_INTEGER, "Measurement Sampling Time" },
+ { ACPI_TYPE_INTEGER, "Minimum Averaging Interval" },
+ { ACPI_TYPE_INTEGER, "Maximum Averaging Interval" },
+ { ACPI_TYPE_INTEGER, "Hysteresis Margin" },
+ { ACPI_TYPE_INTEGER, "Hardware Limit Is Configurable" },
+ { ACPI_TYPE_INTEGER, "Min Configurable Hardware Limit" },
+ { ACPI_TYPE_INTEGER, "Max Configurable Hardware Limit" },
+ { ACPI_TYPE_STRING, "Model Number" },
+ { ACPI_TYPE_STRING, "Serial Number" },
+ { ACPI_TYPE_STRING, "OEM Information" },
+ };
+
FWTS_UNUSED(private);
if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
return;
- if (fwts_method_package_count_equal(fw, name, obj, 14) != FWTS_OK)
+ if (fwts_method_package_elements_type(fw, name, obj, elements) != FWTS_OK)
return;
- /* check element types */
- for (i = 0; i < 14; i++) {
- element = &obj->Package.Elements[i];
- if (i > 10) {
- if (element->Type != ACPI_TYPE_STRING) {
- fwts_failed(fw, LOG_LEVEL_MEDIUM,
- "Method_PMCBadElementType",
- "%s element %" PRIu32 " is not a string.", name, i);
- failed = true;
- }
- } else {
- if (element->Type != ACPI_TYPE_INTEGER) {
- fwts_failed(fw, LOG_LEVEL_MEDIUM,
- "Method_PMCBadElementType",
- "%s element %" PRIu32 " is not an integer.", name, i);
- failed = true;
- }
- }
- }
-
/* check element's constraints */
element = &obj->Package.Elements[0];
if (element->Integer.Value & 0xFFFFFEF0) {
@@ -4356,15 +4357,17 @@ static void method_test_WAK_return(
ACPI_OBJECT *obj,
void *private)
{
+ static const fwts_package_element elements[] = {
+ { ACPI_TYPE_INTEGER, "Wake Signal" },
+ { ACPI_TYPE_INTEGER, "Power Supply S-state" },
+ };
+
FWTS_UNUSED(private);
FWTS_UNUSED(buf);
switch (obj->Type) {
case ACPI_TYPE_PACKAGE:
- if (fwts_method_package_count_equal(fw, name, obj, 2) != FWTS_OK)
- return;
-
- if (fwts_method_package_elements_all_type(fw, name, obj, ACPI_TYPE_INTEGER) != FWTS_OK)
+ if (fwts_method_package_elements_type(fw, name, obj, elements) != FWTS_OK)
return;
fwts_method_passed_sane(fw, name, "package");
diff --git a/src/lib/src/fwts_acpi_object_eval.c b/src/lib/src/fwts_acpi_object_eval.c
index fbca0d46..74ce9429 100644
--- a/src/lib/src/fwts_acpi_object_eval.c
+++ b/src/lib/src/fwts_acpi_object_eval.c
@@ -799,7 +799,7 @@ int fwts_method_package_elements_type__(
bool failed = false;
char tmp[128];
- if (obj->Package.Count != count)
+ if (fwts_method_package_count_equal(fw, name, obj, count) != FWTS_OK)
return FWTS_ERROR;
for (i = 0; i < obj->Package.Count; i++) {
@@ -2709,9 +2709,6 @@ void fwts_method_test_BIF_return(
if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
return;
- if (fwts_method_package_count_equal(fw, name, obj, 13) != FWTS_OK)
- return;
-
if (fwts_method_package_elements_type(fw, name, obj, elements) != FWTS_OK)
return;
@@ -2872,16 +2869,10 @@ void fwts_method_test_BIX_return(
switch (revision) {
case 0:
- if (fwts_method_package_count_equal(fw, name, obj, 20) != FWTS_OK)
- return;
-
if (fwts_method_package_elements_type(fw, name, obj, elements) != FWTS_OK)
return;
break;
case 1:
- if (fwts_method_package_count_equal(fw, name, obj, 21) != FWTS_OK)
- return;
-
if (fwts_method_package_elements_type(fw, name, obj, elements_v1) != FWTS_OK)
return;
break;
@@ -3024,15 +3015,19 @@ void fwts_method_test_BST_return(
{
bool failed = false;
+ static const fwts_package_element elements[] = {
+ { ACPI_TYPE_INTEGER, "Battery State" },
+ { ACPI_TYPE_INTEGER, "Battery Rate" },
+ { ACPI_TYPE_INTEGER, "Battery Remaining Capacity" },
+ { ACPI_TYPE_INTEGER, "Battery Present Voltage" },
+ };
+
FWTS_UNUSED(private);
if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
return;
- if (fwts_method_package_count_equal(fw, name, obj, 4) != FWTS_OK)
- return;
-
- if (fwts_method_package_elements_all_type(fw, name, obj, ACPI_TYPE_INTEGER) != FWTS_OK)
+ if (fwts_method_package_elements_type(fw, name, obj, elements) != FWTS_OK)
return;
/* Sanity check each field */
--
2.25.1
More information about the fwts-devel
mailing list