NAK: [PATCH] [PATCH 01/37][RESEND] acpi: method: add DDN, HID, HRV, PLD, SUB, STR checks
Colin Ian King
colin.king at canonical.com
Thu Sep 27 09:29:41 UTC 2012
- Previous message: [PATCH] [PATCH 01/37][RESEND] acpi: method: add DDN, HID, HRV, PLD, SUB, STR checks
- Next message: [PATCH 1/8][RESEND] acpi: method: add DDN, HID, HRV, PLD, SUB, STR checks
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Bah, title is all wrong, will send again.
On 27/09/12 09:52, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> src/acpi/method/method.c | 234 +++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 222 insertions(+), 12 deletions(-)
>
> diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
> index 311ef74..61498ef 100644
> --- a/src/acpi/method/method.c
> +++ b/src/acpi/method/method.c
> @@ -23,6 +23,7 @@
> #include <string.h>
> #include <signal.h>
> #include <unistd.h>
> +#include <ctype.h>
>
> /* acpica headers */
> #include "acpi.h"
> @@ -73,7 +74,7 @@
> * _DCK 6.5.2 Y
> * _DCS B.6.6 Y
> * _DDC B.6.5 Y
> - * _DDN 6.1.4 N
> + * _DDN 6.1.4 Y
> * _DEP 6.5.8 N
> * _DGS B.6.7 Y
> * _DIS 6.2.3 Y
> @@ -111,7 +112,7 @@
> * _GTM 9.8.2.1.1 N
> * _GTS 7.3.3 deprecated
> * _GWS 9.18.5 N
> - * _HID 6.1.5 N
> + * _HID 6.1.5 Y
> * _HOT 11.4.6 Y
> * _HPP 6.2.7 N
> * _HPX 6.2.8 N
> @@ -142,7 +143,7 @@
> * _PDL 8.4.4.6 N
> * _PIC 5.8.1 N
> * _PIF 10.3.3 Y
> - * _PLD 6.1.8 N
> + * _PLD 6.1.8 Y
> * _PMC 10.4.1 N
> * _PMD 10.4.8 N
> * _PMM 10.4.3 N
> @@ -209,9 +210,9 @@
> * _STA 6.3.7, 7.1.4 N
> * _STM 9.8.2.1.2 N
> * _STP 9.18.7 N
> - * _STR 6.1.9 N
> + * _STR 6.1.9 Y
> * _STV 9.18.8 N
> - * _SUB 6.1.9 N
> + * _SUB 6.1.9 Y
> * _SUN 6.1.8 N
> * _SWS 7.3.5 N
> * _T_x 18.2.1.1 n/a
> @@ -664,6 +665,215 @@ static int method_test_AEI(fwts_framework *fw)
> /*
> * Section 6.1 Device Identification Objects
> */
> +static int method_test_DDN(fwts_framework *fw)
> +{
> + return method_evaluate_method(fw, METHOD_OPTIONAL,
> + "_DDN", NULL, 0, method_test_string_return, NULL);
> +}
> +
> +static bool method_valid_HID_string(char *str)
> +{
> + if (strlen(str) == 7) {
> + /* PNP ID, must be 3 capitals followed by 4 hex */
> + if (!isupper(str[0]) ||
> + !isupper(str[1]) ||
> + !isupper(str[2])) return false;
> + if (!isxdigit(str[3]) ||
> + !isxdigit(str[4]) ||
> + !isxdigit(str[5]) ||
> + !isxdigit(str[6])) return false;
> + return true;
> + }
> +
> + if (strlen(str) == 8) {
> + /* ACPI ID, must be 4 capitals or digits followed by 4 hex */
> + if ((!isupper(str[0]) && !isdigit(str[0])) ||
> + (!isupper(str[1]) && !isdigit(str[1])) ||
> + (!isupper(str[2]) && !isdigit(str[2])) ||
> + (!isupper(str[3]) && !isdigit(str[3]))) return false;
> + if (!isxdigit(str[4]) ||
> + !isxdigit(str[5]) ||
> + !isxdigit(str[6]) ||
> + !isxdigit(str[7])) return false;
> + return true;
> + }
> +
> + return false;
> +}
> +
> +static bool method_valid_EISA_ID(uint32_t id, char *buf, size_t buf_len)
> +{
> + snprintf(buf, buf_len, "%c%c%c%02X%02X",
> + 0x40 + ((id >> 2) & 0x1f),
> + 0x40 + ((id & 0x3) << 3) + ((id >> 13) & 0x7),
> + 0x40 + ((id >> 8) & 0x1f),
> + (id >> 16) & 0xff, (id >> 24) & 0xff);
> +
> + /* 3 chars in EISA ID must be upper case */
> + if (!isupper(buf[0]) ||
> + !isupper(buf[1]) ||
> + !isupper(buf[2])) return false;
> +
> + /* Last 4 digits are always going to be hex, so pass */
> + return true;
> +}
> +
> +static void method_test_HID_return(
> + fwts_framework *fw,
> + char *name,
> + ACPI_BUFFER *buf,
> + ACPI_OBJECT *obj,
> + void *private)
> +{
> + char tmp[8];
> +
> + if (obj == NULL) {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM, "MethodReturnNullObj",
> + "Method %s returned a NULL object, and did not "
> + "return a buffer or integer.", name);
> + return;
> + }
> + switch (obj->Type) {
> + case ACPI_TYPE_STRING:
> + if (obj->String.Pointer) {
> + if (method_valid_HID_string(obj->String.Pointer))
> + fwts_passed(fw,
> + "Object _HID returned a string '%s' "
> + "as expected.",
> + obj->String.Pointer);
> + else
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "MethodHIDInvalidString",
> + "Object _HID returned a string '%s' "
> + "but it was not a valid PNP ID or a "
> + "valid ACPI ID.",
> + obj->String.Pointer);
> + } else {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "Method_HIDNullString",
> + "Object _HID returned a NULL string.");
> + fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> + }
> + break;
> + case ACPI_TYPE_INTEGER:
> + if (method_valid_EISA_ID((uint32_t)obj->Integer.Value,
> + tmp, sizeof(tmp)))
> + fwts_passed(fw, "Object _HID returned an integer 0x%8.8lx (EISA ID %s).",
> + (unsigned long)obj->Integer.Value,
> + tmp);
> + else
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "MethodHIDInvalidInteger",
> + "Object _HID returned a integer 0x%8.8lx "
> + "(EISA ID %s) but the this is not a valid "
> + "EISA ID encoded PNP ID.",
> + (unsigned long)obj->Integer.Value,
> + tmp);
> + break;
> + default:
> + fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_HIDBadReturnType",
> + "Method _HID did not return a string or an integer.");
> + fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> + break;
> + }
> +}
> +
> +static int method_test_HID(fwts_framework *fw)
> +{
> + return method_evaluate_method(fw, METHOD_OPTIONAL,
> + "_HID", NULL, 0, method_test_HID_return, NULL);
> +}
> +
> +static int method_test_HRV(fwts_framework *fw)
> +{
> + return method_evaluate_method(fw, METHOD_OPTIONAL,
> + "_HRV", NULL, 0, method_test_integer_return, NULL);
> +}
> +
> +static int method_test_STR(fwts_framework *fw)
> +{
> + return method_evaluate_method(fw, METHOD_OPTIONAL,
> + "_STR", NULL, 0, method_test_string_return, NULL);
> +}
> +
> +static void method_test_PLD_return(
> + fwts_framework *fw,
> + char *name,
> + ACPI_BUFFER *buf,
> + ACPI_OBJECT *obj,
> + void *private)
> +{
> + int i;
> +
> + if (method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
> + return;
> +
> + /* All elements in the package must be buffers */
> + for (i = 0; i < obj->Package.Count; i++) {
> + if (obj->Package.Elements[i].Type != ACPI_TYPE_BUFFER) {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "Method_PLDElementType",
> + "_PLD package element %d was not a buffer.",
> + i);
> + fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> + }
> + /* We should sanity check the PLD further */
> + }
> +}
> +
> +static int method_test_PLD(fwts_framework *fw)
> +{
> + return method_evaluate_method(fw, METHOD_OPTIONAL,
> + "_PLD", NULL, 0, method_test_PLD_return, NULL);
> +}
> +
> +static void method_test_SUB_return(
> + fwts_framework *fw,
> + char *name,
> + ACPI_BUFFER *buf,
> + ACPI_OBJECT *obj,
> + void *private)
> +{
> + if (obj == NULL) {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM, "MethodReturnNullObj",
> + "Method %s returned a NULL object, and did not "
> + "return a buffer or integer.", name);
> + return;
> + }
> + if (obj->Type == ACPI_TYPE_STRING)
> + if (obj->String.Pointer) {
> + if (method_valid_HID_string(obj->String.Pointer))
> + fwts_passed(fw,
> + "Object _SUB returned a string '%s' "
> + "as expected.",
> + obj->String.Pointer);
> + else
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "MethodSUBInvalidString",
> + "Object _SUB returned a string '%s' "
> + "but it was not a valid PNP ID or a "
> + "valid ACPI ID.",
> + obj->String.Pointer);
> + } else {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "Method_SUBNullString",
> + "Object _SUB returned a NULL string.");
> + fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> + }
> + else {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM, "Method_UIDBadReturnType",
> + "Method _SUB did not return a string or an integer.");
> + fwts_tag_failed(fw, FWTS_TAG_ACPI_METHOD_RETURN);
> + }
> +}
> +
> +
> +static int method_test_SUB(fwts_framework *fw)
> +{
> + return method_evaluate_method(fw, METHOD_OPTIONAL,
> + "_SUB", NULL, 0, method_test_SUB_return, NULL);
> +}
> +
> static int method_test_SUN(fwts_framework *fw)
> {
> return method_evaluate_method(fw, METHOD_OPTIONAL,
> @@ -697,7 +907,7 @@ static void method_test_UID_return(
> }
> break;
> case ACPI_TYPE_INTEGER:
> - fwts_passed(fw, "Object _UID returned am integer 0x%8.8llx.",
> + fwts_passed(fw, "Object _UID returned an integer 0x%8.8llx.",
> (unsigned long long)obj->Integer.Value);
> break;
> default:
> @@ -2671,14 +2881,14 @@ static fwts_framework_minor_test method_tests[] = {
>
> /* { method_test_CID, "Check _CID (Compatible ID)." }, */
> /* { method_test_CLS, "Check _CLS (Class Code)." }, */
> - /* { method_test_DDN, "Check _DDN (DOS Device Name)." }, */
> - /* { method_test_HID, "Check _HID (Hardware ID)." }, */
> - /* { method_test_HRV, "Check _HRV (Hardware Revision Number)." }, */
> + { method_test_DDN, "Check _DDN (DOS Device Name)." },
> + { method_test_HID, "Check _HID (Hardware ID)." },
> + { method_test_HRV, "Check _HRV (Hardware Revision Number)." },
> /* { method_test_MLS, "Check _MLS (Multiple Language String)." }, */
> - /* { method_test_PLD, "Check _PLD (Physical Device Location)." }, */
> - /* { method_test_SUB, "Check _SUB (Subsystem ID)." }, */
> + { method_test_PLD, "Check _PLD (Physical Device Location)." },
> + { method_test_SUB, "Check _SUB (Subsystem ID)." },
> { method_test_SUN, "Check _SUN (Slot User Number)." },
> - /* { method_test_STR, "Check _STR (String)." }, */
> + { method_test_STR, "Check _STR (String)." },
> { method_test_UID, "Check _UID (Unique ID)." },
>
> /* Section 6.2 Device Configurations Objects */
>
- Previous message: [PATCH] [PATCH 01/37][RESEND] acpi: method: add DDN, HID, HRV, PLD, SUB, STR checks
- Next message: [PATCH 1/8][RESEND] acpi: method: add DDN, HID, HRV, PLD, SUB, STR checks
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the fwts-devel
mailing list