summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2022-09-02 10:17:55 +0300
committerLinus Groh <mail@linusgroh.de>2022-09-20 18:43:05 +0100
commit9252a892bb7f7fe3719a57143497726784138bd3 (patch)
tree73fa26c38272adbde92ddefc79cbc46a9e27b603
parent0a220a413f15bc79c5b4ea58df3c018c7395f6c6 (diff)
downloadserenity-9252a892bb7f7fe3719a57143497726784138bd3.zip
Kernel: Abstracts x86 reboot and shutdown specific methods
We move QEMU and VirtualBox shutdown sequences to a separate file, as well as moving the i8042 reboot code sequence too to another file. This allows us to abstract specific methods from the power state node code of the SysFS filesystem, to allow other architectures to put their methods there too in the future.
-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.