Skip to content

Commit

Permalink
Kernel: Separate panic behavior from bootmode
Browse files Browse the repository at this point in the history
Bootmode used to control panic behavior and SystemServer.
This patch factors panic behavior control into a separate flag.
  • Loading branch information
BenWiederhake authored and awesomekling committed Oct 25, 2021
1 parent 542a88a commit 09432a8
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 6 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/cmake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ jobs:
working-directory: ${{ github.workspace }}/Build/${{ matrix.arch }}
env:
SERENITY_QEMU_CPU: "max,vmx=off"
SERENITY_KERNEL_CMDLINE: "fbdev=off boot_mode=self-test"
SERENITY_KERNEL_CMDLINE: "fbdev=off panic=shutdown boot_mode=self-test"
SERENITY_RUN: "ci"
run: |
echo "::group::ninja run # Qemu output"
Expand Down
2 changes: 2 additions & 0 deletions Base/usr/share/man/man7/boot_parameters.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ List of options:
* **`init_args`** - This parameter expects a set of arguments to pass to the **`init`** program.
The value should be a set of strings separated by `,` characters.

* **`panic`** - This parameter expects **`halt`** or **`shutdown`**. This is particularly useful in CI contexts.

* **`pci_ecam`** - This parameter expects **`on`** or **`off`**.

* **`root`** - This parameter configures the device to use as the root file system. It defaults to **`/dev/hda`** if unspecified.
Expand Down
3 changes: 2 additions & 1 deletion Documentation/RunningTests.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,8 @@ the serial debug output to `./debug.log` so that both stdout of the tests and th
captured.

To run with CI's TestRunner system server entry, SerenityOS needs booted in self-test mode. Running the following shell
lines will boot SerenityOS in self-test mode, run tests, and exit.
lines will boot SerenityOS in self-test mode, run tests, and exit. Note that CI also sets `panic=shutdown` to terminate qemu;
the default value `halt` keeps qemu around, which allows you to inspect the state.

```sh
export SERENITY_RUN=ci
Expand Down
18 changes: 17 additions & 1 deletion Kernel/CommandLine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ UNMAP_AFTER_INIT void CommandLine::initialize()
VERIFY(!s_the);
s_the = new CommandLine(s_cmd_line);
dmesgln("Kernel Commandline: {}", kernel_command_line().string());
// Validate the boot mode the user passed in.
// Validate the modes the user passed in.
(void)s_the->boot_mode(Validate::Yes);
(void)s_the->panic_mode(Validate::Yes);
}

UNMAP_AFTER_INIT void CommandLine::build_commandline(const String& cmdline_from_bootloader)
Expand Down Expand Up @@ -214,6 +215,21 @@ BootMode CommandLine::boot_mode(Validate should_validate) const
return BootMode::Unknown;
}

PanicMode CommandLine::panic_mode(Validate should_validate) const
{
const auto panic_mode = lookup("panic"sv).value_or("halt"sv);
if (panic_mode == "halt"sv) {
return PanicMode::Halt;
} else if (panic_mode == "shutdown"sv) {
return PanicMode::Shutdown;
}

if (should_validate == Validate::Yes)
PANIC("Unknown PanicMode: {}", panic_mode);

return PanicMode::Halt;
}

UNMAP_AFTER_INIT bool CommandLine::are_framebuffer_devices_enabled() const
{
return lookup("fbdev"sv).value_or("on"sv) == "on"sv;
Expand Down
6 changes: 6 additions & 0 deletions Kernel/CommandLine.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ enum class BootMode {
Unknown,
};

enum class PanicMode {
Halt,
Shutdown,
};

enum class HPETMode {
Periodic,
NonPeriodic
Expand Down Expand Up @@ -70,6 +75,7 @@ class CommandLine {
[[nodiscard]] bool is_force_pio() const;
[[nodiscard]] AcpiFeatureLevel acpi_feature_level() const;
[[nodiscard]] BootMode boot_mode(Validate should_validate = Validate::No) const;
[[nodiscard]] PanicMode panic_mode(Validate should_validate = Validate::No) const;
[[nodiscard]] HPETMode hpet_mode() const;
[[nodiscard]] bool disable_physical_storage() const;
[[nodiscard]] bool disable_ps2_controller() const;
Expand Down
8 changes: 6 additions & 2 deletions Kernel/Panic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,13 @@ void __panic(const char* file, unsigned int line, const char* function)

critical_dmesgln("at {}:{} in {}", file, line, function);
dump_backtrace(PrintToScreen::Yes);
if (kernel_command_line().boot_mode() == BootMode::SelfTest)
switch (kernel_command_line().panic_mode()) {
case PanicMode::Shutdown:
__shutdown();
else
case PanicMode::Halt:
[[fallthrough]];
default:
Processor::halt();
}
}
}
2 changes: 1 addition & 1 deletion Meta/Azure/Serenity.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ jobs:
timeoutInMinutes: 60
env:
SERENITY_QEMU_CPU: 'max,vmx=off'
SERENITY_KERNEL_CMDLINE: 'fbdev=off boot_mode=self-test'
SERENITY_KERNEL_CMDLINE: 'fbdev=off panic=shutdown boot_mode=self-test'
SERENITY_RUN: 'ci'
- script: |
Expand Down
2 changes: 2 additions & 0 deletions Meta/serenity.sh
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,8 @@ if [[ "$CMD" =~ ^(build|install|image|copy-src|run|gdb|test|rebuild|recreate|kad
else
build_target install
build_target image
# In contrast to CI, we don't set 'panic=shutdown' here,
# in case the user wants to inspect qemu some more.
export SERENITY_KERNEL_CMDLINE="fbdev=off boot_mode=self-test"
export SERENITY_RUN="ci"
build_target run
Expand Down

0 comments on commit 09432a8

Please sign in to comment.