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] Fix 21051:bcc09eb7379f "x86_32: Relocate

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] Fix 21051:bcc09eb7379f "x86_32: Relocate multiboot modules to below 1GB."
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 24 Mar 2010 04:30:39 -0700
Delivery-date: Wed, 24 Mar 2010 04:31:00 -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 1269428808 0
# Node ID 377433a77d7036b17751efc8183b73b73220bfea
# Parent  3c8719d2cb8d8df095f616eacadda3cb7d970a05
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/arch/x86/boot/reloc.c |   36 ++++++++++++++++++++++--------------
 1 files changed, 22 insertions(+), 14 deletions(-)

diff -r 3c8719d2cb8d -r 377433a77d70 xen/arch/x86/boot/reloc.c
--- a/xen/arch/x86/boot/reloc.c Wed Mar 24 11:05:06 2010 +0000
+++ b/xen/arch/x86/boot/reloc.c Wed Mar 24 11:06:48 2010 +0000
@@ -68,29 +68,37 @@ 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 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).
-             */
+            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 */
-            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 )
+        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++ )
             {
-                mod_alloc = (void *)
-                    (((unsigned long)mod_alloc - mod_len) & ~15ul);
+                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;
             }
-#endif
-            if ( mods[i].string )
-                mods[i].string = (u32)reloc_mbi_string((char *)mods[i].string);
         }
     }
 

_______________________________________________
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] Fix 21051:bcc09eb7379f "x86_32: Relocate multiboot modules to below 1GB.", Xen patchbot-unstable <=