mirror of
https://github.com/SerenityOS/serenity
synced 2024-09-06 17:06:31 +00:00
![Liav A](/assets/img/avatar_default.png)
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.
51 lines
1.3 KiB
C++
51 lines
1.3 KiB
C++
/*
|
|
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <AK/Format.h>
|
|
#include <Kernel/Arch/Processor.h>
|
|
#if ARCH(I386) || ARCH(X86_64)
|
|
# include <Kernel/Arch/x86/common/Shutdown.h>
|
|
#endif
|
|
#include <Kernel/CommandLine.h>
|
|
#include <Kernel/KSyms.h>
|
|
#include <Kernel/Panic.h>
|
|
#include <Kernel/Thread.h>
|
|
|
|
namespace Kernel {
|
|
|
|
[[noreturn]] static void __shutdown()
|
|
{
|
|
#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.
|
|
Processor::halt();
|
|
}
|
|
|
|
void __panic(char const* file, unsigned int line, char const* function)
|
|
{
|
|
// Avoid lock ranking checks on crashing paths, just try to get some debugging messages out.
|
|
auto* thread = Thread::current();
|
|
if (thread)
|
|
thread->set_crashing();
|
|
|
|
critical_dmesgln("at {}:{} in {}", file, line, function);
|
|
dump_backtrace(PrintToScreen::Yes);
|
|
if (!CommandLine::was_initialized())
|
|
Processor::halt();
|
|
switch (kernel_command_line().panic_mode()) {
|
|
case PanicMode::Shutdown:
|
|
__shutdown();
|
|
case PanicMode::Halt:
|
|
[[fallthrough]];
|
|
default:
|
|
Processor::halt();
|
|
}
|
|
}
|
|
}
|