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)
This commit is contained in:
parent
5544c1b492
commit
771708e988
138
0802-arm_boot-Change-initrd-load-address-to-halfway-throu.patch
Normal file
138
0802-arm_boot-Change-initrd-load-address-to-halfway-throu.patch
Normal file
@ -0,0 +1,138 @@
|
||||
From d3a43fe4b870154032db4651824bc88e3cb81dc5 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Maydell <peter.maydell@linaro.org>
|
||||
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 <peter.maydell@linaro.org>
|
||||
---
|
||||
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
|
||||
|
27
0803-dtrace-backend-add-function-to-reserved-words.patch
Normal file
27
0803-dtrace-backend-add-function-to-reserved-words.patch
Normal file
@ -0,0 +1,27 @@
|
||||
From 4780bb16558d2753e2277e1570644bec49551534 Mon Sep 17 00:00:00 2001
|
||||
From: Alon Levy <alevy@redhat.com>
|
||||
Date: Sun, 2 Sep 2012 02:04:16 +0300
|
||||
Subject: [PATCH] dtrace backend: add function to reserved words
|
||||
|
||||
Signed-off-by: Alon Levy <alevy@redhat.com>
|
||||
Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
|
||||
---
|
||||
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
|
||||
|
24
0804-wip-hw-qxl-inject-interrupts-in-any-state.patch
Normal file
24
0804-wip-hw-qxl-inject-interrupts-in-any-state.patch
Normal file
@ -0,0 +1,24 @@
|
||||
From e0575d0a1a14e8f4e8fc11d549cbd07cca433383 Mon Sep 17 00:00:00 2001
|
||||
From: Alon Levy <alevy@redhat.com>
|
||||
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
|
||||
|
18
qemu.spec
18
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 <crobinso@redhat.com> - 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 <crobinso@redhat.com> - 2:1.2.0-17
|
||||
- Pull patches queued for qemu 1.2.1
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user