OSDN Git Service

ACPICA: Debugger: Add Package support for "test objects" command
authorBob Moore <robert.moore@intel.com>
Tue, 8 May 2018 21:06:12 +0000 (14:06 -0700)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 15 May 2018 08:16:10 +0000 (10:16 +0200)
This was missing in the initial implementation of "test objects".

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Erik Schmauss <erik.schmauss@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/dbtest.c

index 3892680..5536104 100644 (file)
@@ -30,6 +30,8 @@ acpi_db_test_buffer_type(struct acpi_namespace_node *node, u32 bit_length);
 static acpi_status
 acpi_db_test_string_type(struct acpi_namespace_node *node, u32 byte_length);
 
+static acpi_status acpi_db_test_package_type(struct acpi_namespace_node *node);
+
 static acpi_status
 acpi_db_read_from_object(struct acpi_namespace_node *node,
                         acpi_object_type expected_type,
@@ -273,6 +275,11 @@ acpi_db_test_one_object(acpi_handle obj_handle,
                bit_length = byte_length * 8;
                break;
 
+       case ACPI_TYPE_PACKAGE:
+
+               local_type = ACPI_TYPE_PACKAGE;
+               break;
+
        case ACPI_TYPE_FIELD_UNIT:
        case ACPI_TYPE_BUFFER_FIELD:
        case ACPI_TYPE_LOCAL_REGION_FIELD:
@@ -305,6 +312,7 @@ acpi_db_test_one_object(acpi_handle obj_handle,
 
        acpi_os_printf("%14s: %4.4s",
                       acpi_ut_get_type_name(node->type), node->name.ascii);
+
        if (!obj_desc) {
                acpi_os_printf(" Ignoring, no attached object\n");
                return (AE_OK);
@@ -359,6 +367,11 @@ acpi_db_test_one_object(acpi_handle obj_handle,
                status = acpi_db_test_buffer_type(node, bit_length);
                break;
 
+       case ACPI_TYPE_PACKAGE:
+
+               status = acpi_db_test_package_type(node);
+               break;
+
        default:
 
                acpi_os_printf(" Ignoring, type not implemented (%2.2X)",
@@ -366,6 +379,13 @@ acpi_db_test_one_object(acpi_handle obj_handle,
                break;
        }
 
+       /* Exit on error, but don't abort the namespace walk */
+
+       if (ACPI_FAILURE(status)) {
+               status = AE_OK;
+               goto exit;
+       }
+
        switch (node->type) {
        case ACPI_TYPE_LOCAL_REGION_FIELD:
 
@@ -373,12 +393,14 @@ acpi_db_test_one_object(acpi_handle obj_handle,
                acpi_os_printf(" (%s)",
                               acpi_ut_get_region_name(region_obj->region.
                                                       space_id));
+
                break;
 
        default:
                break;
        }
 
+exit:
        acpi_os_printf("\n");
        return (status);
 }
@@ -431,7 +453,6 @@ acpi_db_test_integer_type(struct acpi_namespace_node *node, u32 bit_length)
        if (temp1->integer.value == value_to_write) {
                value_to_write = 0;
        }
-
        /* Write a new value */
 
        write_value.type = ACPI_TYPE_INTEGER;
@@ -708,6 +729,35 @@ exit:
 
 /*******************************************************************************
  *
+ * FUNCTION:    acpi_db_test_package_type
+ *
+ * PARAMETERS:  node                - Parent NS node for the object
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Test read for a Package object.
+ *
+ ******************************************************************************/
+
+static acpi_status acpi_db_test_package_type(struct acpi_namespace_node *node)
+{
+       union acpi_object *temp1 = NULL;
+       acpi_status status;
+
+       /* Read the original value */
+
+       status = acpi_db_read_from_object(node, ACPI_TYPE_PACKAGE, &temp1);
+       if (ACPI_FAILURE(status)) {
+               return (status);
+       }
+
+       acpi_os_printf(" %8.8X Elements", temp1->package.count);
+       acpi_os_free(temp1);
+       return (status);
+}
+
+/*******************************************************************************
+ *
  * FUNCTION:    acpi_db_read_from_object
  *
  * PARAMETERS:  node                - Parent NS node for the object
@@ -746,8 +796,8 @@ acpi_db_read_from_object(struct acpi_namespace_node *node,
        acpi_gbl_method_executing = TRUE;
        status = acpi_evaluate_object(read_handle, NULL,
                                      &param_objects, &return_obj);
-       acpi_gbl_method_executing = FALSE;
 
+       acpi_gbl_method_executing = FALSE;
        if (ACPI_FAILURE(status)) {
                acpi_os_printf("Could not read from object, %s",
                               acpi_format_exception(status));
@@ -760,6 +810,7 @@ acpi_db_read_from_object(struct acpi_namespace_node *node,
        case ACPI_TYPE_INTEGER:
        case ACPI_TYPE_BUFFER:
        case ACPI_TYPE_STRING:
+       case ACPI_TYPE_PACKAGE:
                /*
                 * Did we receive the type we wanted? Most important for the
                 * Integer/Buffer case (when a field is larger than an Integer,
@@ -771,6 +822,7 @@ acpi_db_read_from_object(struct acpi_namespace_node *node,
                             acpi_ut_get_type_name(expected_type),
                             acpi_ut_get_type_name(ret_value->type));
 
+                       acpi_os_free(return_obj.pointer);
                        return (AE_TYPE);
                }