|
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,
|