diff --git a/headers/private/kernel/kernel.h b/headers/private/kernel/kernel.h index 56117b9f26..1fabbad0c0 100644 --- a/headers/private/kernel/kernel.h +++ b/headers/private/kernel/kernel.h @@ -49,6 +49,7 @@ /* during kernel startup, interrupts are disabled (among other things) */ extern bool gKernelStartup; +extern bool gKernelShutdown; #ifdef __cplusplus diff --git a/src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.cpp b/src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.cpp index 3bf86385b1..01e1135feb 100644 --- a/src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.cpp +++ b/src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.cpp @@ -604,7 +604,7 @@ EcSpaceHandler(uint32 function, acpi_physical_address address, uint32 width, * (Not sure if it's needed) */ - if (gKernelStartup || sc->ec_suspending) { + if (gKernelStartup || gKernelShutdown || sc->ec_suspending) { if ((EC_GET_CSR(sc) & EC_EVENT_SCI)) { //CTR0(KTR_ACPI, "ec running gpe handler directly"); EcGpeQueryHandler(sc); @@ -667,7 +667,7 @@ EcWaitEvent(struct acpi_ec_cookie* sc, EC_EVENT event, int32 generationCount) int32 count, i; // int need_poll = cold || rebooting || ec_polled_mode || sc->ec_suspending; - int needPoll = ec_polled_mode || sc->ec_suspending || gKernelStartup; + int needPoll = ec_polled_mode || sc->ec_suspending || gKernelStartup || gKernelShutdown; // The main CPU should be much faster than the EC. So the status should // be "not ready" when we start waiting. But if the main CPU is really diff --git a/src/system/kernel/main.cpp b/src/system/kernel/main.cpp index bd5cee8c12..b56c334557 100644 --- a/src/system/kernel/main.cpp +++ b/src/system/kernel/main.cpp @@ -64,6 +64,7 @@ #endif bool gKernelStartup = true; +bool gKernelShutdown = false; static kernel_args sKernelArgs; static uint32 sCpuRendezvous; diff --git a/src/system/kernel/shutdown.cpp b/src/system/kernel/shutdown.cpp index 16b8056fb6..7759b677de 100644 --- a/src/system/kernel/shutdown.cpp +++ b/src/system/kernel/shutdown.cpp @@ -15,6 +15,8 @@ system_shutdown(bool reboot) int32 cookie = 0; team_info info; + gKernelShutdown = true; + // Now shutdown all system services! // TODO: Once we are sure we can shutdown the system on all hardware // checking reboot may not be necessary anymore.