Blame qemu-0.9.0-load-initrd.patch

Hans de Goede 76b47e
--- hw/pc.c.orig	2007-02-06 07:01:54.000000000 +0800
Hans de Goede 76b47e
+++ hw/pc.c	2007-04-01 22:19:50.000000000 +0800
Hans de Goede 76b47e
@@ -32,9 +32,11 @@
Hans de Goede 76b47e
 #define LINUX_BOOT_FILENAME "linux_boot.bin"
Hans de Goede 76b47e
 
Hans de Goede 76b47e
 #define KERNEL_LOAD_ADDR     0x00100000
Hans de Goede 76b47e
-#define INITRD_LOAD_ADDR     0x00600000
Hans de Goede 76b47e
+#define MAX_INITRD_LOAD_ADDR 0x38000000
Hans de Goede 76b47e
 #define KERNEL_PARAMS_ADDR   0x00090000
Hans de Goede 76b47e
 #define KERNEL_CMDLINE_ADDR  0x00099000
Hans de Goede 76b47e
+/* Leave a chunk of memory at the top of RAM for the BIOS ACPI tables.  */
Hans de Goede 76b47e
+#define ACPI_DATA_SIZE       0x10000
Hans de Goede 76b47e
 
Hans de Goede 76b47e
 static fdctrl_t *floppy_controller;
Hans de Goede 76b47e
 static RTCState *rtc_state;
Hans de Goede 76b47e
@@ -451,7 +453,7 @@
Hans de Goede 76b47e
 {
Hans de Goede 76b47e
     char buf[1024];
Hans de Goede 76b47e
     int ret, linux_boot, initrd_size, i;
Hans de Goede 76b47e
-    unsigned long bios_offset, vga_bios_offset, option_rom_offset;
Hans de Goede 76b47e
+    unsigned long bios_offset, vga_bios_offset, option_rom_offset, initrd_offset;
Hans de Goede 76b47e
     int bios_size, isa_bios_size;
Hans de Goede 76b47e
     PCIBus *pci_bus;
Hans de Goede 76b47e
     int piix3_devfn = -1;
Hans de Goede 76b47e
@@ -576,8 +578,28 @@
Hans de Goede 76b47e
         
Hans de Goede 76b47e
         /* load initrd */
Hans de Goede 76b47e
         initrd_size = 0;
Hans de Goede 76b47e
+        initrd_offset = 0;
Hans de Goede 76b47e
         if (initrd_filename) {
Hans de Goede 76b47e
-            initrd_size = load_image(initrd_filename, phys_ram_base + INITRD_LOAD_ADDR);
Hans de Goede 76b47e
+            initrd_size = get_image_size (initrd_filename);
Hans de Goede 76b47e
+            if (initrd_size > 0) {
Hans de Goede 76b47e
+                initrd_offset = (ram_size - initrd_size) & TARGET_PAGE_MASK;
Hans de Goede 76b47e
+                /* Leave space for BIOS ACPI tables.  */
Hans de Goede 76b47e
+                initrd_offset -= ACPI_DATA_SIZE;
Hans de Goede 76b47e
+                /* Avoid the last 64k to avoid 2.2.x kernel bugs.  */
Hans de Goede 76b47e
+                initrd_offset -= 0x10000;
Hans de Goede 76b47e
+                if (initrd_offset > MAX_INITRD_LOAD_ADDR)
Hans de Goede 76b47e
+                    initrd_offset = MAX_INITRD_LOAD_ADDR;
Hans de Goede 76b47e
+
Hans de Goede 76b47e
+                if (initrd_size > ram_size
Hans de Goede 76b47e
+                    || initrd_offset < KERNEL_LOAD_ADDR + ret) {
Hans de Goede 76b47e
+                    fprintf(stderr,
Hans de Goede 76b47e
+                            "qemu: memory too small for initial ram disk '%s'\n",
Hans de Goede 76b47e
+                            initrd_filename);
Hans de Goede 76b47e
+                    exit(1);
Hans de Goede 76b47e
+                }
Hans de Goede 76b47e
+                initrd_size = load_image(initrd_filename,
Hans de Goede 76b47e
+                                         phys_ram_base + initrd_offset);
Hans de Goede 76b47e
+            }
Hans de Goede 76b47e
             if (initrd_size < 0) {
Hans de Goede 76b47e
                 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n", 
Hans de Goede 76b47e
                         initrd_filename);
Hans de Goede 76b47e
@@ -585,7 +607,7 @@
Hans de Goede 76b47e
             }
Hans de Goede 76b47e
         }
Hans de Goede 76b47e
         if (initrd_size > 0) {
Hans de Goede 76b47e
-            stl_raw(phys_ram_base + KERNEL_PARAMS_ADDR + 0x218, INITRD_LOAD_ADDR);
Hans de Goede 76b47e
+            stl_raw(phys_ram_base + KERNEL_PARAMS_ADDR + 0x218, initrd_offset);
Hans de Goede 76b47e
             stl_raw(phys_ram_base + KERNEL_PARAMS_ADDR + 0x21c, initrd_size);
Hans de Goede 76b47e
         }
Hans de Goede 76b47e
         pstrcpy(phys_ram_base + KERNEL_CMDLINE_ADDR, 4096,