[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-3.4-testing] x86_32: Relocate multiboot modules to below 1GB.



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1269429595 0
# Node ID 5b43b64a40f92b59e765c874289ed5af4d4155fe
# Parent  ce43eb89b253c0946027f9dec4d0aa211ba71219
x86_32: Relocate multiboot modules to below 1GB.

Otherwise Xen cannot access them later during boot. GRUB2 places
modules as high as possible below 4GB, which has been causing boot
failure.

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
xen-unstable changeset:   21051:bcc09eb7379f
xen-unstable date:        Tue Mar 23 07:28:33 2010 +0000

Fix 21051:bcc09eb7379f "x86_32: Relocate multiboot modules to below 1GB."

Copy the modules in ascending order in memory, rather than decsending
order. This reduces the likelihood of the second relocation (in
setup.c) corrupting modules through accidental overwriting.

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
xen-unstable changeset:   21060:377433a77d70
xen-unstable date:        Wed Mar 24 11:06:48 2010 +0000
---
 xen/arch/x86/boot/Makefile   |    2 +-
 xen/arch/x86/boot/build32.mk |    2 +-
 xen/arch/x86/boot/reloc.c    |   28 ++++++++++++++++++++++++++++
 3 files changed, 30 insertions(+), 2 deletions(-)

diff -r ce43eb89b253 -r 5b43b64a40f9 xen/arch/x86/boot/Makefile
--- a/xen/arch/x86/boot/Makefile        Wed Mar 24 11:18:13 2010 +0000
+++ b/xen/arch/x86/boot/Makefile        Wed Mar 24 11:19:55 2010 +0000
@@ -4,6 +4,6 @@ head.o: reloc.S
 
 BOOT_TRAMPOLINE := $(shell sed -n 
's,^\#define[[:space:]]\+BOOT_TRAMPOLINE[[:space:]]\+,,p' 
$(BASEDIR)/include/asm-x86/config.h)
 %.S: %.c
-       RELOC=$(BOOT_TRAMPOLINE) $(MAKE) -f build32.mk $@
+       RELOC=$(BOOT_TRAMPOLINE) XEN_BITSPERLONG=$(patsubst 
x86_%,%,$(TARGET_SUBARCH)) $(MAKE) -f build32.mk $@
 
 reloc.S: $(BASEDIR)/include/asm-x86/config.h
diff -r ce43eb89b253 -r 5b43b64a40f9 xen/arch/x86/boot/build32.mk
--- a/xen/arch/x86/boot/build32.mk      Wed Mar 24 11:18:13 2010 +0000
+++ b/xen/arch/x86/boot/build32.mk      Wed Mar 24 11:19:55 2010 +0000
@@ -22,6 +22,6 @@ CFLAGS += -Werror -fno-builtin -msoft-fl
        $(LD) $(LDFLAGS_DIRECT) -N -Ttext $(RELOC) -o $@ $<
 
 %.o: %.c
-       $(CC) $(CFLAGS) -c $< -o $@
+       $(CC) $(CFLAGS) -DXEN_BITSPERLONG=$(XEN_BITSPERLONG) -c $< -o $@
 
 reloc.o: $(BASEDIR)/include/asm-x86/config.h
diff -r ce43eb89b253 -r 5b43b64a40f9 xen/arch/x86/boot/reloc.c
--- a/xen/arch/x86/boot/reloc.c Wed Mar 24 11:18:13 2010 +0000
+++ b/xen/arch/x86/boot/reloc.c Wed Mar 24 11:19:55 2010 +0000
@@ -68,10 +68,38 @@ multiboot_info_t *reloc(multiboot_info_t
     {
         module_t *mods = reloc_mbi_struct(
             (module_t *)mbi->mods_addr, mbi->mods_count * sizeof(module_t));
+        u32 max_addr = 0;
+
         mbi->mods_addr = (u32)mods;
+
         for ( i = 0; i < mbi->mods_count; i++ )
+        {
             if ( mods[i].string )
                 mods[i].string = (u32)reloc_mbi_string((char *)mods[i].string);
+            if ( mods[i].mod_end > max_addr )
+                max_addr = mods[i].mod_end;
+        }
+
+        /*
+         * 32-bit Xen only maps bottom 1GB of memory at boot time. Relocate 
+         * modules which extend beyond this (GRUB2 in particular likes to 
+         * place modules as high as possible below 4GB).
+         */
+#define BOOTMAP_END (1ul<<30) /* 1GB */
+        if ( (XEN_BITSPERLONG == 32) && (max_addr > BOOTMAP_END) )
+        {
+            char *mod_alloc = (char *)BOOTMAP_END;
+            for ( i = 0; i < mbi->mods_count; i++ )
+                mod_alloc -= mods[i].mod_end - mods[i].mod_start;
+            for ( i = 0; i < mbi->mods_count; i++ )
+            {
+                u32 mod_len = mods[i].mod_end - mods[i].mod_start;
+                mods[i].mod_start = (u32)memcpy(
+                    mod_alloc, (char *)mods[i].mod_start, mod_len);
+                mods[i].mod_end = mods[i].mod_start + mod_len;
+                mod_alloc += mod_len;
+            }
+        }
     }
 
     if ( mbi->flags & MBI_MEMMAP )

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.