[OpenBIOS] [PATCH v2 1/4] ppc: add bootindex support

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Sun Aug 19 12:55:03 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/ppc/qemu/init.c | 55 ++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 45 insertions(+), 10 deletions(-)

diff --git a/arch/ppc/qemu/init.c b/arch/ppc/qemu/init.c
index af15682..23cc88e 100644
--- a/arch/ppc/qemu/init.c
+++ b/arch/ppc/qemu/init.c
@@ -839,10 +839,11 @@ arch_of_init(void)
 #endif
     uint64_t ram_size;
     const struct cpudef *cpu;
-    char buf[64], qemu_uuid[16];
+    char buf[256], qemu_uuid[16];
     const char *stdin_path, *stdout_path, *boot_path;
     uint32_t temp = 0;
-    char *boot_device;
+    char *boot_device, *bootorder_file;
+    uint32_t bootorder_sz, sz;
     ofmem_t *ofmem = ofmem_arch_get_private();
 
     openbios_init();
@@ -1053,11 +1054,17 @@ arch_of_init(void)
     push_str("/options");
     fword("find-device");
 
-    /* Setup default boot devices (not overriding user settings) */
-    fword("boot-device");
-    boot_device = pop_fstr_copy();
-    if (boot_device && strcmp(boot_device, "disk") == 0) {
-        switch (fw_cfg_read_i16(FW_CFG_BOOT_DEVICE)) {
+    /* Boot order */
+    bootorder_file = fw_cfg_read_file("bootorder", &bootorder_sz);
+
+    if (bootorder_file == NULL) {
+        /* No bootorder present, use fw_cfg device if no custom
+           boot-device specified */
+        fword("boot-device");
+        boot_device = pop_fstr_copy();
+
+        if (boot_device && strcmp(boot_device, "disk") == 0) {
+            switch (fw_cfg_read_i16(FW_CFG_BOOT_DEVICE)) {
             case 'c':
                 boot_path = "hd";
                 break;
@@ -1065,15 +1072,43 @@ arch_of_init(void)
             case 'd':
                 boot_path = "cd";
                 break;
+            }
+
+            snprintf(buf, sizeof(buf),
+                     "%s:,\\\\:tbxi "
+                     "%s:,\\ppc\\bootinfo.txt "
+                     "%s:,%%BOOT",
+                     boot_path, boot_path, boot_path);
+
+            push_str(buf);
+            fword("encode-string");
+            push_str("boot-device");
+            fword("property");
         }
 
-        snprintf(buf, sizeof(buf), "%s:,\\\\:tbxi %s:,\\ppc\\bootinfo.txt %s:,%%BOOT", boot_path, boot_path, boot_path);
-        push_str(buf);
+        free(boot_device);
+    } 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:,\\\\:tbxi "
+                     "%s:,\\ppc\\bootinfo.txt "
+                     "%s:,%%BOOT ",
+                     boot_path, boot_path, boot_path);
+
+            strncat(boot_device, buf, sz);
+        }
+
+        push_str(boot_device);
         fword("encode-string");
         push_str("boot-device");
         fword("property");
+
+        free(boot_device);
     }
-    free(boot_device);
 
     /* Set up other properties */
 
-- 
2.11.0




More information about the OpenBIOS mailing list