Kernel: Separate panic behavior from bootmode

Bootmode used to control panic behavior and SystemServer.
This patch factors panic behavior control into a separate flag.
This commit is contained in:
Ben Wiederhake 2021-10-23 17:31:00 +02:00 committed by Andreas Kling
parent 542a88a7be
commit 09432a8241
Notes: sideshowbarker 2024-07-18 01:52:32 +09:00
8 changed files with 37 additions and 6 deletions

View file

@ -183,7 +183,7 @@ jobs:
working-directory: ${{ github.workspace }}/Build/${{ matrix.arch }} working-directory: ${{ github.workspace }}/Build/${{ matrix.arch }}
env: env:
SERENITY_QEMU_CPU: "max,vmx=off" 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" SERENITY_RUN: "ci"
run: | run: |
echo "::group::ninja run # Qemu output" echo "::group::ninja run # Qemu output"

View file

@ -51,6 +51,8 @@ List of options:
* **`init_args`** - This parameter expects a set of arguments to pass to the **`init`** program. * **`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. 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`**. * **`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. * **`root`** - This parameter configures the device to use as the root file system. It defaults to **`/dev/hda`** if unspecified.

View file

@ -110,7 +110,8 @@ the serial debug output to `./debug.log` so that both stdout of the tests and th
captured. captured.
To run with CI's TestRunner system server entry, SerenityOS needs booted in self-test mode. Running the following shell 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 ```sh
export SERENITY_RUN=ci export SERENITY_RUN=ci

View file

@ -38,8 +38,9 @@ UNMAP_AFTER_INIT void CommandLine::initialize()
VERIFY(!s_the); VERIFY(!s_the);
s_the = new CommandLine(s_cmd_line); s_the = new CommandLine(s_cmd_line);
dmesgln("Kernel Commandline: {}", kernel_command_line().string()); 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->boot_mode(Validate::Yes);
(void)s_the->panic_mode(Validate::Yes);
} }
UNMAP_AFTER_INIT void CommandLine::build_commandline(const String& cmdline_from_bootloader) UNMAP_AFTER_INIT void CommandLine::build_commandline(const String& cmdline_from_bootloader)
@ -214,6 +215,21 @@ BootMode CommandLine::boot_mode(Validate should_validate) const
return BootMode::Unknown; 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 UNMAP_AFTER_INIT bool CommandLine::are_framebuffer_devices_enabled() const
{ {
return lookup("fbdev"sv).value_or("on"sv) == "on"sv; return lookup("fbdev"sv).value_or("on"sv) == "on"sv;

View file

@ -22,6 +22,11 @@ enum class BootMode {
Unknown, Unknown,
}; };
enum class PanicMode {
Halt,
Shutdown,
};
enum class HPETMode { enum class HPETMode {
Periodic, Periodic,
NonPeriodic NonPeriodic
@ -70,6 +75,7 @@ public:
[[nodiscard]] bool is_force_pio() const; [[nodiscard]] bool is_force_pio() const;
[[nodiscard]] AcpiFeatureLevel acpi_feature_level() const; [[nodiscard]] AcpiFeatureLevel acpi_feature_level() const;
[[nodiscard]] BootMode boot_mode(Validate should_validate = Validate::No) 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]] HPETMode hpet_mode() const;
[[nodiscard]] bool disable_physical_storage() const; [[nodiscard]] bool disable_physical_storage() const;
[[nodiscard]] bool disable_ps2_controller() const; [[nodiscard]] bool disable_ps2_controller() const;

View file

@ -33,9 +33,13 @@ void __panic(const char* file, unsigned int line, const char* function)
critical_dmesgln("at {}:{} in {}", file, line, function); critical_dmesgln("at {}:{} in {}", file, line, function);
dump_backtrace(PrintToScreen::Yes); dump_backtrace(PrintToScreen::Yes);
if (kernel_command_line().boot_mode() == BootMode::SelfTest) switch (kernel_command_line().panic_mode()) {
case PanicMode::Shutdown:
__shutdown(); __shutdown();
else case PanicMode::Halt:
[[fallthrough]];
default:
Processor::halt(); Processor::halt();
}
} }
} }

View file

@ -80,7 +80,7 @@ jobs:
timeoutInMinutes: 60 timeoutInMinutes: 60
env: env:
SERENITY_QEMU_CPU: 'max,vmx=off' 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' SERENITY_RUN: 'ci'
- script: | - script: |

View file

@ -358,6 +358,8 @@ if [[ "$CMD" =~ ^(build|install|image|copy-src|run|gdb|test|rebuild|recreate|kad
else else
build_target install build_target install
build_target image 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_KERNEL_CMDLINE="fbdev=off boot_mode=self-test"
export SERENITY_RUN="ci" export SERENITY_RUN="ci"
build_target run build_target run