WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] x86_32: Relocate multiboot modules to bel

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] x86_32: Relocate multiboot modules to below 1GB.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 23 Mar 2010 00:35:10 -0700
Delivery-date: Tue, 23 Mar 2010 00:35:10 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1269329313 0
# Node ID bcc09eb7379fa3717bc95bd235084c09b7a1bed5
# Parent  ab5f65e8137cb78afb96036522da5a7d1e00e52b
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/arch/x86/boot/Makefile   |    2 +-
 xen/arch/x86/boot/build32.mk |    2 +-
 xen/arch/x86/boot/reloc.c    |   20 ++++++++++++++++++++
 3 files changed, 22 insertions(+), 2 deletions(-)

diff -r ab5f65e8137c -r bcc09eb7379f xen/arch/x86/boot/Makefile
--- a/xen/arch/x86/boot/Makefile        Mon Mar 22 10:29:42 2010 +0000
+++ b/xen/arch/x86/boot/Makefile        Tue Mar 23 07:28:33 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 ab5f65e8137c -r bcc09eb7379f xen/arch/x86/boot/build32.mk
--- a/xen/arch/x86/boot/build32.mk      Mon Mar 22 10:29:42 2010 +0000
+++ b/xen/arch/x86/boot/build32.mk      Tue Mar 23 07:28:33 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 ab5f65e8137c -r bcc09eb7379f xen/arch/x86/boot/reloc.c
--- a/xen/arch/x86/boot/reloc.c Mon Mar 22 10:29:42 2010 +0000
+++ b/xen/arch/x86/boot/reloc.c Tue Mar 23 07:28:33 2010 +0000
@@ -70,8 +70,28 @@ multiboot_info_t *reloc(multiboot_info_t
             (module_t *)mbi->mods_addr, mbi->mods_count * sizeof(module_t));
         mbi->mods_addr = (u32)mods;
         for ( i = 0; i < mbi->mods_count; i++ )
+        {
+#if XEN_BITSPERLONG == 32
+            /*
+             * 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 */
+            static void *mod_alloc = (void *)BOOTMAP_END;
+            u32 mod_len = mods[i].mod_end - mods[i].mod_start;
+            if ( mods[i].mod_end > BOOTMAP_END )
+            {
+                mod_alloc = (void *)
+                    (((unsigned long)mod_alloc - mod_len) & ~15ul);
+                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;
+            }
+#endif
             if ( mods[i].string )
                 mods[i].string = (u32)reloc_mbi_string((char *)mods[i].string);
+        }
     }
 
     if ( mbi->flags & MBI_MEMMAP )

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] x86_32: Relocate multiboot modules to below 1GB., Xen patchbot-unstable <=