Message ID | 20210113203353.338438-1-alex.hung@canonical.com |
---|---|
State | Accepted |
Headers | show |
Series | [V3] acpi: method: add a function to check type of sub-package elements | expand |
On 13/01/2021 20:33, Alex Hung wrote: > The function name is fwts_method_check_element_type > > Signed-off-by: Alex Hung <alex.hung@canonical.com> > --- > src/acpi/method/method.c | 63 +++---------------- > src/lib/include/fwts_acpi_object_eval.h | 1 + > src/lib/src/fwts_acpi_object_eval.c | 80 +++++++++++++++++++++++++ > 3 files changed, 89 insertions(+), 55 deletions(-) > > diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c > index 07916c7f..cf994343 100644 > --- a/src/acpi/method/method.c > +++ b/src/acpi/method/method.c > @@ -698,14 +698,8 @@ static void method_test_DLM_return( > continue; > } > > - if (pkg->Package.Elements[0].Type != ACPI_TYPE_LOCAL_REFERENCE) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_DLMBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element 0 is not a reference.", > - name, i); > + if (fwts_method_check_element_type(fw, name, pkg, i, 0, ACPI_TYPE_LOCAL_REFERENCE)) > failed = true; > - } > > if (pkg->Package.Elements[1].Type != ACPI_TYPE_LOCAL_REFERENCE && > pkg->Package.Elements[1].Type != ACPI_TYPE_BUFFER) { > @@ -2371,15 +2365,8 @@ static void method_test_PSD_return( > > /* Elements in Sub-packages are integers */ > for (j = 0; j < 5; j++) { > - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_PSDBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element %" PRIu32 " is not " > - "an integer.", > - name, i, j); > + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) > elements_ok = false; > - } > } > > if (!elements_ok) { > @@ -4244,15 +4231,8 @@ static void method_test_FPS_return( > > for (j = 0; j < 5; j++) { > /* TODO - field 0 and 1 can be related to other control method */ > - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_FPSBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element %" PRIu32 " is not " > - "an integer.", > - name, i, j); > + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) > elements_ok = false; > - } > } > > if (!elements_ok) { > @@ -4448,27 +4428,14 @@ static void method_test_ART_return( > > /* First two elements are references, and rests are integers */ > for (j = 0; j < 2; j++) { > - if (pkg->Package.Elements[j].Type != ACPI_TYPE_LOCAL_REFERENCE) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_ARTBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element %" PRIu32 " is not " > - "a reference.", > - name, i, j); > + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_LOCAL_REFERENCE)) > elements_ok = false; > - } > } > > for (j = 2; j < 13; j++) { > - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_ARTBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element %" PRIu32 " is not " > - "an integer.", > - name, i, j); > + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) > elements_ok = false; > - } > + > } > > if (!elements_ok) { > @@ -4525,27 +4492,13 @@ static void method_test_TRT_return( > > /* First two elements are references, and rests are integers */ > for (j = 0; j < 2; j++) { > - if (pkg->Package.Elements[j].Type != ACPI_TYPE_LOCAL_REFERENCE) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_TRTBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element %" PRIu32 " is not " > - "a reference.", > - name, i, j); > + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_LOCAL_REFERENCE)) > elements_ok = false; > - } > } > > for (j = 2; j < 8; j++) { > - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_TRTBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element %" PRIu32 " is not " > - "an integer.", > - name, i, j); > + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) > elements_ok = false; > - } > } > > if (!elements_ok) { > diff --git a/src/lib/include/fwts_acpi_object_eval.h b/src/lib/include/fwts_acpi_object_eval.h > index 3d611916..472f91a1 100644 > --- a/src/lib/include/fwts_acpi_object_eval.h > +++ b/src/lib/include/fwts_acpi_object_eval.h > @@ -110,6 +110,7 @@ typedef struct { > fwts_method_check_type__(fw, name, buf, type, #type) > > int fwts_method_check_type__(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT_TYPE type, char *type_name); > +int fwts_method_check_element_type(fwts_framework *fw, char *name, ACPI_OBJECT *obj, uint32_t subpkg, uint32_t element, ACPI_OBJECT_TYPE type); > const char *fwts_method_type_name(const ACPI_OBJECT_TYPE type); > void fwts_method_passed_sane(fwts_framework *fw, const char *name, const char *type); > void fwts_method_passed_sane_uint64(fwts_framework *fw, const char *name, const uint64_t value); > diff --git a/src/lib/src/fwts_acpi_object_eval.c b/src/lib/src/fwts_acpi_object_eval.c > index e822a934..258cca64 100644 > --- a/src/lib/src/fwts_acpi_object_eval.c > +++ b/src/lib/src/fwts_acpi_object_eval.c > @@ -495,6 +495,86 @@ int fwts_method_check_type__( > return FWTS_OK; > } > > +/* > + * get_object_name() > + * get objname from full path nanme > + * ex. _BCL from _SB.PCI0.GFX0.LCD0._BCL > + */ > +static void get_object_name(char *name, char* obj_name) { > + /* obj_name must have length of 5 */ > + if (name != NULL && strlen(name) > 4) { > + memcpy(obj_name, name + strlen(name) - 4, 4); > + obj_name[4] = '\0'; > + } > +} > + > +/* See references in actypes.h */ > +static const char *acpi_object_names[] = { > + "Any", > + "Integer", > + "String", > + "Buffer", > + "Package", > + "Field Unit", > + "Device", > + "Event", > + "Method", > + "Mutex", > + "Region", > + "Power", > + "Processor", > + "Thermal", > + "Buffer Field", > + "DDB Handle", > + "Debug Object", > + "Region Field", > + "Bank Field", > + "Index Field", > + "Reference", > + "Alias", > + "Method Alias", > + "Notify", > + "Address Handler", > + "Resource", > + "Resource Field", > + "Scope" > +}; > + > +/* > + * fwts_method_check_element_type() > + * check a element type of a sub-package > + */ > +int fwts_method_check_element_type( > + fwts_framework *fw, > + char *name, > + ACPI_OBJECT *obj, > + uint32_t subpkg, > + uint32_t element, > + ACPI_OBJECT_TYPE type) > +{ > + if (obj->Package.Elements[element].Type != type) { > + char obj_name[5] = "_XYZ"; > + char tmp[128]; > + > + get_object_name(name, obj_name); > + snprintf(tmp, sizeof(tmp), "Method%sBadSubPackageReturnType", obj_name); > + > + if (type > FWTS_ARRAY_SIZE(acpi_object_names) - 1) { > + fwts_warning(fw, "Unknown ACPI object type detected"); > + return FWTS_ERROR; > + } > + > + fwts_failed(fw, LOG_LEVEL_HIGH, tmp, > + "%s sub-package %" PRIu32 " element %" PRIu32 " is a %s, " > + "expected a %s", name, subpkg, element, > + acpi_object_names[obj->Package.Elements[element].Type], > + acpi_object_names[type]); > + > + return FWTS_ERROR; > + } > + return FWTS_OK; > +} > + > /* > * Common types that can be returned. This is not a complete > * list but it does cover the types we expect to return from > Acked-by: Colin Ian King <colin.king@canonical.com>
On 1/14/21 4:33 AM, Alex Hung wrote: > The function name is fwts_method_check_element_type > > Signed-off-by: Alex Hung <alex.hung@canonical.com> > --- > src/acpi/method/method.c | 63 +++---------------- > src/lib/include/fwts_acpi_object_eval.h | 1 + > src/lib/src/fwts_acpi_object_eval.c | 80 +++++++++++++++++++++++++ > 3 files changed, 89 insertions(+), 55 deletions(-) > > diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c > index 07916c7f..cf994343 100644 > --- a/src/acpi/method/method.c > +++ b/src/acpi/method/method.c > @@ -698,14 +698,8 @@ static void method_test_DLM_return( > continue; > } > > - if (pkg->Package.Elements[0].Type != ACPI_TYPE_LOCAL_REFERENCE) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_DLMBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element 0 is not a reference.", > - name, i); > + if (fwts_method_check_element_type(fw, name, pkg, i, 0, ACPI_TYPE_LOCAL_REFERENCE)) > failed = true; > - } > > if (pkg->Package.Elements[1].Type != ACPI_TYPE_LOCAL_REFERENCE && > pkg->Package.Elements[1].Type != ACPI_TYPE_BUFFER) { > @@ -2371,15 +2365,8 @@ static void method_test_PSD_return( > > /* Elements in Sub-packages are integers */ > for (j = 0; j < 5; j++) { > - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_PSDBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element %" PRIu32 " is not " > - "an integer.", > - name, i, j); > + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) > elements_ok = false; > - } > } > > if (!elements_ok) { > @@ -4244,15 +4231,8 @@ static void method_test_FPS_return( > > for (j = 0; j < 5; j++) { > /* TODO - field 0 and 1 can be related to other control method */ > - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_FPSBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element %" PRIu32 " is not " > - "an integer.", > - name, i, j); > + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) > elements_ok = false; > - } > } > > if (!elements_ok) { > @@ -4448,27 +4428,14 @@ static void method_test_ART_return( > > /* First two elements are references, and rests are integers */ > for (j = 0; j < 2; j++) { > - if (pkg->Package.Elements[j].Type != ACPI_TYPE_LOCAL_REFERENCE) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_ARTBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element %" PRIu32 " is not " > - "a reference.", > - name, i, j); > + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_LOCAL_REFERENCE)) > elements_ok = false; > - } > } > > for (j = 2; j < 13; j++) { > - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_ARTBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element %" PRIu32 " is not " > - "an integer.", > - name, i, j); > + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) > elements_ok = false; > - } > + > } > > if (!elements_ok) { > @@ -4525,27 +4492,13 @@ static void method_test_TRT_return( > > /* First two elements are references, and rests are integers */ > for (j = 0; j < 2; j++) { > - if (pkg->Package.Elements[j].Type != ACPI_TYPE_LOCAL_REFERENCE) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_TRTBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element %" PRIu32 " is not " > - "a reference.", > - name, i, j); > + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_LOCAL_REFERENCE)) > elements_ok = false; > - } > } > > for (j = 2; j < 8; j++) { > - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { > - fwts_failed(fw, LOG_LEVEL_MEDIUM, > - "Method_TRTBadSubPackageReturnType", > - "%s sub-package %" PRIu32 > - " element %" PRIu32 " is not " > - "an integer.", > - name, i, j); > + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) > elements_ok = false; > - } > } > > if (!elements_ok) { > diff --git a/src/lib/include/fwts_acpi_object_eval.h b/src/lib/include/fwts_acpi_object_eval.h > index 3d611916..472f91a1 100644 > --- a/src/lib/include/fwts_acpi_object_eval.h > +++ b/src/lib/include/fwts_acpi_object_eval.h > @@ -110,6 +110,7 @@ typedef struct { > fwts_method_check_type__(fw, name, buf, type, #type) > > int fwts_method_check_type__(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT_TYPE type, char *type_name); > +int fwts_method_check_element_type(fwts_framework *fw, char *name, ACPI_OBJECT *obj, uint32_t subpkg, uint32_t element, ACPI_OBJECT_TYPE type); > const char *fwts_method_type_name(const ACPI_OBJECT_TYPE type); > void fwts_method_passed_sane(fwts_framework *fw, const char *name, const char *type); > void fwts_method_passed_sane_uint64(fwts_framework *fw, const char *name, const uint64_t value); > diff --git a/src/lib/src/fwts_acpi_object_eval.c b/src/lib/src/fwts_acpi_object_eval.c > index e822a934..258cca64 100644 > --- a/src/lib/src/fwts_acpi_object_eval.c > +++ b/src/lib/src/fwts_acpi_object_eval.c > @@ -495,6 +495,86 @@ int fwts_method_check_type__( > return FWTS_OK; > } > > +/* > + * get_object_name() > + * get objname from full path nanme > + * ex. _BCL from _SB.PCI0.GFX0.LCD0._BCL > + */ > +static void get_object_name(char *name, char* obj_name) { > + /* obj_name must have length of 5 */ > + if (name != NULL && strlen(name) > 4) { > + memcpy(obj_name, name + strlen(name) - 4, 4); > + obj_name[4] = '\0'; > + } > +} > + > +/* See references in actypes.h */ > +static const char *acpi_object_names[] = { > + "Any", > + "Integer", > + "String", > + "Buffer", > + "Package", > + "Field Unit", > + "Device", > + "Event", > + "Method", > + "Mutex", > + "Region", > + "Power", > + "Processor", > + "Thermal", > + "Buffer Field", > + "DDB Handle", > + "Debug Object", > + "Region Field", > + "Bank Field", > + "Index Field", > + "Reference", > + "Alias", > + "Method Alias", > + "Notify", > + "Address Handler", > + "Resource", > + "Resource Field", > + "Scope" > +}; > + > +/* > + * fwts_method_check_element_type() > + * check a element type of a sub-package > + */ > +int fwts_method_check_element_type( > + fwts_framework *fw, > + char *name, > + ACPI_OBJECT *obj, > + uint32_t subpkg, > + uint32_t element, > + ACPI_OBJECT_TYPE type) > +{ > + if (obj->Package.Elements[element].Type != type) { > + char obj_name[5] = "_XYZ"; > + char tmp[128]; > + > + get_object_name(name, obj_name); > + snprintf(tmp, sizeof(tmp), "Method%sBadSubPackageReturnType", obj_name); > + > + if (type > FWTS_ARRAY_SIZE(acpi_object_names) - 1) { > + fwts_warning(fw, "Unknown ACPI object type detected"); > + return FWTS_ERROR; > + } > + > + fwts_failed(fw, LOG_LEVEL_HIGH, tmp, > + "%s sub-package %" PRIu32 " element %" PRIu32 " is a %s, " > + "expected a %s", name, subpkg, element, > + acpi_object_names[obj->Package.Elements[element].Type], > + acpi_object_names[type]); > + > + return FWTS_ERROR; > + } > + return FWTS_OK; > +} > + > /* > * Common types that can be returned. This is not a complete > * list but it does cover the types we expect to return from > Acked-by: Ivan Hu <ivan.hu@canonical.com>
diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c index 07916c7f..cf994343 100644 --- a/src/acpi/method/method.c +++ b/src/acpi/method/method.c @@ -698,14 +698,8 @@ static void method_test_DLM_return( continue; } - if (pkg->Package.Elements[0].Type != ACPI_TYPE_LOCAL_REFERENCE) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_DLMBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element 0 is not a reference.", - name, i); + if (fwts_method_check_element_type(fw, name, pkg, i, 0, ACPI_TYPE_LOCAL_REFERENCE)) failed = true; - } if (pkg->Package.Elements[1].Type != ACPI_TYPE_LOCAL_REFERENCE && pkg->Package.Elements[1].Type != ACPI_TYPE_BUFFER) { @@ -2371,15 +2365,8 @@ static void method_test_PSD_return( /* Elements in Sub-packages are integers */ for (j = 0; j < 5; j++) { - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_PSDBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "an integer.", - name, i, j); + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) elements_ok = false; - } } if (!elements_ok) { @@ -4244,15 +4231,8 @@ static void method_test_FPS_return( for (j = 0; j < 5; j++) { /* TODO - field 0 and 1 can be related to other control method */ - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_FPSBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "an integer.", - name, i, j); + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) elements_ok = false; - } } if (!elements_ok) { @@ -4448,27 +4428,14 @@ static void method_test_ART_return( /* First two elements are references, and rests are integers */ for (j = 0; j < 2; j++) { - if (pkg->Package.Elements[j].Type != ACPI_TYPE_LOCAL_REFERENCE) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_ARTBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "a reference.", - name, i, j); + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_LOCAL_REFERENCE)) elements_ok = false; - } } for (j = 2; j < 13; j++) { - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_ARTBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "an integer.", - name, i, j); + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) elements_ok = false; - } + } if (!elements_ok) { @@ -4525,27 +4492,13 @@ static void method_test_TRT_return( /* First two elements are references, and rests are integers */ for (j = 0; j < 2; j++) { - if (pkg->Package.Elements[j].Type != ACPI_TYPE_LOCAL_REFERENCE) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_TRTBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "a reference.", - name, i, j); + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_LOCAL_REFERENCE)) elements_ok = false; - } } for (j = 2; j < 8; j++) { - if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) { - fwts_failed(fw, LOG_LEVEL_MEDIUM, - "Method_TRTBadSubPackageReturnType", - "%s sub-package %" PRIu32 - " element %" PRIu32 " is not " - "an integer.", - name, i, j); + if (fwts_method_check_element_type(fw, name, pkg, i, j, ACPI_TYPE_INTEGER)) elements_ok = false; - } } if (!elements_ok) { diff --git a/src/lib/include/fwts_acpi_object_eval.h b/src/lib/include/fwts_acpi_object_eval.h index 3d611916..472f91a1 100644 --- a/src/lib/include/fwts_acpi_object_eval.h +++ b/src/lib/include/fwts_acpi_object_eval.h @@ -110,6 +110,7 @@ typedef struct { fwts_method_check_type__(fw, name, buf, type, #type) int fwts_method_check_type__(fwts_framework *fw, char *name, ACPI_BUFFER *buf, ACPI_OBJECT_TYPE type, char *type_name); +int fwts_method_check_element_type(fwts_framework *fw, char *name, ACPI_OBJECT *obj, uint32_t subpkg, uint32_t element, ACPI_OBJECT_TYPE type); const char *fwts_method_type_name(const ACPI_OBJECT_TYPE type); void fwts_method_passed_sane(fwts_framework *fw, const char *name, const char *type); void fwts_method_passed_sane_uint64(fwts_framework *fw, const char *name, const uint64_t value); diff --git a/src/lib/src/fwts_acpi_object_eval.c b/src/lib/src/fwts_acpi_object_eval.c index e822a934..258cca64 100644 --- a/src/lib/src/fwts_acpi_object_eval.c +++ b/src/lib/src/fwts_acpi_object_eval.c @@ -495,6 +495,86 @@ int fwts_method_check_type__( return FWTS_OK; } +/* + * get_object_name() + * get objname from full path nanme + * ex. _BCL from _SB.PCI0.GFX0.LCD0._BCL + */ +static void get_object_name(char *name, char* obj_name) { + /* obj_name must have length of 5 */ + if (name != NULL && strlen(name) > 4) { + memcpy(obj_name, name + strlen(name) - 4, 4); + obj_name[4] = '\0'; + } +} + +/* See references in actypes.h */ +static const char *acpi_object_names[] = { + "Any", + "Integer", + "String", + "Buffer", + "Package", + "Field Unit", + "Device", + "Event", + "Method", + "Mutex", + "Region", + "Power", + "Processor", + "Thermal", + "Buffer Field", + "DDB Handle", + "Debug Object", + "Region Field", + "Bank Field", + "Index Field", + "Reference", + "Alias", + "Method Alias", + "Notify", + "Address Handler", + "Resource", + "Resource Field", + "Scope" +}; + +/* + * fwts_method_check_element_type() + * check a element type of a sub-package + */ +int fwts_method_check_element_type( + fwts_framework *fw, + char *name, + ACPI_OBJECT *obj, + uint32_t subpkg, + uint32_t element, + ACPI_OBJECT_TYPE type) +{ + if (obj->Package.Elements[element].Type != type) { + char obj_name[5] = "_XYZ"; + char tmp[128]; + + get_object_name(name, obj_name); + snprintf(tmp, sizeof(tmp), "Method%sBadSubPackageReturnType", obj_name); + + if (type > FWTS_ARRAY_SIZE(acpi_object_names) - 1) { + fwts_warning(fw, "Unknown ACPI object type detected"); + return FWTS_ERROR; + } + + fwts_failed(fw, LOG_LEVEL_HIGH, tmp, + "%s sub-package %" PRIu32 " element %" PRIu32 " is a %s, " + "expected a %s", name, subpkg, element, + acpi_object_names[obj->Package.Elements[element].Type], + acpi_object_names[type]); + + return FWTS_ERROR; + } + return FWTS_OK; +} + /* * Common types that can be returned. This is not a complete * list but it does cover the types we expect to return from
The function name is fwts_method_check_element_type Signed-off-by: Alex Hung <alex.hung@canonical.com> --- src/acpi/method/method.c | 63 +++---------------- src/lib/include/fwts_acpi_object_eval.h | 1 + src/lib/src/fwts_acpi_object_eval.c | 80 +++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 55 deletions(-)