From: Waldemar Kozaczuk <jwkozac...@gmail.com>
Committer: Waldemar Kozaczuk <jwkozac...@gmail.com>
Branch: master

[PATCH 3/4] arm on firecracker: clean cmdline from early console artifacts

In order to enable early console on firecracker, we have
to prepend the command line with 'console=...' name,value pair.
Firecracker then appends extra name,value pair containing
memory address of the console base register in form of 'earlycon='

We actually do not need to parse this information from command line,
instead we get it from DTB which one of the previous patches
addresses. So all in all, the only purpose of this patch
is to remove this irrelevant information if present so that
command line contains normal OSv boot parameters.

Signed-off-by: Waldemar Kozaczuk <jwkozac...@gmail.com>

---
diff --git a/arch/aarch64/arch-setup.cc b/arch/aarch64/arch-setup.cc
--- a/arch/aarch64/arch-setup.cc
+++ b/arch/aarch64/arch-setup.cc
@@ -115,6 +115,7 @@ void arch_setup_free_memory()
     arch_setup_pci();
 
     // get rid of the command line, before memory is unmapped
+    console::mmio_isa_serial_console::clean_cmdline(cmdline);
     osv::parse_cmdline(cmdline);
 
     mmu::switch_to_runtime_page_tables();
diff --git a/drivers/mmio-isa-serial.cc b/drivers/mmio-isa-serial.cc
--- a/drivers/mmio-isa-serial.cc
+++ b/drivers/mmio-isa-serial.cc
@@ -35,6 +35,42 @@ void mmio_isa_serial_console::memory_map()
     }
 }
 
+static void remove_property_name_value(char *cmdline, const char *prefix)
+{
+    char *prefix_pos = strstr(cmdline, prefix);
+    if (!prefix_pos)
+        return;
+
+    // Verify that 1st preceding character is a white space
+    if (prefix_pos > cmdline && !isspace(*(prefix_pos - 1)))
+        return;
+
+    // Find first white-character or null as an end of the property value
+    char *next_char_pos = prefix_pos + strlen(prefix);
+    while (*next_char_pos && !isspace(*next_char_pos))
+        next_char_pos++;
+
+    // Remove any space characters before
+    while (prefix_pos > cmdline && isspace(*(prefix_pos - 1))) {
+        prefix_pos--;
+    };
+
+    // Remove entire name=value pair from cmdline by copying over the 
remaining part
+    do {
+        *prefix_pos = *next_char_pos++;
+    } while (*prefix_pos++);
+}
+
+#define CONSOLE_PREFIX "console="
+#define MMIO_ISA_CONSOLE_PREFIX "earlycon="
+void mmio_isa_serial_console::clean_cmdline(char *cmdline)
+{
+    if (_phys_mmio_address) {
+        remove_property_name_value(cmdline, CONSOLE_PREFIX);
+        remove_property_name_value(cmdline, MMIO_ISA_CONSOLE_PREFIX);
+    }
+}
+
 void mmio_isa_serial_console::dev_start() {
     _irq.reset(new spi_interrupt(gic::irq_type::IRQ_TYPE_EDGE, irqid,
                                  [&] { return true; },
diff --git a/drivers/mmio-isa-serial.hh b/drivers/mmio-isa-serial.hh
--- a/drivers/mmio-isa-serial.hh
+++ b/drivers/mmio-isa-serial.hh
@@ -17,6 +17,7 @@ public:
     void set_irqid(int irqid) { this->irqid = irqid; }
     static void early_init(u64 mmio_phys_address);
     static void memory_map();
+    static void clean_cmdline(char *cmdline);
     static mmioaddr_t _addr_mmio;
     static u64 _phys_mmio_address;
 private:

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to osv-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/00000000000019811e05a9128b36%40google.com.

Reply via email to