qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Glauber Costa <glommer@redhat.com>
To: qemu-devel@nongnu.org
Cc: jan.kiszka@siemens.com, aliguori@us.ibm.com
Subject: [Qemu-devel] [PATCH] register a single area for vga bios and option roms
Date: Thu,  9 Apr 2009 11:53:00 -0400	[thread overview]
Message-ID: <1239292380-10032-1-git-send-email-glommer@redhat.com> (raw)

Those guys are not different in nature. They're all roms,
not blessed with the graces of being written to. So there's
not need to issue multiple requests to memory registration areas:
just treat them as brothers, and put them all in the same
region.

It also has the nice side effect of improving the loading code
a little bit.

Signed-off-by: Glauber Costa <glommer@redhat.com>
---
 hw/pc.c |  105 ++++++++++++++++++++++++++++----------------------------------
 1 files changed, 47 insertions(+), 58 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index f9cfd1f..cef68eb 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -763,9 +763,9 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
 {
     char buf[1024];
     int ret, linux_boot, i;
-    ram_addr_t ram_addr, vga_ram_addr, bios_offset, vga_bios_offset, option_rom_start = 0;
+    ram_addr_t ram_addr, vga_ram_addr, bios_offset, option_rom_offset;
     ram_addr_t below_4g_mem_size, above_4g_mem_size = 0;
-    int bios_size, isa_bios_size, vga_bios_size;
+    int bios_size, isa_bios_size, oprom_area_size;
     PCIBus *pci_bus;
     int piix3_devfn = -1;
     CPUState *env;
@@ -856,6 +856,18 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
         fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", buf);
         exit(1);
     }
+    /* map the last 128KB of the BIOS in ISA space */
+    isa_bios_size = bios_size;
+    if (isa_bios_size > (128 * 1024))
+        isa_bios_size = 128 * 1024;
+    cpu_register_physical_memory(0x100000 - isa_bios_size,
+                                 isa_bios_size,
+                                 (bios_offset + bios_size - isa_bios_size) | IO_MEM_ROM);
+
+
+
+    option_rom_offset = qemu_ram_alloc(0x20000);
+    oprom_area_size = 0;
 
     if (using_vga) {
         /* VGA BIOS load */
@@ -864,76 +876,53 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
         } else {
             snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_FILENAME);
         }
-        vga_bios_size = get_image_size(buf);
-        if (vga_bios_size <= 0 || vga_bios_size > 65536)
+        oprom_area_size = get_image_size(buf);
+        if (oprom_area_size <= 0 || oprom_area_size > 65536)
             goto vga_bios_error;
-        vga_bios_offset = qemu_ram_alloc(65536);
 
-        ret = load_image(buf, phys_ram_base + vga_bios_offset);
-        if (ret != vga_bios_size) {
+        ret = load_image(buf, phys_ram_base + option_rom_offset);
+        if (ret != oprom_area_size) {
 vga_bios_error:
             fprintf(stderr, "qemu: could not load VGA BIOS '%s'\n", buf);
             exit(1);
         }
-	/* Round up vga bios size to the next 2k boundary */
-	vga_bios_size = (vga_bios_size + 2047) & ~2047;
-	option_rom_start = 0xc0000 + vga_bios_size;
-
-        /* setup basic memory access */
-        cpu_register_physical_memory(0xc0000, vga_bios_size,
-                                     vga_bios_offset | IO_MEM_ROM);
     }
 
     /* No point in placing option roms before this address, since bochs bios
      * will only start looking for it at 0xc8000 */
-    if (option_rom_start < 0xc8000)
-	    option_rom_start = 0xc8000;
-
-
-    /* map the last 128KB of the BIOS in ISA space */
-    isa_bios_size = bios_size;
-    if (isa_bios_size > (128 * 1024))
-        isa_bios_size = 128 * 1024;
-    cpu_register_physical_memory(0x100000 - isa_bios_size,
-                                 isa_bios_size,
-                                 (bios_offset + bios_size - isa_bios_size) | IO_MEM_ROM);
+    if (oprom_area_size < 0x8000)
+        oprom_area_size = 0x8000;
+
+    if (linux_boot) {
+        oprom_area_size = (oprom_area_size + 2047) & ~2047;
+        load_linux(phys_ram_base + option_rom_offset + oprom_area_size,
+                   kernel_filename, initrd_filename, kernel_cmdline);
+        oprom_area_size += TARGET_PAGE_SIZE;
+    }
 
-    {
-        ram_addr_t option_rom_offset;
-        int size, offset;
-
-        offset = option_rom_start;
-        if (linux_boot) {
-            option_rom_offset = qemu_ram_alloc(TARGET_PAGE_SIZE);
-            load_linux(phys_ram_base + option_rom_offset,
-                       kernel_filename, initrd_filename, kernel_cmdline);
-            cpu_register_physical_memory(option_rom_start, TARGET_PAGE_SIZE,
-                                         option_rom_offset | IO_MEM_ROM);
-            offset += TARGET_PAGE_SIZE;
+    for (i = 0; i < nb_option_roms; i++) {
+        int size;
+        /* Round up optiom rom start addr to the next 2k boundary */
+        oprom_area_size = (oprom_area_size + 2047) & ~2047;
+        size = get_image_size(option_rom[i]);
+        if (size < 0) {
+            fprintf(stderr, "Could not load option rom '%s'\n",
+                    option_rom[i]);
+            exit(1);
         }
-
-        for (i = 0; i < nb_option_roms; i++) {
-            size = get_image_size(option_rom[i]);
-            if (size < 0) {
-                fprintf(stderr, "Could not load option rom '%s'\n",
-                        option_rom[i]);
-                exit(1);
-            }
-            if (size > (0xe0000  - offset))
-                goto option_rom_error;
-            option_rom_offset = qemu_ram_alloc(size);
-            ret = load_image(option_rom[i], phys_ram_base + option_rom_offset);
-            if (ret != size) {
-            option_rom_error:
-                fprintf(stderr, "Could not fit %soption roms in available space\n", using_vga ? "VGA bios and " : "");
-                exit(1);
-            }
-            size = (size + 4095) & ~4095;
-            cpu_register_physical_memory(offset, size, option_rom_offset | IO_MEM_ROM);
-            offset += size;
+        if (size > (0x20000  - oprom_area_size))
+            goto option_rom_error;
+        ret = load_image(option_rom[i], phys_ram_base + option_rom_offset + oprom_area_size);
+        if (ret != size) {
+        option_rom_error:
+            fprintf(stderr, "Could not fit %soption roms in available space\n", using_vga ? "VGA bios and " : "");
+            exit(1);
         }
+        oprom_area_size += size;
     }
 
+    cpu_register_physical_memory(0xc0000, 0x20000, option_rom_offset | IO_MEM_ROM);
+
     /* map all the bios at the top of memory */
     cpu_register_physical_memory((uint32_t)(-bios_size),
                                  bios_size, bios_offset | IO_MEM_ROM);
-- 
1.5.6.6

             reply	other threads:[~2009-04-09 15:53 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-09 15:53 Glauber Costa [this message]
2009-04-09 17:48 ` [Qemu-devel] Re: [PATCH] register a single area for vga bios and option roms Anthony Liguori
2009-04-09 20:49   ` Carl-Daniel Hailfinger
2009-04-09 22:15     ` Glauber Costa
2009-04-11  7:41   ` Zachary Amsden
2009-04-09 17:55 ` [Qemu-devel] " Paul Brook

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1239292380-10032-1-git-send-email-glommer@redhat.com \
    --to=glommer@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=jan.kiszka@siemens.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).