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

[Xen-changelog] [xen-unstable] x86: find a better location for the real-mode trampoline


  • To: xen-changelog@xxxxxxxxxxxxxxxxxxx
  • From: Xen patchbot-unstable <patchbot@xxxxxxx>
  • Date: Mon, 21 Jan 2013 22:33:08 +0000
  • Delivery-date: Mon, 21 Jan 2013 22:33:19 +0000
  • List-id: "Change log for Mercurial \(receive only\)" <xen-changelog.lists.xen.org>

# HG changeset patch
# User Paolo Bonzini <pbonzini@xxxxxxxxxx>
# Date 1358505311 -3600
# Node ID 3b59a6c3e9b0fb5009bdfff97c8493bb9f0bec54
# Parent  025f202f3022c30d1ec3b6ffcb72861c43a32cf7
x86: find a better location for the real-mode trampoline

On some machines, the location at 0x40e does not point to the beginning
of the EBDA.  Rather, it points to the beginning of the BIOS-reserved
area of the EBDA, while the option ROMs place their data below that
segment.

For this reason, 0x413 is actually a better source than 0x40e to get
the location of the real-mode trampoline.  Xen was already using it
as a second source, and this patch keeps that working.  However, just
in case, let's also fetch the information from the multiboot structure,
where the boot loader should have placed it.  This way we don't
necessarily trust one of the BIOS or the multiboot loader more than
the other.

Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>

Retain the previous code, thus using the multiboot value only if it's
sane but lower than the BDA computed one. Also use the full 32-bit
mem_lower value and prefer MBI_MEMLIMITS over open coding it (requiring
a slight adjustment to multiboot.h to make its constants actually
usable in assembly code, which previously they were only meant to be).

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Acked-by: Keir Fraser <keir@xxxxxxx>
Committed-by: Jan Beulich <jbeulich@xxxxxxxx>
---


diff -r 025f202f3022 -r 3b59a6c3e9b0 xen/arch/x86/boot/head.S
--- a/xen/arch/x86/boot/head.S  Thu Jan 17 16:48:25 2013 +0000
+++ b/xen/arch/x86/boot/head.S  Fri Jan 18 11:35:11 2013 +0100
@@ -88,6 +88,20 @@ 0:
         movzwl  0x413,%eax          /* use base memory size on failure */
         shl     $10-4,%eax
 1:
+        /*
+         * Compare the value in the BDA with the information from the
+         * multiboot structure (if available) and use the smallest.
+         */
+        testb   $MBI_MEMLIMITS,(%ebx)
+        jz      2f                  /* not available? BDA value will be fine */
+        mov     4(%ebx),%edx
+        cmp     $0x100,%edx         /* is the multiboot value too small? */
+        jb      2f                  /* if so, do not use it */
+        shl     $10-4,%edx
+        cmp     %eax,%edx           /* compare with BDA value */
+        cmovb   %edx,%eax           /* and use the smaller */
+
+2:      /* Reserve 64kb for the trampoline */
         sub     $0x1000,%eax
 
         /* From arch/x86/smpboot.c: start_eip had better be page-aligned! */
diff -r 025f202f3022 -r 3b59a6c3e9b0 xen/include/xen/multiboot.h
--- a/xen/include/xen/multiboot.h       Thu Jan 17 16:48:25 2013 +0000
+++ b/xen/include/xen/multiboot.h       Fri Jan 18 11:35:11 2013 +0100
@@ -18,6 +18,7 @@
 #ifndef __MULTIBOOT_H__
 #define __MULTIBOOT_H__
 
+#include "const.h"
 
 /*
  * Multiboot header structure.
@@ -31,17 +32,17 @@
 /* The magic number passed by a Multiboot-compliant boot loader. */
 #define MULTIBOOT_BOOTLOADER_MAGIC     0x2BADB002
 
-#define MBI_MEMLIMITS  (1u<< 0)
-#define MBI_BOOTDEV    (1u<< 1)
-#define MBI_CMDLINE    (1u<< 2)
-#define MBI_MODULES    (1u<< 3)
-#define MBI_AOUT_SYMS  (1u<< 4)
-#define MBI_ELF_SYMS   (1u<< 5)
-#define MBI_MEMMAP     (1u<< 6)
-#define MBI_DRIVES     (1u<< 7)
-#define MBI_BIOSCONFIG (1u<< 8)
-#define MBI_LOADERNAME (1u<< 9)
-#define MBI_APM        (1u<<10)
+#define MBI_MEMLIMITS  (_AC(1,u) << 0)
+#define MBI_BOOTDEV    (_AC(1,u) << 1)
+#define MBI_CMDLINE    (_AC(1,u) << 2)
+#define MBI_MODULES    (_AC(1,u) << 3)
+#define MBI_AOUT_SYMS  (_AC(1,u) << 4)
+#define MBI_ELF_SYMS   (_AC(1,u) << 5)
+#define MBI_MEMMAP     (_AC(1,u) << 6)
+#define MBI_DRIVES     (_AC(1,u) << 7)
+#define MBI_BIOSCONFIG (_AC(1,u) << 8)
+#define MBI_LOADERNAME (_AC(1,u) << 9)
+#define MBI_APM        (_AC(1,u) << 10)
 
 #ifndef __ASSEMBLY__
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
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®.