summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Kernel/Arch/x86/common/I8042Reboot.cpp19
-rw-r--r--Kernel/Arch/x86/common/I8042Reboot.h (renamed from Kernel/Arch/x86/common/QEMUShutdown.h)2
-rw-r--r--Kernel/Arch/x86/common/Shutdown.cpp (renamed from Kernel/Arch/x86/common/QEMUShutdown.cpp)7
-rw-r--r--Kernel/Arch/x86/common/Shutdown.h14
-rw-r--r--Kernel/CMakeLists.txt3
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.cpp21
-rw-r--r--Kernel/Panic.cpp3
7 files changed, 56 insertions, 13 deletions
diff --git a/Kernel/Arch/x86/common/I8042Reboot.cpp b/Kernel/Arch/x86/common/I8042Reboot.cpp
new file mode 100644
index 0000000000..2eaf0a0df7
--- /dev/null
+++ b/Kernel/Arch/x86/common/I8042Reboot.cpp
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <AK/Format.h>
+#include <Kernel/Arch/x86/IO.h>
+#include <Kernel/Arch/x86/common/I8042Reboot.h>
+
+namespace Kernel {
+
+void i8042_reboot()
+{
+ dbgln("attempting reboot via KB Controller...");
+ IO::out8(0x64, 0xFE);
+}
+
+}
diff --git a/Kernel/Arch/x86/common/QEMUShutdown.h b/Kernel/Arch/x86/common/I8042Reboot.h
index 18634ff622..9c457a0f1a 100644
--- a/Kernel/Arch/x86/common/QEMUShutdown.h
+++ b/Kernel/Arch/x86/common/I8042Reboot.h
@@ -8,6 +8,6 @@
namespace Kernel {
-void qemu_shutdown();
+void i8042_reboot();
}
diff --git a/Kernel/Arch/x86/common/QEMUShutdown.cpp b/Kernel/Arch/x86/common/Shutdown.cpp
index 0c3149dff5..948f720981 100644
--- a/Kernel/Arch/x86/common/QEMUShutdown.cpp
+++ b/Kernel/Arch/x86/common/Shutdown.cpp
@@ -5,7 +5,7 @@
*/
#include <Kernel/Arch/x86/IO.h>
-#include <Kernel/Arch/x86/common/QEMUShutdown.h>
+#include <Kernel/Arch/x86/common/Shutdown.h>
namespace Kernel {
@@ -18,4 +18,9 @@ void qemu_shutdown()
IO::out16(0xb004, 0x2000);
}
+void virtualbox_shutdown()
+{
+ IO::out16(0x4004, 0x3400);
+}
+
}
diff --git a/Kernel/Arch/x86/common/Shutdown.h b/Kernel/Arch/x86/common/Shutdown.h
new file mode 100644
index 0000000000..90a742176e
--- /dev/null
+++ b/Kernel/Arch/x86/common/Shutdown.h
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+namespace Kernel {
+
+void qemu_shutdown();
+void virtualbox_shutdown();
+
+}
diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt
index d13ae0b1e5..20b53634a9 100644
--- a/Kernel/CMakeLists.txt
+++ b/Kernel/CMakeLists.txt
@@ -333,9 +333,10 @@ if ("${SERENITY_ARCH}" STREQUAL "i686" OR "${SERENITY_ARCH}" STREQUAL "x86_64")
${KERNEL_SOURCES}
Arch/Processor.cpp
+ Arch/x86/common/I8042Reboot.cpp
Arch/x86/common/ScopedCritical.cpp
Arch/x86/common/SmapDisabler.cpp
- Arch/x86/common/QEMUShutdown.cpp
+ Arch/x86/common/Shutdown.cpp
)
set(KERNEL_SOURCES
diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.cpp
index 51beb59dee..b9d225ffaf 100644
--- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.cpp
+++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.cpp
@@ -5,7 +5,11 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
-#include <Kernel/Arch/x86/IO.h>
+#include <AK/Platform.h>
+#if ARCH(I386) || ARCH(X86_64)
+# include <Kernel/Arch/x86/common/I8042Reboot.h>
+# include <Kernel/Arch/x86/common/Shutdown.h>
+#endif
#include <Kernel/FileSystem/FileSystem.h>
#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.h>
#include <Kernel/Firmware/ACPI/Parser.h>
@@ -76,8 +80,9 @@ void PowerStateSwitchNode::reboot()
dbgln("attempting reboot via ACPI");
if (ACPI::is_enabled())
ACPI::Parser::the()->try_acpi_reboot();
- dbgln("attempting reboot via KB Controller...");
- IO::out8(0x64, 0xFE);
+#if ARCH(I386) || ARCH(X86_64)
+ i8042_reboot();
+#endif
dbgln("reboot attempts failed, applications will stop responding.");
dmesgln("Reboot can't be completed. It's safe to turn off the computer!");
Processor::halt();
@@ -94,12 +99,10 @@ void PowerStateSwitchNode::poweroff()
dbgln("syncing mounted filesystems...");
FileSystem::sync();
dbgln("attempting system shutdown...");
- // QEMU Shutdown
- IO::out16(0x604, 0x2000);
- // If we're here, the shutdown failed. Try VirtualBox shutdown.
- IO::out16(0x4004, 0x3400);
- // VirtualBox shutdown failed. Try Bochs/Old QEMU shutdown.
- IO::out16(0xb004, 0x2000);
+#if ARCH(I386) || ARCH(X86_64)
+ qemu_shutdown();
+ virtualbox_shutdown();
+#endif
dbgln("shutdown attempts failed, applications will stop responding.");
dmesgln("Shutdown can't be completed. It's safe to turn off the computer!");
Processor::halt();
diff --git a/Kernel/Panic.cpp b/Kernel/Panic.cpp
index ca36075151..deba3bfaf3 100644
--- a/Kernel/Panic.cpp
+++ b/Kernel/Panic.cpp
@@ -7,7 +7,7 @@
#include <AK/Format.h>
#include <Kernel/Arch/Processor.h>
#if ARCH(I386) || ARCH(X86_64)
-# include <Kernel/Arch/x86/common/QEMUShutdown.h>
+# include <Kernel/Arch/x86/common/Shutdown.h>
#endif
#include <Kernel/CommandLine.h>
#include <Kernel/KSyms.h>
@@ -20,6 +20,7 @@ namespace Kernel {
{
#if ARCH(I386) || ARCH(X86_64)
qemu_shutdown();
+ virtualbox_shutdown();
#endif
// Note: If we failed to invoke platform shutdown, we need to halt afterwards
// to ensure no further execution on any CPU still happens.