Kernel/Commandline: Allow the user to specify an embedded string

This is by default left empty, so people won't run the kernel in a mode
which they didn't want to. The embedded string will override the
supplied commandline from the bootloader, which is good for debugging
sessions.

This change seemed important for me, because I debug the kernel on bare
metal with iPXE, and every change to the commandline meant that I needed
rewrite a new iPXE USB image with a modified iPXE script.
This commit is contained in:
Liav A 2021-05-21 20:42:33 +03:00 committed by Linus Groh
parent b8f0a9c974
commit 5e81464245
Notes: sideshowbarker 2024-07-18 17:35:38 +09:00
2 changed files with 25 additions and 5 deletions

View file

@ -4,6 +4,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/StringBuilder.h>
#include <Kernel/CommandLine.h>
#include <Kernel/Panic.h>
#include <Kernel/StdLib.h>
@ -11,6 +12,7 @@
namespace Kernel {
static char s_cmd_line[1024];
static constexpr StringView s_embedded_cmd_line = "";
static CommandLine* s_the;
UNMAP_AFTER_INIT void CommandLine::early_initialize(const char* cmd_line)
@ -37,13 +39,19 @@ UNMAP_AFTER_INIT void CommandLine::initialize()
dmesgln("Kernel Commandline: {}", kernel_command_line().string());
}
UNMAP_AFTER_INIT CommandLine::CommandLine(const String& string)
: m_string(string)
UNMAP_AFTER_INIT void CommandLine::build_commandline(const String& cmdline_from_bootloader)
{
s_the = this;
StringBuilder builder;
builder.append(cmdline_from_bootloader);
if (!s_embedded_cmd_line.is_empty()) {
builder.append(" ");
builder.append(s_embedded_cmd_line);
}
m_string = builder.to_string();
}
const auto& args = m_string.split(' ');
m_params.ensure_capacity(args.size());
UNMAP_AFTER_INIT void CommandLine::add_arguments(const Vector<String>& args)
{
for (auto&& str : args) {
if (str == "") {
continue;
@ -59,6 +67,15 @@ UNMAP_AFTER_INIT CommandLine::CommandLine(const String& string)
}
}
UNMAP_AFTER_INIT CommandLine::CommandLine(const String& cmdline_from_bootloader)
{
s_the = this;
build_commandline(cmdline_from_bootloader);
const auto& args = m_string.split(' ');
m_params.ensure_capacity(args.size());
add_arguments(args);
}
Optional<String> CommandLine::lookup(const String& key) const
{
return m_params.get(key);

View file

@ -77,6 +77,9 @@ public:
private:
CommandLine(const String&);
void add_arguments(const Vector<String>& args);
void build_commandline(const String& cmdline_from_bootloader);
String m_string;
HashMap<String, String> m_params;
};