From 771708e98869abfa29ef083b034a0ac9c512736b Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Oct 31 2012 00:56:59 +0000 Subject: Fix loading arm initrd if kernel is very large (bz #862766) Don't use reserved word 'function' in systemtap files (bz #871286) Drop assertion that was triggering when pausing guests w/ qxl (bz #870972) --- diff --git a/0802-arm_boot-Change-initrd-load-address-to-halfway-throu.patch b/0802-arm_boot-Change-initrd-load-address-to-halfway-throu.patch new file mode 100644 index 0000000..649fb0e --- /dev/null +++ b/0802-arm_boot-Change-initrd-load-address-to-halfway-throu.patch @@ -0,0 +1,138 @@ +From d3a43fe4b870154032db4651824bc88e3cb81dc5 Mon Sep 17 00:00:00 2001 +From: Peter Maydell +Date: Fri, 26 Oct 2012 16:29:38 +0100 +Subject: [PATCH] arm_boot: Change initrd load address to "halfway through + RAM" + +To avoid continually having to bump the initrd load address +to account for larger kernel images, put the initrd halfway +through RAM. This allows large kernels on new boards with lots +of RAM to work OK, without breaking existing usecases for +boards with only 32MB of RAM. + +Note that this change fixes in passing a bug where we were +passing an overly large max_size to load_image_targphys() +for the initrd, which meant that we wouldn't correctly refuse +to load an enormous initrd that didn't actually fit into RAM. + +Signed-off-by: Peter Maydell +--- + hw/arm-misc.h | 1 + + hw/arm_boot.c | 41 ++++++++++++++++++++++++++--------------- + 2 files changed, 27 insertions(+), 15 deletions(-) + +diff --git a/hw/arm-misc.h b/hw/arm-misc.h +index bdd8fec..0f7deb5 100644 +--- a/hw/arm-misc.h ++++ b/hw/arm-misc.h +@@ -56,6 +56,7 @@ struct arm_boot_info { + const struct arm_boot_info *info); + /* Used internally by arm_boot.c */ + int is_linux; ++ target_phys_addr_t initrd_start; + target_phys_addr_t initrd_size; + target_phys_addr_t entry; + }; +diff --git a/hw/arm_boot.c b/hw/arm_boot.c +index a6e9143..920c337 100644 +--- a/hw/arm_boot.c ++++ b/hw/arm_boot.c +@@ -18,7 +18,6 @@ + + #define KERNEL_ARGS_ADDR 0x100 + #define KERNEL_LOAD_ADDR 0x00010000 +-#define INITRD_LOAD_ADDR 0x00d00000 + + /* The worlds second smallest bootloader. Set r0-r2, then jump to kernel. */ + static uint32_t bootloader[] = { +@@ -109,7 +108,7 @@ static void set_kernel_args(const struct arm_boot_info *info) + /* ATAG_INITRD2 */ + WRITE_WORD(p, 4); + WRITE_WORD(p, 0x54420005); +- WRITE_WORD(p, info->loader_start + INITRD_LOAD_ADDR); ++ WRITE_WORD(p, info->initrd_start); + WRITE_WORD(p, initrd_size); + } + if (info->kernel_cmdline && *info->kernel_cmdline) { +@@ -185,10 +184,11 @@ static void set_kernel_args_old(const struct arm_boot_info *info) + /* pages_in_vram */ + WRITE_WORD(p, 0); + /* initrd_start */ +- if (initrd_size) +- WRITE_WORD(p, info->loader_start + INITRD_LOAD_ADDR); +- else ++ if (initrd_size) { ++ WRITE_WORD(p, info->initrd_start); ++ } else { + WRITE_WORD(p, 0); ++ } + /* initrd_size */ + WRITE_WORD(p, initrd_size); + /* rd_start */ +@@ -281,14 +281,13 @@ static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo) + + if (binfo->initrd_size) { + rc = qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-start", +- binfo->loader_start + INITRD_LOAD_ADDR); ++ binfo->initrd_start); + if (rc < 0) { + fprintf(stderr, "couldn't set /chosen/linux,initrd-start\n"); + } + + rc = qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-end", +- binfo->loader_start + INITRD_LOAD_ADDR + +- binfo->initrd_size); ++ binfo->initrd_start + binfo->initrd_size); + if (rc < 0) { + fprintf(stderr, "couldn't set /chosen/linux,initrd-end\n"); + } +@@ -375,6 +374,19 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info) + big_endian = 0; + #endif + ++ /* We want to put the initrd far enough into RAM that when the ++ * kernel is uncompressed it will not clobber the initrd. However ++ * on boards without much RAM we must ensure that we still leave ++ * enough room for a decent sized initrd, and on boards with large ++ * amounts of RAM we must avoid the initrd being so far up in RAM ++ * that it is outside lowmem and inaccessible to the kernel. ++ * So for boards with less than 256MB of RAM we put the initrd ++ * halfway into RAM, and for boards with 256MB of RAM or more we put ++ * the initrd at 128MB. ++ */ ++ info->initrd_start = info->loader_start + ++ MIN(info->ram_size / 2, 128 * 1024 * 1024); ++ + /* Assume that raw images are linux kernels, and ELF images are not. */ + kernel_size = load_elf(info->kernel_filename, NULL, NULL, &elf_entry, + NULL, NULL, big_endian, ELF_MACHINE, 1); +@@ -398,10 +410,9 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info) + if (is_linux) { + if (info->initrd_filename) { + initrd_size = load_image_targphys(info->initrd_filename, +- info->loader_start +- + INITRD_LOAD_ADDR, +- info->ram_size +- - INITRD_LOAD_ADDR); ++ info->initrd_start, ++ info->ram_size - ++ info->initrd_start); + if (initrd_size < 0) { + fprintf(stderr, "qemu: could not load initrd '%s'\n", + info->initrd_filename); +@@ -419,9 +430,9 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info) + */ + if (info->dtb_filename) { + /* Place the DTB after the initrd in memory */ +- target_phys_addr_t dtb_start = TARGET_PAGE_ALIGN(info->loader_start +- + INITRD_LOAD_ADDR +- + initrd_size); ++ target_phys_addr_t dtb_start = TARGET_PAGE_ALIGN( ++ info->initrd_start + ++ initrd_size); + if (load_dtb(dtb_start, info)) { + exit(1); + } +-- +1.7.12.1 + diff --git a/0803-dtrace-backend-add-function-to-reserved-words.patch b/0803-dtrace-backend-add-function-to-reserved-words.patch new file mode 100644 index 0000000..cc58c6f --- /dev/null +++ b/0803-dtrace-backend-add-function-to-reserved-words.patch @@ -0,0 +1,27 @@ +From 4780bb16558d2753e2277e1570644bec49551534 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Sun, 2 Sep 2012 02:04:16 +0300 +Subject: [PATCH] dtrace backend: add function to reserved words + +Signed-off-by: Alon Levy +Signed-off-by: Stefan Hajnoczi +--- + scripts/tracetool/backend/dtrace.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/scripts/tracetool/backend/dtrace.py b/scripts/tracetool/backend/dtrace.py +index 9cab75c..6be7047 100644 +--- a/scripts/tracetool/backend/dtrace.py ++++ b/scripts/tracetool/backend/dtrace.py +@@ -87,7 +87,7 @@ def stap(events): + if len(e.args) > 0: + for name in e.args.names(): + # Append underscore to reserved keywords +- if name in ('limit', 'in', 'next', 'self'): ++ if name in ('limit', 'in', 'next', 'self', 'function'): + name += '_' + out(' %s = $arg%d;' % (name, i)) + i += 1 +-- +1.7.12.1 + diff --git a/0804-wip-hw-qxl-inject-interrupts-in-any-state.patch b/0804-wip-hw-qxl-inject-interrupts-in-any-state.patch new file mode 100644 index 0000000..4e5222d --- /dev/null +++ b/0804-wip-hw-qxl-inject-interrupts-in-any-state.patch @@ -0,0 +1,24 @@ +From e0575d0a1a14e8f4e8fc11d549cbd07cca433383 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Tue, 30 Oct 2012 18:00:33 +0200 +Subject: [PATCH] wip: hw/qxl: inject interrupts in any state + +--- + hw/qxl.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 9389752..b137731 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -1714,7 +1714,6 @@ static void qxl_send_events(PCIQXLDevice *d, uint32_t events) + uint32_t le_events = cpu_to_le32(events); + + trace_qxl_send_events(d->id, events); +- assert(qemu_spice_display_is_running(&d->ssd)); + old_pending = __sync_fetch_and_or(&d->ram->int_pending, le_events); + if ((old_pending & le_events) == le_events) { + return; +-- +1.7.12.1 + diff --git a/qemu.spec b/qemu.spec index a596ecf..ae8ae6b 100644 --- a/qemu.spec +++ b/qemu.spec @@ -109,7 +109,7 @@ Summary: QEMU is a FAST! processor emulator Name: qemu Version: 1.2.0 -Release: 17%{?dist} +Release: 18%{?dist} # Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped Epoch: 2 License: GPLv2+ and LGPLv2+ and BSD @@ -466,6 +466,13 @@ Patch0800: 0800-mips-Fix-link-error-with-piix4_pm_init.patch # Add ./configure --disable-kvm-options # keep: Carrying locally until qemu-kvm is fully merged into qemu.git Patch0801: 0801-configure-Add-disable-kvm-options.patch +# Fix loading arm initrd if kernel is very large (bz 862766) +Patch802: 0802-arm_boot-Change-initrd-load-address-to-halfway-throu.patch +# Don't use reserved word 'function' in systemtap files (bz 870972) +Patch803: 0803-dtrace-backend-add-function-to-reserved-words.patch +# Drop assertion that was triggering when pausing guests w/ qxl (bz +# 870972) +Patch804: 0804-wip-hw-qxl-inject-interrupts-in-any-state.patch BuildRequires: SDL-devel @@ -1198,6 +1205,9 @@ such as kvm_stat. %patch0800 -p1 %patch0801 -p1 +%patch802 -p1 +%patch803 -p1 +%patch804 -p1 %build @@ -1790,6 +1800,12 @@ fi %{_mandir}/man1/qemu-img.1* %changelog +* Tue Oct 30 2012 Cole Robinson - 2:1.2.0-18 +- Fix loading arm initrd if kernel is very large (bz #862766) +- Don't use reserved word 'function' in systemtap files (bz #870972) +- Drop assertion that was triggering when pausing guests w/ qxl (bz + #870972) + * Sun Oct 28 2012 Cole Robinson - 2:1.2.0-17 - Pull patches queued for qemu 1.2.1