diff --git a/Kernel/Arch/init.cpp b/Kernel/Arch/init.cpp index 205da3fb39..5068370f38 100644 --- a/Kernel/Arch/init.cpp +++ b/Kernel/Arch/init.cpp @@ -218,8 +218,11 @@ extern "C" [[noreturn]] UNMAP_AFTER_INIT void init([[maybe_unused]] BootInfo con // FIXME: Read the /chosen/bootargs property. kernel_cmdline = RPi::Mailbox::the().query_kernel_command_line(s_command_line_buffer); #elif ARCH(RISCV64) - // FIXME: Take this from the flattened device tree (/chosen/bootargs) - kernel_cmdline = "serial_debug"sv; + auto maybe_command_line = get_command_line_from_fdt(); + if (maybe_command_line.is_error()) + kernel_cmdline = "serial_debug"sv; + else + kernel_cmdline = maybe_command_line.value(); #endif setup_serial_debug(); @@ -290,7 +293,8 @@ extern "C" [[noreturn]] UNMAP_AFTER_INIT void init([[maybe_unused]] BootInfo con #if ARCH(RISCV64) MUST(unflatten_fdt()); - dump_fdt(); + if (kernel_command_line().contains("dump_fdt"sv)) + dump_fdt(); #endif // Initialize TimeManagement before using randomness! diff --git a/Kernel/Arch/riscv64/CPU.cpp b/Kernel/Arch/riscv64/CPU.cpp index d2ff28e2c5..d2baed0f0c 100644 --- a/Kernel/Arch/riscv64/CPU.cpp +++ b/Kernel/Arch/riscv64/CPU.cpp @@ -32,6 +32,13 @@ void dump_fdt() MUST(DeviceTree::dump(header, fdt)); } +ErrorOr get_command_line_from_fdt() +{ + auto& header = *bit_cast(&s_fdt_storage[0]); + auto fdt = ReadonlyBytes(s_fdt_storage, header.totalsize); + return TRY(DeviceTree::slow_get_property("/chosen/bootargs"sv, header, fdt)).as_string(); +} + } DeviceTree::DeviceTree const& DeviceTree::get() diff --git a/Kernel/Arch/riscv64/CPU.h b/Kernel/Arch/riscv64/CPU.h index 2fc08a642e..3a8831169b 100644 --- a/Kernel/Arch/riscv64/CPU.h +++ b/Kernel/Arch/riscv64/CPU.h @@ -24,6 +24,7 @@ extern BootInfo s_boot_info; ErrorOr unflatten_fdt(); void dump_fdt(); +ErrorOr get_command_line_from_fdt(); } namespace DeviceTree {