[OpenBIOS] [PATCH v3 2/4] SPARC64: add bootindex support

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Sun Aug 26 17:14:26 CEST 2018


This provides an alternative mechanism for supporting boot device order
information from QEMU compared with the legacy FW_CFG_BOOT_DEVICE
functionality specified via -boot.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
---
 arch/sparc64/boot.c     |  2 +-
 arch/sparc64/boot.h     |  2 +-
 arch/sparc64/openbios.c | 38 ++++++++++++++++++++++++++++++++------
 3 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/arch/sparc64/boot.c b/arch/sparc64/boot.c
index 7a287f2..54f6f7a 100644
--- a/arch/sparc64/boot.c
+++ b/arch/sparc64/boot.c
@@ -15,7 +15,7 @@ uint64_t kernel_image;
 uint64_t kernel_size;
 uint64_t qemu_cmdline;
 uint64_t cmdline_size;
-char boot_device;
+char *boot_device;
 
 extern int sparc64_of_client_interface( int *params );
 
diff --git a/arch/sparc64/boot.h b/arch/sparc64/boot.h
index e1b8717..88beb1c 100644
--- a/arch/sparc64/boot.h
+++ b/arch/sparc64/boot.h
@@ -14,7 +14,7 @@ extern uint64_t kernel_image;
 extern uint64_t kernel_size;
 extern uint64_t qemu_cmdline;
 extern uint64_t cmdline_size;
-extern char boot_device;
+extern char *boot_device;
 extern void boot(void);
 
 // sys_info.c
diff --git a/arch/sparc64/openbios.c b/arch/sparc64/openbios.c
index e9e08fd..b2e79d0 100644
--- a/arch/sparc64/openbios.c
+++ b/arch/sparc64/openbios.c
@@ -26,6 +26,7 @@
 #include "arch/common/fw_cfg.h"
 #include "arch/sparc64/ofmem_sparc64.h"
 #include "spitfire.h"
+#include "libc/vsprintf.h"
 
 #define UUID_FMT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
 
@@ -538,6 +539,8 @@ void arch_nvram_get(char *data)
     uint32_t clock_frequency;
     uint16_t machine_id;
     const char *stdin_path, *stdout_path;
+    char *bootorder_file, *boot_path;
+    uint32_t bootorder_sz, sz;
 
     fw_cfg_init();
 
@@ -570,7 +573,6 @@ void arch_nvram_get(char *data)
     }
     qemu_cmdline = (uint64_t)obio_cmdline;
     cmdline_size = size;
-    boot_device = fw_cfg_read_i16(FW_CFG_BOOT_DEVICE);
 
     if (kernel_size)
         printk("kernel addr %llx size %llx\n", kernel_image, kernel_size);
@@ -630,7 +632,11 @@ void arch_nvram_get(char *data)
     push_str("/options");
     fword("find-device");
 
-    switch (boot_device) {
+    /* Boot order */
+    bootorder_file = fw_cfg_read_file("bootorder", &bootorder_sz);
+
+    if (bootorder_file == NULL) {
+        switch (fw_cfg_read_i16(FW_CFG_BOOT_DEVICE)) {
         case 'a':
             push_str("/obio/SUNW,fdtwo");
             break;
@@ -644,11 +650,31 @@ void arch_nvram_get(char *data)
         case 'n':
             push_str("net");
             break;
-    }
+        }
 
-    fword("encode-string");
-    push_str("boot-device");
-    fword("property");
+        fword("encode-string");
+        push_str("boot-device");
+        fword("property");
+    } else {
+        sz = bootorder_sz * (3 * 2);
+        boot_device = malloc(sz);
+        memset(boot_device, 0, sz);
+
+        while ((boot_path = strsep(&bootorder_file, "\n")) != NULL) {
+            snprintf(buf, sizeof(buf),
+                     "%s:f "
+                     "%s:a "
+                     "%s ",
+                     boot_path, boot_path, boot_path);
+
+            strncat(boot_device, buf, sz);
+        }
+
+        push_str(boot_device);
+        fword("encode-string");
+        push_str("boot-device");
+        fword("property");
+    }
 
     push_str(obio_cmdline);
     fword("encode-string");
-- 
2.11.0




More information about the OpenBIOS mailing list