mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-25 09:00:22 +00:00
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:
parent
542a88a7be
commit
09432a8241
Notes:
sideshowbarker
2024-07-18 01:52:32 +09:00
Author: https://github.com/BenWiederhake Commit: https://github.com/SerenityOS/serenity/commit/09432a82412 Pull-request: https://github.com/SerenityOS/serenity/pull/10607 Reviewed-by: https://github.com/ADKaster ✅
8 changed files with 37 additions and 6 deletions
2
.github/workflows/cmake.yml
vendored
2
.github/workflows/cmake.yml
vendored
|
@ -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"
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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: |
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue