Pablo Greco e6a3ae
From b9d1e72a0910c3a0d11cb0a3c863938de344e0f5 Mon Sep 17 00:00:00 2001
Pablo Greco e6a3ae
From: Laszlo Ersek <lersek@redhat.com>
Pablo Greco e6a3ae
Date: Thu, 12 Sep 2019 13:05:02 +0100
Pablo Greco e6a3ae
Subject: [PATCH 05/22] i386: only parse the initrd_filename once for multiboot
Pablo Greco e6a3ae
 modules
Pablo Greco e6a3ae
MIME-Version: 1.0
Pablo Greco e6a3ae
Content-Type: text/plain; charset=UTF-8
Pablo Greco e6a3ae
Content-Transfer-Encoding: 8bit
Pablo Greco e6a3ae
Pablo Greco e6a3ae
RH-Author: Laszlo Ersek <lersek@redhat.com>
Pablo Greco e6a3ae
Message-id: <20190912130503.14094-6-lersek@redhat.com>
Pablo Greco e6a3ae
Patchwork-id: 90438
Pablo Greco e6a3ae
O-Subject: [RHEL-8.2.0 qemu-kvm PATCH 5/6] i386: only parse the initrd_filename once for multiboot modules
Pablo Greco e6a3ae
Bugzilla: 1749022
Pablo Greco e6a3ae
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
From: Daniel P. Berrangé <berrange@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
The multiboot code parses the initrd_filename twice, first to count how
Pablo Greco e6a3ae
many entries there are, and second to process each entry. This changes
Pablo Greco e6a3ae
the first loop to store the parse module names in a list, and the second
Pablo Greco e6a3ae
loop can now use these names. This avoids having to pass NULL to the
Pablo Greco e6a3ae
get_opt_value() method which means it can safely assume a non-NULL param.
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Pablo Greco e6a3ae
Message-Id: <20180514171913.17664-3-berrange@redhat.com>
Pablo Greco e6a3ae
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Pablo Greco e6a3ae
Tested-by: Roman Kagan <rkagan@virtuozzo.com>
Pablo Greco e6a3ae
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Pablo Greco e6a3ae
(cherry picked from commit f8da93a0ffa09268815c1942732cbc616a7db847)
Pablo Greco e6a3ae
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Pablo Greco e6a3ae
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
Pablo Greco e6a3ae
---
Pablo Greco e6a3ae
 hw/i386/multiboot.c | 32 +++++++++++++++-----------------
Pablo Greco e6a3ae
 1 file changed, 15 insertions(+), 17 deletions(-)
Pablo Greco e6a3ae
Pablo Greco e6a3ae
diff --git a/hw/i386/multiboot.c b/hw/i386/multiboot.c
Pablo Greco e6a3ae
index 8e26545..d519e20 100644
Pablo Greco e6a3ae
--- a/hw/i386/multiboot.c
Pablo Greco e6a3ae
+++ b/hw/i386/multiboot.c
Pablo Greco e6a3ae
@@ -161,6 +161,7 @@ int load_multiboot(FWCfgState *fw_cfg,
Pablo Greco e6a3ae
     uint8_t bootinfo[MBI_SIZE];
Pablo Greco e6a3ae
     uint8_t *mb_bootinfo_data;
Pablo Greco e6a3ae
     uint32_t cmdline_len;
Pablo Greco e6a3ae
+    GList *mods = NULL;
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     /* Ok, let's see if it is a multiboot image.
Pablo Greco e6a3ae
        The header is 12x32bit long, so the latest entry may be 8192 - 48. */
Pablo Greco e6a3ae
@@ -291,15 +292,16 @@ int load_multiboot(FWCfgState *fw_cfg,
Pablo Greco e6a3ae
     cmdline_len = strlen(kernel_filename) + 1;
Pablo Greco e6a3ae
     cmdline_len += strlen(kernel_cmdline) + 1;
Pablo Greco e6a3ae
     if (initrd_filename) {
Pablo Greco e6a3ae
-        const char *r = get_opt_value(initrd_filename, NULL);
Pablo Greco e6a3ae
+        const char *r = initrd_filename;
Pablo Greco e6a3ae
         cmdline_len += strlen(initrd_filename) + 1;
Pablo Greco e6a3ae
-        while (1) {
Pablo Greco e6a3ae
+        while (*r) {
Pablo Greco e6a3ae
+            char *value;
Pablo Greco e6a3ae
+            r = get_opt_value(r, &value);
Pablo Greco e6a3ae
             mbs.mb_mods_avail++;
Pablo Greco e6a3ae
-            r = get_opt_value(r, NULL);
Pablo Greco e6a3ae
-            if (!*r) {
Pablo Greco e6a3ae
-                break;
Pablo Greco e6a3ae
+            mods = g_list_append(mods, value);
Pablo Greco e6a3ae
+            if (*r) {
Pablo Greco e6a3ae
+                r++;
Pablo Greco e6a3ae
             }
Pablo Greco e6a3ae
-            r++;
Pablo Greco e6a3ae
         }
Pablo Greco e6a3ae
     }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
@@ -314,20 +316,16 @@ int load_multiboot(FWCfgState *fw_cfg,
Pablo Greco e6a3ae
     mbs.offset_cmdlines   = mbs.offset_mbinfo + mbs.mb_mods_avail * MB_MOD_SIZE;
Pablo Greco e6a3ae
     mbs.offset_bootloader = mbs.offset_cmdlines + cmdline_len;
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-    if (initrd_filename) {
Pablo Greco e6a3ae
-        const char *next_initrd;
Pablo Greco e6a3ae
-        char not_last;
Pablo Greco e6a3ae
-        char *one_file = NULL;
Pablo Greco e6a3ae
-
Pablo Greco e6a3ae
+    if (mods) {
Pablo Greco e6a3ae
+        GList *tmpl = mods;
Pablo Greco e6a3ae
         mbs.offset_mods = mbs.mb_buf_size;
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-        do {
Pablo Greco e6a3ae
+        while (tmpl) {
Pablo Greco e6a3ae
             char *next_space;
Pablo Greco e6a3ae
             int mb_mod_length;
Pablo Greco e6a3ae
             uint32_t offs = mbs.mb_buf_size;
Pablo Greco e6a3ae
+            char *one_file = tmpl->data;
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-            next_initrd = get_opt_value(initrd_filename, &one_file);
Pablo Greco e6a3ae
-            not_last = *next_initrd;
Pablo Greco e6a3ae
             /* if a space comes after the module filename, treat everything
Pablo Greco e6a3ae
                after that as parameters */
Pablo Greco e6a3ae
             hwaddr c = mb_add_cmdline(&mbs, one_file);
Pablo Greco e6a3ae
@@ -352,10 +350,10 @@ int load_multiboot(FWCfgState *fw_cfg,
Pablo Greco e6a3ae
             mb_debug("mod_start: %p\nmod_end:   %p\n  cmdline: "TARGET_FMT_plx,
Pablo Greco e6a3ae
                      (char *)mbs.mb_buf + offs,
Pablo Greco e6a3ae
                      (char *)mbs.mb_buf + offs + mb_mod_length, c);
Pablo Greco e6a3ae
-            initrd_filename = next_initrd+1;
Pablo Greco e6a3ae
             g_free(one_file);
Pablo Greco e6a3ae
-            one_file = NULL;
Pablo Greco e6a3ae
-        } while (not_last);
Pablo Greco e6a3ae
+            tmpl = tmpl->next;
Pablo Greco e6a3ae
+        }
Pablo Greco e6a3ae
+        g_list_free(mods);
Pablo Greco e6a3ae
     }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     /* Commandline support */
Pablo Greco e6a3ae
-- 
Pablo Greco e6a3ae
1.8.3.1
Pablo Greco e6a3ae