ACPICA: acpiexec: enhance local signal handler
authorBob Moore <robert.moore@intel.com>
Mon, 5 Jun 2017 08:42:23 +0000 (16:42 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 27 Jun 2017 20:25:27 +0000 (22:25 +0200)
ACPICA commit ffef4ae9a1b6032ebadeab2c2b806f0e585f0006

Add support for SIGSEGV
Improve/cleanup SIGINT handling

Link: https://github.com/acpica/acpica/commit/ffef4ae9
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/dbexec.c
drivers/acpi/acpica/dsmethod.c
drivers/acpi/acpica/psparse.c

index b611cd92b5f59e266fa970ab8e0dec8b9e441b3b..3b30319752f046e4a8f20782d6a59596b575ccbd 100644 (file)
@@ -181,6 +181,18 @@ acpi_db_execute_method(struct acpi_db_method_info *info,
        acpi_gbl_method_executing = FALSE;
 
        if (ACPI_FAILURE(status)) {
+               if ((status == AE_ABORT_METHOD) || acpi_gbl_abort_method) {
+
+                       /* Clear the abort and fall back to the debugger prompt */
+
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Aborting top-level method"));
+
+                       acpi_gbl_abort_method = FALSE;
+                       status = AE_OK;
+                       goto cleanup;
+               }
+
                ACPI_EXCEPTION((AE_INFO, status,
                                "while executing %s from debugger",
                                info->pathname));
index 31c9c7aec3d592343bdef9a626e7373208848bb8..d7fc36917c6714988ad88b7eeaa58b2d925f0174 100644 (file)
@@ -212,6 +212,7 @@ acpi_status
 acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
 {
        u32 aml_offset;
+       acpi_name name = 0;
 
        ACPI_FUNCTION_ENTRY();
 
@@ -237,10 +238,13 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
                                                walk_state->parser_state.
                                                aml_start);
 
-               status = acpi_gbl_exception_handler(status,
-                                                   walk_state->method_node ?
-                                                   walk_state->method_node->
-                                                   name.integer : 0,
+               if (walk_state->method_node) {
+                       name = walk_state->method_node->name.integer;
+               } else if (walk_state->deferred_node) {
+                       name = walk_state->deferred_node->name.integer;
+               }
+
+               status = acpi_gbl_exception_handler(status, name,
                                                    walk_state->opcode,
                                                    aml_offset, NULL);
                acpi_ex_enter_interpreter();
index 8116a670de393a6f03a57d1819392e071b1ad918..ac88319dc1114293b4bfdcafa96f9c97205ff410 100644 (file)
@@ -56,6 +56,7 @@
 #include "acdispat.h"
 #include "amlcode.h"
 #include "acinterp.h"
+#include "acnamesp.h"
 
 #define _COMPONENT          ACPI_PARSER
 ACPI_MODULE_NAME("psparse")
@@ -538,9 +539,16 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
                        /* Either the method parse or actual execution failed */
 
                        acpi_ex_exit_interpreter();
-                       ACPI_ERROR_METHOD("Method parse/execution failed",
-                                         walk_state->method_node, NULL,
-                                         status);
+                       if (status == AE_ABORT_METHOD) {
+                               acpi_ns_print_node_pathname(walk_state->
+                                                           method_node,
+                                                           "Method aborted:");
+                               acpi_os_printf("\n");
+                       } else {
+                               ACPI_ERROR_METHOD
+                                   ("Method parse/execution failed",
+                                    walk_state->method_node, NULL, status);
+                       }
                        acpi_ex_enter_interpreter();
 
                        /* Check for possible multi-thread reentrancy problem */