[RFC PATCH 17/33] Support loading an initrd when running on Xen

From: Chris Wright
Date: Tue Jul 18 2006 - 05:26:45 EST


Due to the initial physical memory layout when booting on Xen, the initrd
image ends up below min_low_pfn (as registered with the bootstrap memory
allocator). Add Xen subarch support to enable initrd_below_start_ok flag,
and disable initrd_reserve_bootmem.

Signed-off-by: Ian Pratt <ian.pratt@xxxxxxxxxxxxx>
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>
Signed-off-by: Chris Wright <chrisw@xxxxxxxxxxxx>
---
arch/i386/kernel/setup.c | 4 +++-
include/asm-i386/mach-xen/setup_arch_post.h | 6 ++++++
2 files changed, 9 insertions(+), 1 deletion(-)

diff -r f4c730a90338 arch/i386/kernel/setup.c
--- a/arch/i386/kernel/setup.c Tue Jun 13 23:54:44 2006 -0700
+++ b/arch/i386/kernel/setup.c Wed Jun 14 00:02:16 2006 -0700
@@ -1205,6 +1205,7 @@ extern unsigned long __init setup_memory
extern unsigned long __init setup_memory(void);
extern void zone_sizes_init(void);
#endif /* !CONFIG_NEED_MULTIPLE_NODES */
+int initrd_reserve_bootmem = 1;

void __init setup_bootmem_allocator(void)
{
@@ -1265,7 +1266,8 @@ void __init setup_bootmem_allocator(void
#ifdef CONFIG_BLK_DEV_INITRD
if (LOADER_TYPE && INITRD_START) {
if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) {
- reserve_bootmem(INITRD_START, INITRD_SIZE);
+ if (initrd_reserve_bootmem)
+ reserve_bootmem(INITRD_START, INITRD_SIZE);
initrd_start =
INITRD_START ? INITRD_START + PAGE_OFFSET : 0;
initrd_end = initrd_start+INITRD_SIZE;
diff -r f4c730a90338 arch/i386/mach-xen/setup-xen.c
--- a/arch/i386/mach-xen/setup-xen.c Tue Jun 13 23:54:44 2006 -0700
+++ b/arch/i386/mach-xen/setup-xen.c Wed Jun 14 00:02:16 2006 -0700
@@ -5,6 +5,8 @@
#include <linux/config.h>
#include <linux/module.h>
#include <linux/mm.h>
+#include <linux/bootmem.h>
+#include <linux/initrd.h>

#include <asm/e820.h>
#include <asm/setup.h>
@@ -68,4 +70,10 @@ void __init machine_specific_arch_setup(
memcpy(saved_command_line, xen_start_info->cmd_line,
MAX_GUEST_CMDLINE > COMMAND_LINE_SIZE ?
COMMAND_LINE_SIZE : MAX_GUEST_CMDLINE);
+
+ if (INITRD_START &&
+ INITRD_START + PAGE_OFFSET < min_low_pfn << PAGE_SHIFT) {
+ initrd_reserve_bootmem = 0;
+ initrd_below_start_ok = 1;
+ }
}
diff -r f4c730a90338 include/asm-i386/setup.h
--- a/include/asm-i386/setup.h Tue Jun 13 23:54:44 2006 -0700
+++ b/include/asm-i386/setup.h Wed Jun 14 00:02:16 2006 -0700
@@ -66,6 +66,7 @@ extern unsigned char boot_params[PARAM_S
#define LOWMEMSIZE() (0x9f000)

extern unsigned long init_pg_tables_end;
+extern int initrd_reserve_bootmem;

struct e820entry;


--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/