Commit 086ab742 authored by Lv Zheng's avatar Lv Zheng Committed by Rafael J. Wysocki

ACPICA: Debugger: Fix "terminate" command by cleaning up subsystem shutdown logic

ACPICA commit 7e823714911480be47e310fb1b3590d289b9fd99

Segmentation fault can be seen for executing the "terminate" command. This
is because acpi_ut_subsystem_shutdown() is errnously called multiple times.

This patch cleans up acpi_ut_subsystem_shutdown() logics to fix this
issue. Lv Zheng.

Link: https://github.com/acpica/acpica/commit/7e823714Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent af08f9cc
...@@ -1074,6 +1074,7 @@ acpi_db_command_dispatch(char *input_buffer, ...@@ -1074,6 +1074,7 @@ acpi_db_command_dispatch(char *input_buffer,
* re-creating the semaphores! * re-creating the semaphores!
*/ */
acpi_gbl_db_terminate_loop = TRUE;
/* acpi_initialize (NULL); */ /* acpi_initialize (NULL); */
break; break;
...@@ -1151,7 +1152,7 @@ void ACPI_SYSTEM_XFACE acpi_db_execute_thread(void *context) ...@@ -1151,7 +1152,7 @@ void ACPI_SYSTEM_XFACE acpi_db_execute_thread(void *context)
acpi_status status = AE_OK; acpi_status status = AE_OK;
acpi_status Mstatus; acpi_status Mstatus;
while (status != AE_CTRL_TERMINATE) { while (status != AE_CTRL_TERMINATE && !acpi_gbl_db_terminate_loop) {
acpi_gbl_method_executing = FALSE; acpi_gbl_method_executing = FALSE;
acpi_gbl_step_to_next_call = FALSE; acpi_gbl_step_to_next_call = FALSE;
......
...@@ -282,6 +282,19 @@ void acpi_ut_subsystem_shutdown(void) ...@@ -282,6 +282,19 @@ void acpi_ut_subsystem_shutdown(void)
{ {
ACPI_FUNCTION_TRACE(ut_subsystem_shutdown); ACPI_FUNCTION_TRACE(ut_subsystem_shutdown);
/* Just exit if subsystem is already shutdown */
if (acpi_gbl_shutdown) {
ACPI_ERROR((AE_INFO, "ACPI Subsystem is already terminated"));
return_VOID;
}
/* Subsystem appears active, go ahead and shut it down */
acpi_gbl_shutdown = TRUE;
acpi_gbl_startup_flags = 0;
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
#ifndef ACPI_ASL_COMPILER #ifndef ACPI_ASL_COMPILER
/* Close the acpi_event Handling */ /* Close the acpi_event Handling */
......
...@@ -67,19 +67,6 @@ acpi_status __init acpi_terminate(void) ...@@ -67,19 +67,6 @@ acpi_status __init acpi_terminate(void)
ACPI_FUNCTION_TRACE(acpi_terminate); ACPI_FUNCTION_TRACE(acpi_terminate);
/* Just exit if subsystem is already shutdown */
if (acpi_gbl_shutdown) {
ACPI_ERROR((AE_INFO, "ACPI Subsystem is already terminated"));
return_ACPI_STATUS(AE_OK);
}
/* Subsystem appears active, go ahead and shut it down */
acpi_gbl_shutdown = TRUE;
acpi_gbl_startup_flags = 0;
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
/* Shutdown and free all resources */ /* Shutdown and free all resources */
acpi_ut_subsystem_shutdown(); acpi_ut_subsystem_shutdown();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment