ACPICA: Debugger: Fix possible fault with the "test objects" command
authorBob Moore <robert.moore@intel.com>
Fri, 15 Feb 2019 21:36:08 +0000 (13:36 -0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 18 Feb 2019 10:21:10 +0000 (11:21 +0100)
ACPICA commit 349dd29335d6928f883bc95c614a0edd033141bb

 - Fault on Field Units
 - Some restructuring
 - General cleanup of dbtest module

Link: https://github.com/acpica/acpica/commit/349dd293
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/acdebug.h
drivers/acpi/acpica/dbtest.c

index 3a33904..32f2e38 100644 (file)
@@ -16,7 +16,8 @@
 #include "acdisasm.h"
 #endif
 
-#define ACPI_DEBUG_BUFFER_SIZE  0x4000 /* 16K buffer for return objects */
+#define ACPI_DEBUG_BUFFER_SIZE      0x4000     /* 16K buffer for return objects */
+#define ACPI_DEBUG_LENGTH_FORMAT    " (%.4X bits, %.3X bytes)"
 
 struct acpi_db_command_info {
        const char *name;       /* Command Name */
index 8a54624..6db44a5 100644 (file)
@@ -10,6 +10,7 @@
 #include "acdebug.h"
 #include "acnamesp.h"
 #include "acpredef.h"
+#include "acinterp.h"
 
 #define _COMPONENT          ACPI_CA_DEBUGGER
 ACPI_MODULE_NAME("dbtest")
@@ -32,6 +33,9 @@ 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_test_field_unit_type(union acpi_operand_object *obj_desc);
+
 static acpi_status
 acpi_db_read_from_object(struct acpi_namespace_node *node,
                         acpi_object_type expected_type,
@@ -74,7 +78,7 @@ static struct acpi_db_argument_info acpi_db_test_types[] = {
 static acpi_handle read_handle = NULL;
 static acpi_handle write_handle = NULL;
 
-/* ASL Definitions of the debugger read/write control methods */
+/* ASL Definitions of the debugger read/write control methods. AML below. */
 
 #if 0
 definition_block("ssdt.aml", "SSDT", 2, "Intel", "DEBUG", 0x00000001)
@@ -227,10 +231,8 @@ static void acpi_db_test_all_objects(void)
  * RETURN:      Status
  *
  * DESCRIPTION: Test one namespace object. Supported types are Integer,
- *              String, Buffer, buffer_field, and field_unit. All other object
- *              types are simply ignored.
- *
- *              Note: Support for Packages is not implemented.
+ *              String, Buffer, Package, buffer_field, and field_unit.
+ *              All other object types are simply ignored.
  *
  ******************************************************************************/
 
@@ -240,7 +242,6 @@ acpi_db_test_one_object(acpi_handle obj_handle,
 {
        struct acpi_namespace_node *node;
        union acpi_operand_object *obj_desc;
-       union acpi_operand_object *region_obj;
        acpi_object_type local_type;
        u32 bit_length = 0;
        u32 byte_length = 0;
@@ -281,18 +282,21 @@ acpi_db_test_one_object(acpi_handle obj_handle,
                break;
 
        case ACPI_TYPE_FIELD_UNIT:
-       case ACPI_TYPE_BUFFER_FIELD:
        case ACPI_TYPE_LOCAL_REGION_FIELD:
        case ACPI_TYPE_LOCAL_INDEX_FIELD:
        case ACPI_TYPE_LOCAL_BANK_FIELD:
 
+               local_type = ACPI_TYPE_FIELD_UNIT;
+               break;
+
+       case ACPI_TYPE_BUFFER_FIELD:
+               /*
+                * The returned object will be a Buffer if the field length
+                * is larger than the size of an Integer (32 or 64 bits
+                * depending on the DSDT version).
+                */
                local_type = ACPI_TYPE_INTEGER;
                if (obj_desc) {
-                       /*
-                        * Returned object will be a Buffer if the field length
-                        * is larger than the size of an Integer (32 or 64 bits
-                        * depending on the DSDT version).
-                        */
                        bit_length = obj_desc->common_field.bit_length;
                        byte_length = ACPI_ROUND_BITS_UP_TO_BYTES(bit_length);
                        if (bit_length > acpi_gbl_integer_bit_width) {
@@ -303,7 +307,7 @@ acpi_db_test_one_object(acpi_handle obj_handle,
 
        default:
 
-               /* Ignore all other types */
+               /* Ignore all non-data types - Methods, Devices, Scopes, etc. */
 
                return (AE_OK);
        }
@@ -314,40 +318,10 @@ acpi_db_test_one_object(acpi_handle obj_handle,
                       acpi_ut_get_type_name(node->type), node->name.ascii);
 
        if (!obj_desc) {
-               acpi_os_printf(" Ignoring, no attached object\n");
+               acpi_os_printf(" No attached sub-object, ignoring\n");
                return (AE_OK);
        }
 
-       /*
-        * Check for unsupported region types. Note: acpi_exec simulates
-        * access to system_memory, system_IO, PCI_Config, and EC.
-        */
-       switch (node->type) {
-       case ACPI_TYPE_LOCAL_REGION_FIELD:
-
-               region_obj = obj_desc->field.region_obj;
-               switch (region_obj->region.space_id) {
-               case ACPI_ADR_SPACE_SYSTEM_MEMORY:
-               case ACPI_ADR_SPACE_SYSTEM_IO:
-               case ACPI_ADR_SPACE_PCI_CONFIG:
-
-                       break;
-
-               default:
-
-                       acpi_os_printf
-                           ("    %s space is not supported in this command [%4.4s]\n",
-                            acpi_ut_get_region_name(region_obj->region.
-                                                    space_id),
-                            region_obj->region.node->name.ascii);
-                       return (AE_OK);
-               }
-               break;
-
-       default:
-               break;
-       }
-
        /* At this point, we have resolved the object to one of the major types */
 
        switch (local_type) {
@@ -371,6 +345,11 @@ acpi_db_test_one_object(acpi_handle obj_handle,
                status = acpi_db_test_package_type(node);
                break;
 
+       case ACPI_TYPE_FIELD_UNIT:
+
+               status = acpi_db_test_field_unit_type(obj_desc);
+               break;
+
        default:
 
                acpi_os_printf(" Ignoring, type not implemented (%2.2X)",
@@ -382,24 +361,8 @@ acpi_db_test_one_object(acpi_handle obj_handle,
 
        if (ACPI_FAILURE(status)) {
                status = AE_OK;
-               goto exit;
-       }
-
-       switch (node->type) {
-       case ACPI_TYPE_LOCAL_REGION_FIELD:
-
-               region_obj = obj_desc->field.region_obj;
-               acpi_os_printf(" (%s)",
-                              acpi_ut_get_region_name(region_obj->region.
-                                                      space_id));
-
-               break;
-
-       default:
-               break;
        }
 
-exit:
        acpi_os_printf("\n");
        return (status);
 }
@@ -444,7 +407,7 @@ acpi_db_test_integer_type(struct acpi_namespace_node *node, u32 bit_length)
                return (status);
        }
 
-       acpi_os_printf(" (%4.4X/%3.3X) %8.8X%8.8X",
+       acpi_os_printf(ACPI_DEBUG_LENGTH_FORMAT " %8.8X%8.8X",
                       bit_length, ACPI_ROUND_BITS_UP_TO_BYTES(bit_length),
                       ACPI_FORMAT_UINT64(temp1->integer.value));
 
@@ -558,8 +521,9 @@ acpi_db_test_buffer_type(struct acpi_namespace_node *node, u32 bit_length)
 
        /* Emit a few bytes of the buffer */
 
-       acpi_os_printf(" (%4.4X/%3.3X)", bit_length, temp1->buffer.length);
-       for (i = 0; ((i < 4) && (i < byte_length)); i++) {
+       acpi_os_printf(ACPI_DEBUG_LENGTH_FORMAT, bit_length,
+                      temp1->buffer.length);
+       for (i = 0; ((i < 8) && (i < byte_length)); i++) {
                acpi_os_printf(" %2.2X", temp1->buffer.pointer[i]);
        }
        acpi_os_printf("... ");
@@ -665,8 +629,9 @@ acpi_db_test_string_type(struct acpi_namespace_node *node, u32 byte_length)
                return (status);
        }
 
-       acpi_os_printf(" (%4.4X/%3.3X) \"%s\"", (temp1->string.length * 8),
-                      temp1->string.length, temp1->string.pointer);
+       acpi_os_printf(ACPI_DEBUG_LENGTH_FORMAT " \"%s\"",
+                      (temp1->string.length * 8), temp1->string.length,
+                      temp1->string.pointer);
 
        /* Write a new value */
 
@@ -750,11 +715,78 @@ static acpi_status acpi_db_test_package_type(struct acpi_namespace_node *node)
                return (status);
        }
 
-       acpi_os_printf(" %8.8X Elements", temp1->package.count);
+       acpi_os_printf(" %.2X Elements", temp1->package.count);
        acpi_os_free(temp1);
        return (status);
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_db_test_field_unit_type
+ *
+ * PARAMETERS:  obj_desc                - A field unit object
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Test read/write on a named field unit.
+ *
+ ******************************************************************************/
+
+static acpi_status
+acpi_db_test_field_unit_type(union acpi_operand_object *obj_desc)
+{
+       union acpi_operand_object *region_obj;
+       u32 bit_length = 0;
+       u32 byte_length = 0;
+       acpi_status status = AE_OK;
+       union acpi_operand_object *ret_buffer_desc;
+
+       /* Supported spaces are memory/io/pci_config */
+
+       region_obj = obj_desc->field.region_obj;
+       switch (region_obj->region.space_id) {
+       case ACPI_ADR_SPACE_SYSTEM_MEMORY:
+       case ACPI_ADR_SPACE_SYSTEM_IO:
+       case ACPI_ADR_SPACE_PCI_CONFIG:
+
+               /* Need the interpreter to execute */
+
+               acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER);
+               acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
+
+               /* Exercise read-then-write */
+
+               status =
+                   acpi_ex_read_data_from_field(NULL, obj_desc,
+                                                &ret_buffer_desc);
+               if (status == AE_OK) {
+                       acpi_ex_write_data_to_field(ret_buffer_desc, obj_desc,
+                                                   NULL);
+                       acpi_ut_remove_reference(ret_buffer_desc);
+               }
+
+               acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+               acpi_ut_release_mutex(ACPI_MTX_INTERPRETER);
+
+               bit_length = obj_desc->common_field.bit_length;
+               byte_length = ACPI_ROUND_BITS_UP_TO_BYTES(bit_length);
+
+               acpi_os_printf(ACPI_DEBUG_LENGTH_FORMAT " [%s]", bit_length,
+                              byte_length,
+                              acpi_ut_get_region_name(region_obj->region.
+                                                      space_id));
+               return (status);
+
+       default:
+
+               acpi_os_printf
+                   ("      %s address space is not supported in this command [%4.4s]",
+                    acpi_ut_get_region_name(region_obj->region.space_id),
+                    region_obj->region.node->name.ascii);
+               return (AE_OK);
+       }
+}
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_db_read_from_object