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

Re: [Xen-devel] [PATCH RFC 4/7] xen/x86: Migrate to XBI structure



On Fri, Aug 8, 2014 at 4:04 PM, Daniel Kiper <daniel.kiper@xxxxxxxxxx> wrote:
> We have all constants and structures in place. So, finally break multiboot 
> (v1)
> protocol dependency. It means that most of Xen code (excluding preloader)
> could be bootloader agnostic and does not need almost any knowledge about
> boot protocol. Additionally, we are able to pass all boot data to 
> __start_xen()
> in one bucket without any side channels. I do not mention that we are also
> able to easily identify boot data in Xen code.
>
> Here is boot data flow for legacy BIOS platform:
>
>   BIOS -> GRUB -> multiboot[12]* -> __reloc() -> MBD ->-\
>                                                         /
>                      -----------------<-----------------
>                      \
>                       \
>                        ---> __init_xbi() -> XBI_MB -> __start_xen() -> XBI
>                       /
>              BIOS ->-/
>
>   * multiboot2 is not implemented yet. Look for it in next patch.
>
> Here is boot data flow for EFI platform:
>
>   EFI -> efi_start() -> XBI_EFI -> __start_xen() -> XBI
>
> WARNING: ARM build could be broken by this patch. We need to agree XBI
> integration into ARM. Personally I think that it is worth storing all
> data from any bootloader and preloader in XBI on any architecture. This
> give a chance to share more code between architectures. However, every
> architecture should define its own XBI (in relevant include/asm directory).
> Despite that it looks that some parts of it could be common, e.g.  modules
> data, command line arguments, boot loader name, EFI data, etc., even if types
> would not be the same. So, as it was stated above a lot of code could be
> shared among architectures.

From looking at this patch, it only conflicts slightly with the arm64 EFI work
I have been doing.  Most of the changes are to areas of efi/boot.c that I don't
touch.  From a practical point of view it should be relatively easy
for me to base
my patch series on yours or vice versa.
GRUB uses device tree to describe modules passed to XEN, so it's
not clear to me what the advantage of translating a device tree description
of modules into an ARM specific XBI structure would have.

Roy

>
> Signed-off-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx>
> ---
>  xen/arch/x86/Makefile             |    1 +
>  xen/arch/x86/boot/cmdline.S       |    9 +-
>  xen/arch/x86/boot/head.S          |   31 ++--
>  xen/arch/x86/boot/reloc.c         |  153 ++++++++++++-----
>  xen/arch/x86/boot/x86_64.S        |   10 +-
>  xen/arch/x86/dmi_scan.c           |    7 +-
>  xen/arch/x86/domain_build.c       |   24 +--
>  xen/arch/x86/efi/boot.c           |  212 +++++++++++------------
>  xen/arch/x86/efi/efi.h            |    3 -
>  xen/arch/x86/efi/runtime.c        |   52 ++++--
>  xen/arch/x86/init_xbi.c           |  254 +++++++++++++++++++++++++++
>  xen/arch/x86/microcode.c          |   39 ++---
>  xen/arch/x86/mpparse.c            |    9 +-
>  xen/arch/x86/platform_hypercall.c |   19 +--
>  xen/arch/x86/setup.c              |  340 
> +++++++++++--------------------------
>  xen/arch/x86/x86_64/asm-offsets.c |    5 +-
>  xen/drivers/acpi/osl.c            |    9 +-
>  xen/drivers/video/vesa.c          |    5 +-
>  xen/drivers/video/vga.c           |   16 +-
>  xen/include/asm-x86/config.h      |    2 -
>  xen/include/asm-x86/e820.h        |    8 -
>  xen/include/asm-x86/edd.h         |    6 -
>  xen/include/asm-x86/setup.h       |   10 +-
>  xen/include/xen/efi.h             |   10 --
>  xen/include/xen/vga.h             |    4 -
>  xen/include/xsm/xsm.h             |   14 +-
>  xen/xsm/xsm_core.c                |    6 +-
>  xen/xsm/xsm_policy.c              |   14 +-
>  28 files changed, 723 insertions(+), 549 deletions(-)
>  create mode 100644 xen/arch/x86/init_xbi.c
>
> diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile
> index c1e244d..bb2264a 100644
> --- a/xen/arch/x86/Makefile
> +++ b/xen/arch/x86/Makefile
> @@ -42,6 +42,7 @@ obj-y += numa.o
>  obj-y += pci.o
>  obj-y += percpu.o
>  obj-y += physdev.o
> +obj-y += init_xbi.o
>  obj-y += setup.o
>  obj-y += shutdown.o
>  obj-y += smp.o
> diff --git a/xen/arch/x86/boot/cmdline.S b/xen/arch/x86/boot/cmdline.S
> index 00687eb..7316011 100644
> --- a/xen/arch/x86/boot/cmdline.S
> +++ b/xen/arch/x86/boot/cmdline.S
> @@ -152,17 +152,14 @@ cmdline_parse_early:
>          pusha
>
>          /* Bail if there is no command line to parse. */
> -        mov     sym_phys(multiboot_ptr),%ebx
> -        mov     MB_flags(%ebx),%eax
> -        test    $4,%al
> -        jz      .Lcmdline_exit
> -        mov     MB_cmdline(%ebx),%eax
> +        mov     sym_phys(mbd_ptr),%ebx
> +        mov     MBD_cmdline(%ebx),%eax
>          test    %eax,%eax
>          jz      .Lcmdline_exit
>
>          /* Check for 'no-real-mode' command-line option. */
>          pushl   $sym_phys(.Lno_rm_opt)
> -        pushl   MB_cmdline(%ebx)
> +        pushl   MBD_cmdline(%ebx)
>          call    .Lfind_option
>          test    %eax,%eax
>          setnz   %al
> diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S
> index 10ecf51..79bce3c 100644
> --- a/xen/arch/x86/boot/head.S
> +++ b/xen/arch/x86/boot/head.S
> @@ -86,14 +86,14 @@ __start:
>          jne     not_multiboot
>
>          /* Set up trampoline segment 64k below EBDA */
> -        movzwl  0x40e,%eax          /* EBDA segment */
> -        cmp     $0xa000,%eax        /* sanity check (high) */
> +        movzwl  0x40e,%ecx          /* EBDA segment */
> +        cmp     $0xa000,%ecx        /* sanity check (high) */
>          jae     0f
> -        cmp     $0x4000,%eax        /* sanity check (low) */
> +        cmp     $0x4000,%ecx        /* sanity check (low) */
>          jae     1f
>  0:
> -        movzwl  0x413,%eax          /* use base memory size on failure */
> -        shl     $10-4,%eax
> +        movzwl  0x413,%ecx          /* use base memory size on failure */
> +        shl     $10-4,%ecx
>  1:
>          /*
>           * Compare the value in the BDA with the information from the
> @@ -105,22 +105,23 @@ __start:
>          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 */
> +        cmp     %ecx,%edx           /* compare with BDA value */
> +        cmovb   %edx,%ecx           /* and use the smaller */
>
>  2:      /* Reserve 64kb for the trampoline */
> -        sub     $0x1000,%eax
> +        sub     $0x1000,%ecx
>
>          /* From arch/x86/smpboot.c: start_eip had better be page-aligned! */
> -        xor     %al, %al
> -        shl     $4, %eax
> -        mov     %eax,sym_phys(trampoline_phys)
> +        xor     %cl, %cl
> +        shl     $4, %ecx
> +        mov     %ecx,sym_phys(trampoline_phys)
>
> -        /* Save the Multiboot info struct (after relocation) for later use. 
> */
> +        /* Save the Multiboot data (after relocation) for later use. */
>          mov     $sym_phys(cpu0_stack)+1024,%esp
> -        push    %ebx
> -        call    reloc
> -        mov     %eax,sym_phys(multiboot_ptr)
> +        push    %eax                /* Multiboot magic */
> +        push    %ebx                /* Multiboot information address */
> +        call    reloc               /* %ecx contains trampoline address */
> +        mov     %eax,sym_phys(mbd_ptr)
>
>          /* Initialize BSS (no nasty surprises!) */
>          mov     $sym_phys(__bss_start),%edi
> diff --git a/xen/arch/x86/boot/reloc.c b/xen/arch/x86/boot/reloc.c
> index fa0fb6b..29f4887 100644
> --- a/xen/arch/x86/boot/reloc.c
> +++ b/xen/arch/x86/boot/reloc.c
> @@ -1,40 +1,56 @@
> -/******************************************************************************
> +/*
>   * reloc.c
> - *
> + *
>   * 32-bit flat memory-map routines for relocating Multiboot structures
>   * and modules. This is most easily done early with paging disabled.
> - *
> + *
>   * Copyright (c) 2009, Citrix Systems, Inc.
> - *
> + * Copyright (c) 2013, 2014 Oracle Co., Daniel Kiper
> + *
>   * Authors:
>   *    Keir Fraser <keir@xxxxxxx>
> + *    Daniel Kiper
>   */
>
> -/* entered with %eax = BOOT_TRAMPOLINE */
> +typedef unsigned char u8;
> +typedef unsigned short u16;
> +typedef unsigned long u32;
> +typedef unsigned long long u64;
> +
> +#include "../../../include/xen/multiboot.h"
> +#include "../../../include/asm/mbd.h"
> +
> +/*
> + * __HERE__ IS TRUE ENTRY POINT!!!
> + *
> + * It is entered from xen/arch/x86/boot/head.S with:
> + *   - %eax = MULTIBOOT_MAGIC,
> + *   - %ebx = MULTIBOOT_INFORMATION_ADDRESS,
> + *   - %ecx = BOOT_TRAMPOLINE.
> + */
>  asm (
>      "    .text                         \n"
>      "    .globl _start                 \n"
>      "_start:                           \n"
>      "    call 1f                       \n"
>      "1:  pop  %ebx                     \n"
> -    "    mov  %eax,alloc-1b(%ebx)      \n"
> -    "    jmp  reloc                    \n"
> +    "    mov  %ecx,alloc-1b(%ebx)      \n"
> +    "    jmp  __reloc                  \n"
>      );
>
> -/* This is our data.  Because the code must be relocatable, no BSS is
> - * allowed.  All data is accessed PC-relative with inline assembly.
> +/*
> + * This is our data. Because the code must be relocatable, no BSS is
> + * allowed. All data is accessed PC-relative with inline assembly.
>   */
>  asm (
>      "alloc:                            \n"
>      "    .long 0                       \n"
>      );
>
> -typedef unsigned int u32;
> -#include "../../../include/xen/multiboot.h"
> -
> -static void *reloc_mbi_struct(void *old, unsigned int bytes)
> +static u32 alloc_struct(u32 bytes)
>  {
> -    void *new;
> +    u32 s;
> +
>      asm(
>      "    call 1f                      \n"
>      "1:  pop  %%edx                   \n"
> @@ -42,58 +58,105 @@ static void *reloc_mbi_struct(void *old, unsigned int 
> bytes)
>      "    sub  %1,%0                   \n"
>      "    and  $~15,%0                 \n"
>      "    mov  %0,alloc-1b(%%edx)      \n"
> -    "    mov  %0,%%edi                \n"
> +       : "=&r" (s) : "r" (bytes) : "edx");
> +
> +    return s;
> +}
> +
> +static void zero_struct(u32 s, u32 bytes)
> +{
> +    asm volatile(
> +    "    cld                          \n"
> +    "    xor  %%eax,%%eax             \n"
> +    "    rep  stosb                   \n"
> +       : "+D" (s), "+c" (bytes) : : "eax");
> +}
> +
> +static u32 copy_struct(u32 src, u32 bytes)
> +{
> +    u32 dst;
> +
> +    dst = alloc_struct(bytes);
> +
> +    asm volatile(
> +    "    cld                          \n"
> +    "    mov  %2,%%edi                \n"
>      "    rep  movsb                   \n"
> -       : "=&r" (new), "+c" (bytes), "+S" (old)
> -       : : "edx", "edi");
> -    return new;
> +       : "+S" (src), "+c" (bytes) : "r" (dst) : "edi");
> +
> +    return dst;
>  }
>
> -static char *reloc_mbi_string(char *old)
> +static u32 copy_string(u32 src)
>  {
>      char *p;
> -    for ( p = old; *p != '\0'; p++ )
> +
> +    if ( src == 0 )
> +        return 0;
> +
> +    for ( p = (char *)src; *p != '\0'; p++ )
>          continue;
> -    return reloc_mbi_struct(old, p - old + 1);
> +
> +    return copy_struct(src, p - (char *)src + 1);
>  }
>
> -multiboot_info_t *reloc(multiboot_info_t *mbi_old)
> +static mbd_t *mb_mbd(mbd_t *mbd, multiboot_info_t *mbi)
>  {
> -    multiboot_info_t *mbi = reloc_mbi_struct(mbi_old, sizeof(*mbi));
>      int i;
> +    module_t *mbi_mods;
> +    boot_module_t *mbd_mods;
> +
> +    if ( mbi->flags & MBI_LOADERNAME )
> +        mbd->boot_loader_name = copy_string(mbi->boot_loader_name);
>
>      if ( mbi->flags & MBI_CMDLINE )
> -        mbi->cmdline = (u32)reloc_mbi_string((char *)mbi->cmdline);
> +        mbd->cmdline = copy_string(mbi->cmdline);
> +
> +    if ( mbi->flags & MBI_MEMLIMITS )
> +    {
> +        mbd->mem_lower = mbi->mem_lower;
> +        mbd->mem_upper = mbi->mem_upper;
> +    }
> +
> +    if ( mbi->flags & MBI_MEMMAP )
> +    {
> +        mbd->mmap_size = mbi->mmap_length;
> +        mbd->mmap = copy_struct(mbi->mmap_addr, mbi->mmap_length);
> +    }
>
>      if ( mbi->flags & MBI_MODULES )
>      {
> -        module_t *mods = reloc_mbi_struct(
> -            (module_t *)mbi->mods_addr, mbi->mods_count * sizeof(module_t));
> +        mbd->mods_nr = mbi->mods_count;
> +        mbd->mods = alloc_struct(mbi->mods_count * sizeof(boot_module_t));
>
> -        mbi->mods_addr = (u32)mods;
> +        mbi_mods = (module_t *)mbi->mods_addr;
> +        mbd_mods = (boot_module_t *)mbd->mods;
>
>          for ( i = 0; i < mbi->mods_count; i++ )
>          {
> -            if ( mods[i].string )
> -                mods[i].string = (u32)reloc_mbi_string((char 
> *)mods[i].string);
> +            mbd_mods[i].start = mbi_mods[i].mod_start;
> +            mbd_mods[i].end = mbi_mods[i].mod_end;
> +            mbd_mods[i].cmdline = copy_string(mbi_mods[i].string);
> +            mbd_mods[i].relocated = 0;
>          }
>      }
>
> -    if ( mbi->flags & MBI_MEMMAP )
> -        mbi->mmap_addr = (u32)reloc_mbi_struct(
> -            (memory_map_t *)mbi->mmap_addr, mbi->mmap_length);
> +    return mbd;
> +}
>
> -    if ( mbi->flags & MBI_LOADERNAME )
> -        mbi->boot_loader_name = (u32)reloc_mbi_string(
> -            (char *)mbi->boot_loader_name);
> -
> -    /* Mask features we don't understand or don't relocate. */
> -    mbi->flags &= (MBI_MEMLIMITS |
> -                   MBI_BOOTDEV |
> -                   MBI_CMDLINE |
> -                   MBI_MODULES |
> -                   MBI_MEMMAP |
> -                   MBI_LOADERNAME);
> -
> -    return mbi;
> +/*
> + * __THIS__ IS NOT ENTRY POINT!!!
> + * PLEASE LOOK AT THE BEGINNING OF THIS FILE!!!
> + *
> + * It could be a static but then compiler complains:
> + * error: â__relocâ defined but not used.
> + */
> +mbd_t *__reloc(void *mbi, u32 mb_magic)
> +{
> +    mbd_t *mbd;
> +
> +    mbd = (mbd_t *)alloc_struct(sizeof(mbd_t));
> +    zero_struct((u32)mbd, sizeof(mbd_t));
> +
> +    return mb_mbd(mbd, mbi);
>  }
> diff --git a/xen/arch/x86/boot/x86_64.S b/xen/arch/x86/boot/x86_64.S
> index bfbafd2..ec39d38 100644
> --- a/xen/arch/x86/boot/x86_64.S
> +++ b/xen/arch/x86/boot/x86_64.S
> @@ -29,8 +29,12 @@
>          test    %ebx,%ebx
>          jnz     start_secondary
>
> -        /* Pass off the Multiboot info structure to C land. */
> -        mov     multiboot_ptr(%rip),%edi
> +        /* Init Xen Boot Info. */
> +        mov     mbd_ptr(%rip),%edi
> +        call    __init_xbi
> +
> +        /* Pass off the Xen Boot Info to C land. */
> +        movq    %rax,%rdi
>          call    __start_xen
>          ud2     /* Force a panic (invalid opcode). */
>
> @@ -38,7 +42,7 @@
>
>          .data
>          .align 8
> -multiboot_ptr:
> +mbd_ptr:
>          .long   0
>
>          .word   0
> diff --git a/xen/arch/x86/dmi_scan.c b/xen/arch/x86/dmi_scan.c
> index 500133a..cd89360 100644
> --- a/xen/arch/x86/dmi_scan.c
> +++ b/xen/arch/x86/dmi_scan.c
> @@ -12,6 +12,7 @@
>  #include <xen/efi.h>
>  #include <xen/pci.h>
>  #include <xen/pci_regs.h>
> +#include <asm/xbi.h>
>
>  #define bt_ioremap(b,l)  ((void *)__acpi_map_table(b,l))
>  #define bt_iounmap(b,l)  ((void)0)
> @@ -215,10 +216,10 @@ static int __init dmi_efi_iterate(void (*decode)(struct 
> dmi_header *))
>         const struct smbios_eps __iomem *p;
>         int ret = -1;
>
> -       if (efi.smbios == EFI_INVALID_TABLE_ADDR)
> +       if (xbi->smbios == EFI_INVALID_TABLE_ADDR)
>                 return -1;
>
> -       p = bt_ioremap(efi.smbios, sizeof(eps));
> +       p = bt_ioremap(xbi->smbios, sizeof(eps));
>         if (!p)
>                 return -1;
>         memcpy_fromio(&eps, p, sizeof(eps));
> @@ -227,7 +228,7 @@ static int __init dmi_efi_iterate(void (*decode)(struct 
> dmi_header *))
>         if (memcmp(eps.anchor, "_SM_", 4))
>                 return -1;
>
> -       p = bt_ioremap(efi.smbios, eps.length);
> +       p = bt_ioremap(xbi->smbios, eps.length);
>         if (!p)
>                 return -1;
>         if (dmi_checksum(p, eps.length) &&
> diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c
> index d4473c1..e35260b 100644
> --- a/xen/arch/x86/domain_build.c
> +++ b/xen/arch/x86/domain_build.c
> @@ -751,9 +751,9 @@ static __init void setup_pv_physmap(struct domain *d, 
> unsigned long pgtbl_pfn,
>
>  int __init construct_dom0(
>      struct domain *d,
> -    const module_t *image, unsigned long image_headroom,
> -    module_t *initrd,
> -    void *(*bootstrap_map)(const module_t *),
> +    const boot_module_t *image, unsigned long image_headroom,
> +    boot_module_t *initrd,
> +    void *(*bootstrap_map)(const boot_module_t *),
>      char *cmdline)
>  {
>      int i, cpu, rc, compatible, compat32, order, machine;
> @@ -770,9 +770,9 @@ int __init construct_dom0(
>      struct vcpu *v = d->vcpu[0];
>      unsigned long long value;
>      char *image_base = bootstrap_map(image);
> -    unsigned long image_len = image->mod_end;
> +    unsigned long image_len = image->end;
>      char *image_start = image_base + image_headroom;
> -    unsigned long initrd_len = initrd ? initrd->mod_end : 0;
> +    unsigned long initrd_len = initrd ? initrd->end : 0;
>      l4_pgentry_t *l4tab = NULL, *l4start = NULL;
>      l3_pgentry_t *l3tab = NULL, *l3start = NULL;
>      l2_pgentry_t *l2tab = NULL, *l2start = NULL;
> @@ -987,7 +987,7 @@ int __init construct_dom0(
>          initrd_pfn = vinitrd_start ?
>                       (vinitrd_start - v_start) >> PAGE_SHIFT :
>                       d->tot_pages;
> -        initrd_mfn = mfn = initrd->mod_start;
> +        initrd_mfn = mfn = initrd->start;
>          count = PFN_UP(initrd_len);
>          if ( d->arch.physaddr_bitsize &&
>               ((mfn + count - 1) >> (d->arch.physaddr_bitsize - PAGE_SHIFT)) )
> @@ -1002,12 +1002,12 @@ int __init construct_dom0(
>                      free_domheap_pages(page, order);
>                      page += 1UL << order;
>                  }
> -            memcpy(page_to_virt(page), mfn_to_virt(initrd->mod_start),
> +            memcpy(page_to_virt(page), mfn_to_virt(initrd->start),
>                     initrd_len);
> -            mpt_alloc = (paddr_t)initrd->mod_start << PAGE_SHIFT;
> +            mpt_alloc = (paddr_t)initrd->start << PAGE_SHIFT;
>              init_domheap_pages(mpt_alloc,
>                                 mpt_alloc + PAGE_ALIGN(initrd_len));
> -            initrd->mod_start = initrd_mfn = page_to_mfn(page);
> +            initrd->start = initrd_mfn = page_to_mfn(page);
>          }
>          else
>          {
> @@ -1015,7 +1015,7 @@ int __init construct_dom0(
>                  if ( assign_pages(d, mfn_to_page(mfn++), 0, 0) )
>                      BUG();
>          }
> -        initrd->mod_end = 0;
> +        initrd->end = 0;
>      }
>
>      printk("PHYSICAL MEMORY ARRANGEMENT:\n"
> @@ -1026,7 +1026,7 @@ int __init construct_dom0(
>                 nr_pages - d->tot_pages);
>      if ( initrd )
>      {
> -        mpt_alloc = (paddr_t)initrd->mod_start << PAGE_SHIFT;
> +        mpt_alloc = (paddr_t)initrd->start << PAGE_SHIFT;
>          printk("\n Init. ramdisk: %"PRIpaddr"->%"PRIpaddr,
>                 mpt_alloc, mpt_alloc + initrd_len);
>      }
> @@ -1281,7 +1281,7 @@ int __init construct_dom0(
>          if ( pfn >= initrd_pfn )
>          {
>              if ( pfn < initrd_pfn + PFN_UP(initrd_len) )
> -                mfn = initrd->mod_start + (pfn - initrd_pfn);
> +                mfn = initrd->start + (pfn - initrd_pfn);
>              else
>                  mfn -= PFN_UP(initrd_len);
>          }
> diff --git a/xen/arch/x86/efi/boot.c b/xen/arch/x86/efi/boot.c
> index 2b515f2..fea5598 100644
> --- a/xen/arch/x86/efi/boot.c
> +++ b/xen/arch/x86/efi/boot.c
> @@ -9,7 +9,6 @@
>  #include <xen/keyhandler.h>
>  #include <xen/lib.h>
>  #include <xen/mm.h>
> -#include <xen/multiboot.h>
>  #include <xen/pci_regs.h>
>  #include <xen/pfn.h>
>  #if EFI_PAGE_SIZE != PAGE_SIZE
> @@ -25,6 +24,7 @@
>  #undef __ASSEMBLY__
>  #include <asm/msr.h>
>  #include <asm/processor.h>
> +#include <asm/xbi.h>
>
>  /* Using SetVirtualAddressMap() is incompatible with kexec: */
>  #undef USE_SET_VIRTUAL_ADDRESS_MAP
> @@ -72,13 +72,12 @@ static struct file __initdata ramdisk;
>  static struct file __initdata ucode;
>  static struct file __initdata xsm;
>
> -static multiboot_info_t __initdata mbi = {
> -    .flags = MBI_MODULES | MBI_LOADERNAME
> -};
> -static module_t __initdata mb_modules[3];
> -
>  static CHAR16 __initdata newline[] = L"\r\n";
>
> +extern unsigned short boot_edid_caps;
> +
> +extern xbi_t __read_mostly xbi_efi;
> +
>  #define PrintStr(s) StdOut->OutputString(StdOut, s)
>  #define PrintErr(s) StdErr->OutputString(StdErr, s)
>
> @@ -255,14 +254,14 @@ static void __init PrintErrMesg(const CHAR16 *mesg, 
> EFI_STATUS ErrCode)
>      blexit(mesg);
>  }
>
> -static void __init place_string(u32 *addr, const char *s)
> +static void __init place_string_char(char **addr, const char *s)
>  {
>      static char *__initdata alloc = start;
>
>      if ( s && *s )
>      {
>          size_t len1 = strlen(s) + 1;
> -        const char *old = (char *)(long)*addr;
> +        const char *old = *addr;
>          size_t len2 = *addr ? strlen(old) + 1 : 0;
>
>          alloc -= len1 + len2;
> @@ -278,7 +277,16 @@ static void __init place_string(u32 *addr, const char *s)
>              memcpy(alloc + len1, old, len2);
>          }
>      }
> -    *addr = (long)alloc;
> +    *addr = alloc;
> +}
> +
> +static void __init place_string_u32(u32 *addr, const char *s)
> +{
> +    char *s_new = (char *)(long)*addr;
> +
> +    place_string_char(&s_new, s);
> +
> +    *addr = (long)s_new;
>  }
>
>  static unsigned int __init get_argv(unsigned int argc, CHAR16 **argv,
> @@ -311,7 +319,7 @@ static unsigned int __init get_argv(unsigned int argc, 
> CHAR16 **argv,
>                  union string rest = { .w = cmdline };
>
>                  --argv;
> -                place_string(&mbi.cmdline, w2s(&rest));
> +                place_string_char(&xbi_efi.cmdline, w2s(&rest));
>                  break;
>              }
>              else
> @@ -480,9 +488,9 @@ static bool_t __init read_file(EFI_FILE_HANDLE 
> dir_handle, CHAR16 *name,
>              PrintStr(L"-");
>              DisplayUint(file->addr + size, 2 * sizeof(file->addr));
>              PrintStr(newline);
> -            mb_modules[mbi.mods_count].mod_start = file->addr >> PAGE_SHIFT;
> -            mb_modules[mbi.mods_count].mod_end = size;
> -            ++mbi.mods_count;
> +            xbi_efi.mods[xbi_efi.mods_nr].start = file->addr >> PAGE_SHIFT;
> +            xbi_efi.mods[xbi_efi.mods_nr].end = size;
> +            ++xbi_efi.mods_nr;
>          }
>
>          file->size = size;
> @@ -568,7 +576,7 @@ static void __init split_value(char *s)
>  {
>      while ( *s && isspace(*s) )
>          ++s;
> -    place_string(&mb_modules[mbi.mods_count].string, s);
> +    place_string_u32(&xbi_efi.mods[xbi_efi.mods_nr].cmdline, s);
>      while ( *s && !isspace(*s) )
>          ++s;
>      *s = 0;
> @@ -884,10 +892,10 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>      if ( StdOut->QueryMode(StdOut, StdOut->Mode->Mode,
>                             &cols, &rows) == EFI_SUCCESS )
>      {
> -        vga_console_info.video_type = XEN_VGATYPE_TEXT_MODE_3;
> -        vga_console_info.u.text_mode_3.columns = cols;
> -        vga_console_info.u.text_mode_3.rows = rows;
> -        vga_console_info.u.text_mode_3.font_height = 16;
> +        xbi_efi.vga_console_info.video_type = XEN_VGATYPE_TEXT_MODE_3;
> +        xbi_efi.vga_console_info.u.text_mode_3.columns = cols;
> +        xbi_efi.vga_console_info.u.text_mode_3.rows = rows;
> +        xbi_efi.vga_console_info.u.text_mode_3.font_height = 16;
>      }
>
>      size = 0;
> @@ -984,7 +992,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>          name.s = get_value(&cfg, "global", "ucode");
>      if ( name.s )
>      {
> -        microcode_set_module(mbi.mods_count);
> +        microcode_set_module(xbi_efi.mods_nr);
>          split_value(name.s);
>          read_file(dir_handle, s2w(&name), &ucode);
>          efi_bs->FreePool(name.w);
> @@ -1000,7 +1008,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>
>      name.s = get_value(&cfg, section.s, "options");
>      if ( name.s )
> -        place_string(&mbi.cmdline, name.s);
> +        place_string_char(&xbi_efi.cmdline, name.s);
>      /* Insert image name last, as it gets prefixed to the other options. */
>      if ( argc )
>      {
> @@ -1009,7 +1017,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>      }
>      else
>          name.s = "xen";
> -    place_string(&mbi.cmdline, name.s);
> +    place_string_char(&xbi_efi.cmdline, name.s);
>
>      cols = rows = depth = 0;
>      if ( !base_video )
> @@ -1075,16 +1083,10 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>          }
>      }
>
> -    if ( mbi.cmdline )
> -        mbi.flags |= MBI_CMDLINE;
> -    /*
> -     * These must not be initialized statically, since the value must
> -     * not get relocated when processing base relocations below.
> -     */
> -    mbi.boot_loader_name = (long)"EFI";
> -    mbi.mods_addr = (long)mb_modules;
> +    xbi_efi.efi_system_table = SystemTable;
> +    xbi_efi.edid_caps = boot_edid_caps;
>
> -    place_string(&mbi.mem_upper, NULL);
> +    place_string_u32(&xbi_efi.mem_upper, NULL);
>
>      /* Collect EDD info. */
>      BUILD_BUG_ON(offsetof(struct edd_info, edd_device_params) != EDDEXTSIZE);
> @@ -1102,7 +1104,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>      {
>          EFI_BLOCK_IO *bio;
>          EFI_DEV_PATH_PTR devp;
> -        struct edd_info *info = boot_edd_info + boot_edd_info_nr;
> +        struct edd_info *info = xbi_efi.edd_info + xbi_efi.edd_info_nr;
>          struct edd_device_params *params = &info->edd_device_params;
>          enum { root, acpi, pci, ctrlr } state = root;
>
> @@ -1111,16 +1113,16 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>               bio->Media->RemovableMedia ||
>               bio->Media->LogicalPartition )
>              continue;
> -        if ( boot_edd_info_nr < EDD_INFO_MAX )
> +        if ( xbi_efi.edd_info_nr < EDD_INFO_MAX )
>          {
> -            info->device = 0x80 + boot_edd_info_nr; /* fake */
> +            info->device = 0x80 + xbi_efi.edd_info_nr; /* fake */
>              info->version = 0x11;
>              params->length = offsetof(struct edd_device_params, dpte_ptr);
>              params->number_of_sectors = bio->Media->LastBlock + 1;
>              params->bytes_per_sector = bio->Media->BlockSize;
>              params->dpte_ptr = ~0;
>          }
> -        ++boot_edd_info_nr;
> +        ++xbi_efi.edd_info_nr;
>          status = efi_bs->HandleProtocol(handles[i], &devp_guid,
>                                          (void **)&devp);
>          if ( EFI_ERROR(status) )
> @@ -1133,7 +1135,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>                  const u8 *p;
>
>              case ACPI_DEVICE_PATH:
> -                if ( state != root || boot_edd_info_nr > EDD_INFO_MAX )
> +                if ( state != root || xbi_efi.edd_info_nr > EDD_INFO_MAX )
>                      break;
>                  switch ( DevicePathSubType(devp.DevPath) )
>                  {
> @@ -1152,7 +1154,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>              case HARDWARE_DEVICE_PATH:
>                  if ( state != acpi ||
>                       DevicePathSubType(devp.DevPath) != HW_PCI_DP ||
> -                     boot_edd_info_nr > EDD_INFO_MAX )
> +                     xbi_efi.edd_info_nr > EDD_INFO_MAX )
>                      break;
>                  state = pci;
>                  edd_put_string(params->host_bus_type, "PCI");
> @@ -1160,7 +1162,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>                  params->interface_path.pci.function = devp.Pci->Function;
>                  break;
>              case MESSAGING_DEVICE_PATH:
> -                if ( state != pci || boot_edd_info_nr > EDD_INFO_MAX )
> +                if ( state != pci || xbi_efi.edd_info_nr > EDD_INFO_MAX )
>                      break;
>                  state = ctrlr;
>                  switch ( DevicePathSubType(devp.DevPath) )
> @@ -1209,15 +1211,15 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>              case MEDIA_DEVICE_PATH:
>                  if ( DevicePathSubType(devp.DevPath) == MEDIA_HARDDRIVE_DP &&
>                       devp.HardDrive->MBRType == MBR_TYPE_PCAT &&
> -                     boot_mbr_signature_nr < EDD_MBR_SIG_MAX )
> +                     xbi_efi.mbr_signature_nr < EDD_MBR_SIG_MAX )
>                  {
> -                    struct mbr_signature *sig = boot_mbr_signature +
> -                                                boot_mbr_signature_nr;
> +                    struct mbr_signature *sig = xbi_efi.mbr_signature +
> +                                                xbi_efi.mbr_signature_nr;
>
> -                    sig->device = 0x80 + boot_edd_info_nr; /* fake */
> +                    sig->device = 0x80 + xbi_efi.edd_info_nr; /* fake */
>                      memcpy(&sig->signature, devp.HardDrive->Signature,
>                             sizeof(sig->signature));
> -                    ++boot_mbr_signature_nr;
> +                    ++xbi_efi.mbr_signature_nr;
>                  }
>                  break;
>              }
> @@ -1225,8 +1227,8 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>      }
>      if ( handles )
>          efi_bs->FreePool(handles);
> -    if ( boot_edd_info_nr > EDD_INFO_MAX )
> -        boot_edd_info_nr = EDD_INFO_MAX;
> +    if ( xbi_efi.edd_info_nr > EDD_INFO_MAX )
> +        xbi_efi.edd_info_nr = EDD_INFO_MAX;
>
>      /* XXX Collect EDID info. */
>
> @@ -1245,17 +1247,17 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>          static EFI_GUID __initdata smbios_guid = SMBIOS_TABLE_GUID;
>
>          if ( match_guid(&acpi2_guid, &efi_ct[i].VendorGuid) )
> -              efi.acpi20 = (long)efi_ct[i].VendorTable;
> +              xbi_efi.acpi20 = (long)efi_ct[i].VendorTable;
>          if ( match_guid(&acpi_guid, &efi_ct[i].VendorGuid) )
> -              efi.acpi = (long)efi_ct[i].VendorTable;
> +              xbi_efi.acpi = (long)efi_ct[i].VendorTable;
>          if ( match_guid(&mps_guid, &efi_ct[i].VendorGuid) )
> -              efi.mps = (long)efi_ct[i].VendorTable;
> +              xbi_efi.mps = (long)efi_ct[i].VendorTable;
>          if ( match_guid(&smbios_guid, &efi_ct[i].VendorGuid) )
> -              efi.smbios = (long)efi_ct[i].VendorTable;
> +              xbi_efi.smbios = (long)efi_ct[i].VendorTable;
>      }
>
> -    if (efi.smbios != EFI_INVALID_TABLE_ADDR)
> -        dmi_efi_get_table((void *)(long)efi.smbios);
> +    if (xbi_efi.smbios != EFI_INVALID_TABLE_ADDR)
> +        dmi_efi_get_table((void *)(long)xbi_efi.smbios);
>
>      /* Collect PCI ROM contents. */
>      setup_efi_pci();
> @@ -1322,40 +1324,40 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>              switch ( mode_info->PixelFormat )
>              {
>              case PixelRedGreenBlueReserved8BitPerColor:
> -                vga_console_info.u.vesa_lfb.red_pos = 0;
> -                vga_console_info.u.vesa_lfb.red_size = 8;
> -                vga_console_info.u.vesa_lfb.green_pos = 8;
> -                vga_console_info.u.vesa_lfb.green_size = 8;
> -                vga_console_info.u.vesa_lfb.blue_pos = 16;
> -                vga_console_info.u.vesa_lfb.blue_size = 8;
> -                vga_console_info.u.vesa_lfb.rsvd_pos = 24;
> -                vga_console_info.u.vesa_lfb.rsvd_size = 8;
> +                xbi_efi.vga_console_info.u.vesa_lfb.red_pos = 0;
> +                xbi_efi.vga_console_info.u.vesa_lfb.red_size = 8;
> +                xbi_efi.vga_console_info.u.vesa_lfb.green_pos = 8;
> +                xbi_efi.vga_console_info.u.vesa_lfb.green_size = 8;
> +                xbi_efi.vga_console_info.u.vesa_lfb.blue_pos = 16;
> +                xbi_efi.vga_console_info.u.vesa_lfb.blue_size = 8;
> +                xbi_efi.vga_console_info.u.vesa_lfb.rsvd_pos = 24;
> +                xbi_efi.vga_console_info.u.vesa_lfb.rsvd_size = 8;
>                  bpp = 32;
>                  break;
>              case PixelBlueGreenRedReserved8BitPerColor:
> -                vga_console_info.u.vesa_lfb.red_pos = 16;
> -                vga_console_info.u.vesa_lfb.red_size = 8;
> -                vga_console_info.u.vesa_lfb.green_pos = 8;
> -                vga_console_info.u.vesa_lfb.green_size = 8;
> -                vga_console_info.u.vesa_lfb.blue_pos = 0;
> -                vga_console_info.u.vesa_lfb.blue_size = 8;
> -                vga_console_info.u.vesa_lfb.rsvd_pos = 24;
> -                vga_console_info.u.vesa_lfb.rsvd_size = 8;
> +                xbi_efi.vga_console_info.u.vesa_lfb.red_pos = 16;
> +                xbi_efi.vga_console_info.u.vesa_lfb.red_size = 8;
> +                xbi_efi.vga_console_info.u.vesa_lfb.green_pos = 8;
> +                xbi_efi.vga_console_info.u.vesa_lfb.green_size = 8;
> +                xbi_efi.vga_console_info.u.vesa_lfb.blue_pos = 0;
> +                xbi_efi.vga_console_info.u.vesa_lfb.blue_size = 8;
> +                xbi_efi.vga_console_info.u.vesa_lfb.rsvd_pos = 24;
> +                xbi_efi.vga_console_info.u.vesa_lfb.rsvd_size = 8;
>                  bpp = 32;
>                  break;
>              case PixelBitMask:
>                  bpp = set_color(mode_info->PixelInformation.RedMask, bpp,
> -                                &vga_console_info.u.vesa_lfb.red_pos,
> -                                &vga_console_info.u.vesa_lfb.red_size);
> +                                &xbi_efi.vga_console_info.u.vesa_lfb.red_pos,
> +                                
> &xbi_efi.vga_console_info.u.vesa_lfb.red_size);
>                  bpp = set_color(mode_info->PixelInformation.GreenMask, bpp,
> -                                &vga_console_info.u.vesa_lfb.green_pos,
> -                                &vga_console_info.u.vesa_lfb.green_size);
> +                                
> &xbi_efi.vga_console_info.u.vesa_lfb.green_pos,
> +                                
> &xbi_efi.vga_console_info.u.vesa_lfb.green_size);
>                  bpp = set_color(mode_info->PixelInformation.BlueMask, bpp,
> -                                &vga_console_info.u.vesa_lfb.blue_pos,
> -                                &vga_console_info.u.vesa_lfb.blue_size);
> +                                
> &xbi_efi.vga_console_info.u.vesa_lfb.blue_pos,
> +                                
> &xbi_efi.vga_console_info.u.vesa_lfb.blue_size);
>                  bpp = set_color(mode_info->PixelInformation.ReservedMask, 
> bpp,
> -                                &vga_console_info.u.vesa_lfb.rsvd_pos,
> -                                &vga_console_info.u.vesa_lfb.rsvd_size);
> +                                
> &xbi_efi.vga_console_info.u.vesa_lfb.rsvd_pos,
> +                                
> &xbi_efi.vga_console_info.u.vesa_lfb.rsvd_size);
>                  if ( bpp > 0 )
>                      break;
>                  /* fall through */
> @@ -1366,37 +1368,37 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>              }
>          if ( !EFI_ERROR(status) )
>          {
> -            vga_console_info.video_type = XEN_VGATYPE_EFI_LFB;
> -            vga_console_info.u.vesa_lfb.gbl_caps = 2; /* possibly non-VGA */
> -            vga_console_info.u.vesa_lfb.width =
> +            xbi_efi.vga_console_info.video_type = XEN_VGATYPE_EFI_LFB;
> +            xbi_efi.vga_console_info.u.vesa_lfb.gbl_caps = 2; /* possibly 
> non-VGA */
> +            xbi_efi.vga_console_info.u.vesa_lfb.width =
>                  mode_info->HorizontalResolution;
> -            vga_console_info.u.vesa_lfb.height = 
> mode_info->VerticalResolution;
> -            vga_console_info.u.vesa_lfb.bits_per_pixel = bpp;
> -            vga_console_info.u.vesa_lfb.bytes_per_line =
> +            xbi_efi.vga_console_info.u.vesa_lfb.height = 
> mode_info->VerticalResolution;
> +            xbi_efi.vga_console_info.u.vesa_lfb.bits_per_pixel = bpp;
> +            xbi_efi.vga_console_info.u.vesa_lfb.bytes_per_line =
>                  (mode_info->PixelsPerScanLine * bpp + 7) >> 3;
> -            vga_console_info.u.vesa_lfb.lfb_base = 
> gop->Mode->FrameBufferBase;
> -            vga_console_info.u.vesa_lfb.lfb_size =
> +            xbi_efi.vga_console_info.u.vesa_lfb.lfb_base = 
> gop->Mode->FrameBufferBase;
> +            xbi_efi.vga_console_info.u.vesa_lfb.lfb_size =
>                  (gop->Mode->FrameBufferSize + 0xffff) >> 16;
>          }
>      }
>
> -    efi_bs->GetMemoryMap(&efi_memmap_size, NULL, &map_key,
> -                         &efi_mdesc_size, &mdesc_ver);
> -    mbi.mem_upper -= efi_memmap_size;
> -    mbi.mem_upper &= -__alignof__(EFI_MEMORY_DESCRIPTOR);
> -    if ( mbi.mem_upper < xen_phys_start )
> -        blexit(L"Out of static memory");
> -    efi_memmap = (void *)(long)mbi.mem_upper;
> -    status = efi_bs->GetMemoryMap(&efi_memmap_size, efi_memmap, &map_key,
> -                                  &efi_mdesc_size, &mdesc_ver);
> +    efi_bs->GetMemoryMap(&xbi_efi.efi_mmap_size, NULL, &map_key,
> +                        &xbi_efi.efi_mmap_desc_size, &mdesc_ver);
> +    xbi_efi.mem_upper -= xbi_efi.efi_mmap_size;
> +    xbi_efi.mem_upper &= -__alignof__(EFI_MEMORY_DESCRIPTOR);
> +    if ( xbi_efi.mem_upper < xen_phys_start )
> +        blexit(L"Out of static memory\r\n");
> +    xbi_efi.efi_mmap = (void *)(long)xbi_efi.mem_upper;
> +    status = efi_bs->GetMemoryMap(&xbi_efi.efi_mmap_size, xbi_efi.efi_mmap, 
> &map_key,
> +                                  &xbi_efi.efi_mmap_desc_size, &mdesc_ver);
>      if ( EFI_ERROR(status) )
>          PrintErrMesg(L"Cannot obtain memory map", status);
>
>      /* Populate E820 table and check trampoline area availability. */
> -    e = e820map - 1;
> -    for ( i = 0; i < efi_memmap_size; i += efi_mdesc_size )
> +    e = xbi_efi.e820map - 1;
> +    for ( i = 0; i < xbi_efi.efi_mmap_size; i += xbi_efi.efi_mmap_desc_size )
>      {
> -        EFI_MEMORY_DESCRIPTOR *desc = efi_memmap + i;
> +        EFI_MEMORY_DESCRIPTOR *desc = xbi_efi.efi_mmap + i;
>          u64 len = desc->NumberOfPages << EFI_PAGE_SHIFT;
>          u32 type;
>
> @@ -1427,10 +1429,10 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>              type = E820_NVS;
>              break;
>          }
> -        if ( e820nr && type == e->type &&
> +        if ( xbi_efi.e820map_nr && type == e->type &&
>               desc->PhysicalStart == e->addr + e->size )
>              e->size += len;
> -        else if ( !len || e820nr >= E820MAX )
> +        else if ( !len || xbi_efi.e820map_nr >= E820MAX )
>              continue;
>          else
>          {
> @@ -1438,7 +1440,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>              e->addr = desc->PhysicalStart;
>              e->size = len;
>              e->type = type;
> -            ++e820nr;
> +            ++xbi_efi.e820map_nr;
>          }
>      }
>      if ( !trampoline_phys )
> @@ -1457,7 +1459,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>  #ifdef USE_SET_VIRTUAL_ADDRESS_MAP
>      efi_rs = (void *)efi_rs + DIRECTMAP_VIRT_START;
>  #endif
> -    efi_memmap = (void *)efi_memmap + DIRECTMAP_VIRT_START;
> +    xbi_efi.efi_mmap = (void *)xbi_efi.efi_mmap + DIRECTMAP_VIRT_START;
>      efi_fw_vendor = (void *)efi_fw_vendor + DIRECTMAP_VIRT_START;
>
>      relocate_image(__XEN_VIRT_START - xen_phys_start);
> @@ -1491,7 +1493,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>                       [cs] "ir" (__HYPERVISOR_CS),
>                       [ds] "r" (__HYPERVISOR_DS),
>                       [stkoff] "i" (STACK_SIZE - sizeof(struct cpu_info)),
> -                     "D" (&mbi)
> +                     "D" (&xbi_efi)
>                     : "memory" );
>      for( ; ; ); /* not reached */
>  }
> @@ -1557,9 +1559,9 @@ void __init efi_init_memory(void)
>  #endif
>
>      printk(XENLOG_INFO "EFI memory map:\n");
> -    for ( i = 0; i < efi_memmap_size; i += efi_mdesc_size )
> +    for ( i = 0; i < xbi_efi.efi_mmap_size; i += xbi_efi.efi_mmap_desc_size )
>      {
> -        EFI_MEMORY_DESCRIPTOR *desc = efi_memmap + i;
> +        EFI_MEMORY_DESCRIPTOR *desc = xbi_efi.efi_mmap + i;
>          u64 len = desc->NumberOfPages << EFI_PAGE_SHIFT;
>          unsigned long smfn, emfn;
>          unsigned int prot = PAGE_HYPERVISOR;
> @@ -1634,8 +1636,8 @@ void __init efi_init_memory(void)
>      }
>
>  #ifdef USE_SET_VIRTUAL_ADDRESS_MAP
> -    efi_rs->SetVirtualAddressMap(efi_memmap_size, efi_mdesc_size,
> -                                 mdesc_ver, efi_memmap);
> +    efi_rs->SetVirtualAddressMap(xbi_efi.efi_mmap_size, 
> xbi_efi.efi_mmap_desc_size,
> +                                 mdesc_ver, xbi_efi.efi_mmap);
>  #else
>      /* Set up 1:1 page tables to do runtime calls in "physical" mode. */
>      efi_l4_pgtable = alloc_xen_pagetable();
> @@ -1645,9 +1647,9 @@ void __init efi_init_memory(void)
>      copy_mapping(0, max_page, ram_range_valid);
>
>      /* Insert non-RAM runtime mappings inside the direct map. */
> -    for ( i = 0; i < efi_memmap_size; i += efi_mdesc_size )
> +    for ( i = 0; i < xbi_efi.efi_mmap_size; i += xbi_efi.efi_mmap_desc_size )
>      {
> -        const EFI_MEMORY_DESCRIPTOR *desc = efi_memmap + i;
> +        const EFI_MEMORY_DESCRIPTOR *desc = xbi_efi.efi_mmap + i;
>
>          if ( (desc->Attribute & EFI_MEMORY_RUNTIME) &&
>               desc->VirtualStart != INVALID_VIRTUAL_ADDRESS &&
> diff --git a/xen/arch/x86/efi/efi.h b/xen/arch/x86/efi/efi.h
> index a80d5f1..46099de 100644
> --- a/xen/arch/x86/efi/efi.h
> +++ b/xen/arch/x86/efi/efi.h
> @@ -25,9 +25,6 @@ extern const CHAR16 *efi_fw_vendor;
>
>  extern EFI_RUNTIME_SERVICES *efi_rs;
>
> -extern UINTN efi_memmap_size, efi_mdesc_size;
> -extern void *efi_memmap;
> -
>  extern l4_pgentry_t *efi_l4_pgtable;
>
>  extern const struct efi_pci_rom *efi_pci_roms;
> diff --git a/xen/arch/x86/efi/runtime.c b/xen/arch/x86/efi/runtime.c
> index 166852d..3ef4b5b 100644
> --- a/xen/arch/x86/efi/runtime.c
> +++ b/xen/arch/x86/efi/runtime.c
> @@ -5,6 +5,7 @@
>  #include <xen/irq.h>
>  #include <xen/time.h>
>  #include <asm/mc146818rtc.h>
> +#include <asm/xbi.h>
>
>  DEFINE_XEN_GUEST_HANDLE(CHAR16);
>
> @@ -26,25 +27,50 @@ const CHAR16 *__read_mostly efi_fw_vendor;
>  EFI_RUNTIME_SERVICES *__read_mostly efi_rs;
>  static DEFINE_SPINLOCK(efi_rs_lock);
>
> -UINTN __read_mostly efi_memmap_size;
> -UINTN __read_mostly efi_mdesc_size;
> -void *__read_mostly efi_memmap;
> -
>  UINT64 __read_mostly efi_boot_max_var_store_size;
>  UINT64 __read_mostly efi_boot_remain_var_store_size;
>  UINT64 __read_mostly efi_boot_max_var_size;
>
> -struct efi __read_mostly efi = {
> -       .acpi   = EFI_INVALID_TABLE_ADDR,
> -       .acpi20 = EFI_INVALID_TABLE_ADDR,
> -       .mps    = EFI_INVALID_TABLE_ADDR,
> -       .smbios = EFI_INVALID_TABLE_ADDR,
> -};
> -
>  l4_pgentry_t *__read_mostly efi_l4_pgtable;
>
>  const struct efi_pci_rom *__read_mostly efi_pci_roms;
>
> +extern struct e820entry e820map[];
> +extern struct edd_info boot_edd_info[];
> +extern struct mbr_signature boot_mbr_signature[];
> +
> +extern unsigned char boot_edid_info[128];
> +
> +static boot_module_t __read_mostly xbi_mods[3] = {};
> +
> +xbi_t __read_mostly xbi_efi = {
> +    .boot_loader_name = "EFI",
> +    .cmdline = NULL,
> +    .mmap_type = "EFI",
> +    .mem_upper = 0,
> +    .e820map_nr = 0,
> +    .e820map = e820map,
> +    .efi_mmap_size = 0,
> +    .efi_mmap_desc_size = 0,
> +    .efi_mmap = NULL,
> +    .mps = EFI_INVALID_TABLE_ADDR,
> +    .acpi = EFI_INVALID_TABLE_ADDR,
> +    .acpi20 = EFI_INVALID_TABLE_ADDR,
> +    .smbios = EFI_INVALID_TABLE_ADDR,
> +    .efi_system_table = NULL,
> +    .vga_console_info = {},
> +    .edid_caps = 0,
> +    .edid_info = boot_edid_info,
> +    .edd_info_nr = 0,
> +    .edd_info = boot_edd_info,
> +    .mbr_signature_nr = 0,
> +    .mbr_signature = boot_mbr_signature,
> +    .mods_nr = 0,
> +    .mods = xbi_mods,
> +    .warn_msg = NULL,
> +    .err_msg = NULL
> +};
> +
>  unsigned long efi_rs_enter(void)
>  {
>      static const u16 fcw = FCW_DEFAULT;
> @@ -173,9 +199,9 @@ int efi_get_info(uint32_t idx, union xenpf_efi_info *info)
>          }
>          break;
>      case XEN_FW_EFI_MEM_INFO:
> -        for ( i = 0; i < efi_memmap_size; i += efi_mdesc_size )
> +        for ( i = 0; i < xbi->efi_mmap_size; i += xbi->efi_mmap_desc_size )
>          {
> -            EFI_MEMORY_DESCRIPTOR *desc = efi_memmap + i;
> +            EFI_MEMORY_DESCRIPTOR *desc = xbi->efi_mmap + i;
>              u64 len = desc->NumberOfPages << EFI_PAGE_SHIFT;
>
>              if ( info->mem.addr >= desc->PhysicalStart &&
> diff --git a/xen/arch/x86/init_xbi.c b/xen/arch/x86/init_xbi.c
> new file mode 100644
> index 0000000..aebb9cc
> --- /dev/null
> +++ b/xen/arch/x86/init_xbi.c
> @@ -0,0 +1,254 @@
> +/*
> + * Copyright (c) 2013, 2014 Oracle Co., Daniel Kiper
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +/*
> + * Some ideas are taken (out) from xen/arch/x86/boot/reloc.c,
> + * xen/arch/x86/efi/boot.c and xen/arch/x86/setup.c.
> + */
> +
> +#include <xen/types.h>
> +#include <xen/cache.h>
> +#include <xen/efi.h>
> +#include <xen/init.h>
> +#include <xen/multiboot.h>
> +
> +#include <asm/e820.h>
> +#include <asm/mbd.h>
> +#include <asm/page.h>
> +#include <asm/xbi.h>
> +
> +struct boot_video_info {
> +    u8  orig_x;             /* 0x00 */
> +    u8  orig_y;             /* 0x01 */
> +    u8  orig_video_mode;    /* 0x02 */
> +    u8  orig_video_cols;    /* 0x03 */
> +    u8  orig_video_lines;   /* 0x04 */
> +    u8  orig_video_isVGA;   /* 0x05 */
> +    u16 orig_video_points;  /* 0x06 */
> +
> +    /* VESA graphic mode -- linear frame buffer */
> +    u32 capabilities;       /* 0x08 */
> +    u16 lfb_linelength;     /* 0x0c */
> +    u16 lfb_width;          /* 0x0e */
> +    u16 lfb_height;         /* 0x10 */
> +    u16 lfb_depth;          /* 0x12 */
> +    u32 lfb_base;           /* 0x14 */
> +    u32 lfb_size;           /* 0x18 */
> +    u8  red_size;           /* 0x1c */
> +    u8  red_pos;            /* 0x1d */
> +    u8  green_size;         /* 0x1e */
> +    u8  green_pos;          /* 0x1f */
> +    u8  blue_size;          /* 0x20 */
> +    u8  blue_pos;           /* 0x21 */
> +    u8  rsvd_size;          /* 0x22 */
> +    u8  rsvd_pos;           /* 0x23 */
> +    u16 vesapm_seg;         /* 0x24 */
> +    u16 vesapm_off;         /* 0x26 */
> +    u16 vesa_attrib;        /* 0x28 */
> +};
> +
> +/* These symbols live in the boot trampoline. Access via bootsym(). */
> +extern struct e820entry e820map[];
> +extern int e820nr;
> +extern unsigned int lowmem_kb, highmem_kb;
> +
> +extern struct boot_video_info boot_vid_info;
> +
> +extern unsigned short boot_edid_caps;
> +extern unsigned char boot_edid_info[128];
> +
> +extern struct edd_info boot_edd_info[];
> +extern u8 boot_edd_info_nr;
> +
> +extern struct mbr_signature boot_mbr_signature[];
> +extern u8 boot_mbr_signature_nr;
> +
> +static xbi_t __read_mostly xbi_mb = {
> +    .boot_loader_name = "UNKNOWN",
> +    .cmdline = NULL,
> +    .mmap_type = NULL,
> +    .mem_upper = 0,
> +    .e820map_nr = 0,
> +    .e820map = NULL,
> +    .efi_mmap_size = 0,
> +    .efi_mmap_desc_size = 0,
> +    .efi_mmap = NULL,
> +    .mps = EFI_INVALID_TABLE_ADDR,
> +    .acpi = EFI_INVALID_TABLE_ADDR,
> +    .acpi20 = EFI_INVALID_TABLE_ADDR,
> +    .smbios = EFI_INVALID_TABLE_ADDR,
> +    .efi_system_table = NULL,
> +    .vga_console_info = {},
> +    .edid_caps = 0,
> +    .edid_info = NULL,
> +    .edd_info_nr = 0,
> +    .edd_info = NULL,
> +    .mbr_signature_nr = 0,
> +    .mbr_signature = NULL,
> +    .mods_nr = 0,
> +    .mods = NULL,
> +    .warn_msg = NULL,
> +    .err_msg = NULL
> +};
> +
> +#define e820_raw bootsym(e820map)
> +#define e820_raw_nr bootsym(e820nr)
> +
> +static void __init init_mmap(xbi_t *xbi, mbd_t *mbd)
> +{
> +    int bytes = 0;
> +    memory_map_t *map;
> +
> +    if ( e820_raw_nr )
> +        xbi->mmap_type = "Xen-e820";
> +    else if ( mbd->mmap_size )
> +    {
> +        xbi->mmap_type = "Multiboot-e820";
> +
> +        while ( (bytes < mbd->mmap_size) && (e820_raw_nr < E820MAX) )
> +        {
> +            /*
> +             * This is a gross workaround for a BIOS bug. Some bootloaders do
> +             * not write e820 map entries into pre-zeroed memory. This is
> +             * okay if the BIOS fills in all fields of the map entry, but
> +             * some broken BIOSes do not bother to write the high word of
> +             * the length field if the length is smaller than 4GB. We
> +             * detect and fix this by flagging sections below 4GB that
> +             * appear to be larger than 4GB in size.
> +             */
> +            map = __va(mbd->mmap + bytes);
> +
> +            if ( !map->base_addr_high && map->length_high )
> +            {
> +                map->length_high = 0;
> +                xbi->warn_msg = "WARNING: Buggy e820 map detected and fixed "
> +                                "(truncated length fields).\n";
> +            }
> +
> +            e820_raw[e820_raw_nr].addr =
> +                ((u64)map->base_addr_high << 32) | (u64)map->base_addr_low;
> +            e820_raw[e820_raw_nr].size =
> +                ((u64)map->length_high << 32) | (u64)map->length_low;
> +            e820_raw[e820_raw_nr].type = map->type;
> +            e820_raw_nr++;
> +
> +            bytes += map->size + 4;
> +        }
> +    }
> +    else if ( bootsym(lowmem_kb) )
> +    {
> +        xbi->mmap_type = "Xen-e801";
> +
> +        e820_raw[0].addr = 0;
> +        e820_raw[0].size = bootsym(lowmem_kb) << 10;
> +        e820_raw[0].type = E820_RAM;
> +        e820_raw[1].addr = 0x100000;
> +        e820_raw[1].size = bootsym(highmem_kb) << 10;
> +        e820_raw[1].type = E820_RAM;
> +        e820_raw_nr = 2;
> +    }
> +    else if ( mbd->mem_lower || mbd->mem_upper )
> +    {
> +        xbi->mmap_type = "Multiboot-e801";
> +
> +        e820_raw[0].addr = 0;
> +        e820_raw[0].size = mbd->mem_lower << 10;
> +        e820_raw[0].type = E820_RAM;
> +        e820_raw[1].addr = 0x100000;
> +        e820_raw[1].size = mbd->mem_upper << 10;
> +        e820_raw[1].type = E820_RAM;
> +        e820_raw_nr = 2;
> +    }
> +    else
> +    {
> +        xbi->err_msg = "Bootloader provided no memory information.\n";
> +        return;
> +    }
> +
> +    xbi->mem_upper = mbd->mem_upper;
> +
> +    xbi->e820map_nr = e820_raw_nr;
> +    xbi->e820map = e820_raw;
> +}
> +
> +static void __init init_video_info(xbi_t *xbi)
> +{
> +    struct boot_video_info *bvi = &bootsym(boot_vid_info);
> +
> +    if ( (bvi->orig_video_isVGA == 1) && (bvi->orig_video_mode == 3) )
> +    {
> +        xbi->vga_console_info.video_type = XEN_VGATYPE_TEXT_MODE_3;
> +        xbi->vga_console_info.u.text_mode_3.font_height = 
> bvi->orig_video_points;
> +        xbi->vga_console_info.u.text_mode_3.cursor_x = bvi->orig_x;
> +        xbi->vga_console_info.u.text_mode_3.cursor_y = bvi->orig_y;
> +        xbi->vga_console_info.u.text_mode_3.rows = bvi->orig_video_lines;
> +        xbi->vga_console_info.u.text_mode_3.columns = bvi->orig_video_cols;
> +    }
> +    else if ( bvi->orig_video_isVGA == 0x23 )
> +    {
> +        xbi->vga_console_info.video_type = XEN_VGATYPE_VESA_LFB;
> +        xbi->vga_console_info.u.vesa_lfb.width = bvi->lfb_width;
> +        xbi->vga_console_info.u.vesa_lfb.height = bvi->lfb_height;
> +        xbi->vga_console_info.u.vesa_lfb.bytes_per_line = 
> bvi->lfb_linelength;
> +        xbi->vga_console_info.u.vesa_lfb.bits_per_pixel = bvi->lfb_depth;
> +        xbi->vga_console_info.u.vesa_lfb.lfb_base = bvi->lfb_base;
> +        xbi->vga_console_info.u.vesa_lfb.lfb_size = bvi->lfb_size;
> +        xbi->vga_console_info.u.vesa_lfb.red_pos = bvi->red_pos;
> +        xbi->vga_console_info.u.vesa_lfb.red_size = bvi->red_size;
> +        xbi->vga_console_info.u.vesa_lfb.green_pos = bvi->green_pos;
> +        xbi->vga_console_info.u.vesa_lfb.green_size = bvi->green_size;
> +        xbi->vga_console_info.u.vesa_lfb.blue_pos = bvi->blue_pos;
> +        xbi->vga_console_info.u.vesa_lfb.blue_size = bvi->blue_size;
> +        xbi->vga_console_info.u.vesa_lfb.rsvd_pos = bvi->rsvd_pos;
> +        xbi->vga_console_info.u.vesa_lfb.rsvd_size = bvi->rsvd_size;
> +        xbi->vga_console_info.u.vesa_lfb.gbl_caps = bvi->capabilities;
> +        xbi->vga_console_info.u.vesa_lfb.mode_attrs = bvi->vesa_attrib;
> +    }
> +
> +    xbi->edid_caps = bootsym(boot_edid_caps);
> +    xbi->edid_info = bootsym(boot_edid_info);
> +}
> +
> +xbi_t __init *__init_xbi(u32 mbd_ptr)
> +{
> +    mbd_t *mbd = __va(mbd_ptr);
> +
> +    if ( mbd->boot_loader_name )
> +        xbi_mb.boot_loader_name = __va(mbd->boot_loader_name);
> +
> +    if ( mbd->cmdline )
> +        xbi_mb.cmdline = __va(mbd->cmdline);
> +
> +    init_mmap(&xbi_mb, mbd);
> +
> +    if ( xbi_mb.err_msg )
> +        goto err;
> +
> +    init_video_info(&xbi_mb);
> +
> +    xbi_mb.edd_info_nr = bootsym(boot_edd_info_nr);
> +    xbi_mb.edd_info = bootsym(boot_edd_info);
> +
> +    xbi_mb.mbr_signature_nr = bootsym(boot_mbr_signature_nr);
> +    xbi_mb.mbr_signature = bootsym(boot_mbr_signature);
> +
> +    xbi_mb.mods_nr = mbd->mods_nr;
> +    xbi_mb.mods = __va(mbd->mods);
> +
> +err:
> +    return &xbi_mb;
> +}
> diff --git a/xen/arch/x86/microcode.c b/xen/arch/x86/microcode.c
> index 091d5d1..9cabf0a 100644
> --- a/xen/arch/x86/microcode.c
> +++ b/xen/arch/x86/microcode.c
> @@ -40,8 +40,8 @@
>  #include <asm/setup.h>
>  #include <asm/microcode.h>
>
> -static module_t __initdata ucode_mod;
> -static void *(*__initdata ucode_mod_map)(const module_t *);
> +static boot_module_t __initdata ucode_mod;
> +static void *(*__initdata ucode_mod_map)(const boot_module_t *);
>  static signed int __initdata ucode_mod_idx;
>  static bool_t __initdata ucode_mod_forced;
>  static cpumask_t __initdata init_mask;
> @@ -94,10 +94,9 @@ custom_param("ucode", parse_ucode);
>
>  void __init microcode_scan_module(
>      unsigned long *module_map,
> -    const multiboot_info_t *mbi,
> -    void *(*bootmap)(const module_t *))
> +    const xbi_t *xbi,
> +    void *(*bootmap)(const boot_module_t *))
>  {
> -    module_t *mod = (module_t *)__va(mbi->mods_addr);
>      uint64_t *_blob_start;
>      unsigned long _blob_size;
>      struct cpio_data cd;
> @@ -119,13 +118,13 @@ void __init microcode_scan_module(
>      /*
>       * Try all modules and see whichever could be the microcode blob.
>       */
> -    for ( i = 1 /* Ignore dom0 kernel */; i < mbi->mods_count; i++ )
> +    for ( i = 1 /* Ignore dom0 kernel */; i < xbi->mods_nr; i++ )
>      {
>          if ( !test_bit(i, module_map) )
>              continue;
>
> -        _blob_start = bootmap(&mod[i]);
> -        _blob_size = mod[i].mod_end;
> +        _blob_start = bootmap(&xbi->mods[i]);
> +        _blob_size = xbi->mods[i].end;
>          if ( !_blob_start )
>          {
>              printk("Could not map multiboot module #%d (size: %ld)\n",
> @@ -165,21 +164,19 @@ err:
>  }
>  void __init microcode_grab_module(
>      unsigned long *module_map,
> -    const multiboot_info_t *mbi,
> -    void *(*map)(const module_t *))
> +    const xbi_t *xbi,
> +    void *(*map)(const boot_module_t *))
>  {
> -    module_t *mod = (module_t *)__va(mbi->mods_addr);
> -
>      if ( ucode_mod_idx < 0 )
> -        ucode_mod_idx += mbi->mods_count;
> -    if ( ucode_mod_idx <= 0 || ucode_mod_idx >= mbi->mods_count ||
> +        ucode_mod_idx += xbi->mods_nr;
> +    if ( ucode_mod_idx <= 0 || ucode_mod_idx >= xbi->mods_nr ||
>           !__test_and_clear_bit(ucode_mod_idx, module_map) )
>          goto scan;
> -    ucode_mod = mod[ucode_mod_idx];
> +    ucode_mod = xbi->mods[ucode_mod_idx];
>      ucode_mod_map = map;
>  scan:
>      if ( ucode_scan )
> -        microcode_scan_module(module_map, mbi, map);
> +        microcode_scan_module(module_map, xbi, map);
>  }
>
>  const struct microcode_ops *microcode_ops;
> @@ -345,7 +342,7 @@ int microcode_update(XEN_GUEST_HANDLE_PARAM(const_void) 
> buf, unsigned long len)
>  static void __init _do_microcode_update(unsigned long data)
>  {
>      void *_data = (void *)data;
> -    size_t len = ucode_blob.size ? ucode_blob.size : ucode_mod.mod_end;
> +    size_t len = ucode_blob.size ? ucode_blob.size : ucode_mod.end;
>
>      microcode_update_cpu(_data, len);
>      cpumask_set_cpu(smp_processor_id(), &init_mask);
> @@ -360,7 +357,7 @@ static int __init microcode_init(void)
>      if ( !microcode_ops )
>          return 0;
>
> -    if ( !ucode_mod.mod_end && !ucode_blob.size )
> +    if ( !ucode_mod.end && !ucode_blob.size )
>          return 0;
>
>      data = ucode_blob.size ? ucode_blob.data : ucode_mod_map(&ucode_mod);
> @@ -414,7 +411,7 @@ static int __init microcode_presmp_init(void)
>  {
>      if ( microcode_ops )
>      {
> -        if ( ucode_mod.mod_end || ucode_blob.size )
> +        if ( ucode_mod.end || ucode_blob.size )
>          {
>              void *data;
>              size_t len;
> @@ -427,7 +424,7 @@ static int __init microcode_presmp_init(void)
>              }
>              else
>              {
> -                len = ucode_mod.mod_end;
> +                len = ucode_mod.end;
>                  data = ucode_mod_map(&ucode_mod);
>              }
>              if ( data )
> @@ -447,7 +444,7 @@ static int __init microcode_presmp_init(void)
>                      ucode_blob.data = NULL;
>                  }
>                  else
> -                    ucode_mod.mod_end = 0;
> +                    ucode_mod.end = 0;
>              }
>          }
>
> diff --git a/xen/arch/x86/mpparse.c b/xen/arch/x86/mpparse.c
> index a38e016..a8bcb14 100644
> --- a/xen/arch/x86/mpparse.c
> +++ b/xen/arch/x86/mpparse.c
> @@ -29,6 +29,7 @@
>  #include <asm/mpspec.h>
>  #include <asm/io_apic.h>
>  #include <asm/setup.h>
> +#include <asm/xbi.h>
>
>  #include <mach_apic.h>
>  #include <mach_mpparse.h>
> @@ -676,18 +677,18 @@ static void __init efi_check_config(void)
>  {
>         struct intel_mp_floating *mpf;
>
> -       if (efi.mps == EFI_INVALID_TABLE_ADDR)
> +       if (xbi->mps == EFI_INVALID_TABLE_ADDR)
>                 return;
>
> -       __set_fixmap(FIX_EFI_MPF, PFN_DOWN(efi.mps), __PAGE_HYPERVISOR);
> -       mpf = (void *)fix_to_virt(FIX_EFI_MPF) + ((long)efi.mps & 
> (PAGE_SIZE-1));
> +       __set_fixmap(FIX_EFI_MPF, PFN_DOWN(xbi->mps), __PAGE_HYPERVISOR);
> +       mpf = (void *)fix_to_virt(FIX_EFI_MPF) + ((long)xbi->mps & 
> (PAGE_SIZE-1));
>
>         if (memcmp(mpf->mpf_signature, "_MP_", 4) == 0 &&
>             mpf->mpf_length == 1 &&
>             mpf_checksum((void *)mpf, 16) &&
>             (mpf->mpf_specification == 1 || mpf->mpf_specification == 4)) {
>                 smp_found_config = 1;
> -               printk(KERN_INFO "SMP MP-table at %08lx\n", efi.mps);
> +               printk(KERN_INFO "SMP MP-table at %08lx\n", xbi->mps);
>                 mpf_found = mpf;
>         }
>         else
> diff --git a/xen/arch/x86/platform_hypercall.c 
> b/xen/arch/x86/platform_hypercall.c
> index 2162811..bbfcfd2 100644
> --- a/xen/arch/x86/platform_hypercall.c
> +++ b/xen/arch/x86/platform_hypercall.c
> @@ -30,6 +30,7 @@
>  #include <asm/mtrr.h>
>  #include <asm/io_apic.h>
>  #include <asm/setup.h>
> +#include <asm/xbi.h>
>  #include "cpu/mtrr/mtrr.h"
>  #include <xsm/xsm.h>
>
> @@ -208,10 +209,10 @@ ret_t 
> do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op)
>              u16 length;
>
>              ret = -ESRCH;
> -            if ( op->u.firmware_info.index >= bootsym(boot_edd_info_nr) )
> +            if ( op->u.firmware_info.index >= xbi->edd_info_nr )
>                  break;
>
> -            info = bootsym(boot_edd_info) + op->u.firmware_info.index;
> +            info = xbi->edd_info + op->u.firmware_info.index;
>
>              /* Transfer the EDD info block. */
>              ret = -EFAULT;
> @@ -247,10 +248,10 @@ ret_t 
> do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op)
>              const struct mbr_signature *sig;
>
>              ret = -ESRCH;
> -            if ( op->u.firmware_info.index >= bootsym(boot_mbr_signature_nr) 
> )
> +            if ( op->u.firmware_info.index >= xbi->mbr_signature_nr )
>                  break;
>
> -            sig = bootsym(boot_mbr_signature) + op->u.firmware_info.index;
> +            sig = xbi->mbr_signature + op->u.firmware_info.index;
>
>              op->u.firmware_info.u.disk_mbr_signature.device = sig->device;
>              op->u.firmware_info.u.disk_mbr_signature.mbr_signature =
> @@ -265,13 +266,11 @@ ret_t 
> do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op)
>              ret = -ESRCH;
>              if ( op->u.firmware_info.index != 0 )
>                  break;
> -            if ( *(u32 *)bootsym(boot_edid_info) == 0x13131313 )
> +            if ( *(u32 *)xbi->edid_info == 0x13131313 )
>                  break;
>
> -            op->u.firmware_info.u.vbeddc_info.capabilities =
> -                bootsym(boot_edid_caps);
> -            op->u.firmware_info.u.vbeddc_info.edid_transfer_time =
> -                bootsym(boot_edid_caps) >> 8;
> +            op->u.firmware_info.u.vbeddc_info.capabilities = xbi->edid_caps;
> +            op->u.firmware_info.u.vbeddc_info.edid_transfer_time = 
> xbi->edid_caps >> 8;
>
>              ret = 0;
>              if ( __copy_field_to_guest(u_xenpf_op, op, u.firmware_info.
> @@ -279,7 +278,7 @@ ret_t 
> do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op)
>                   __copy_field_to_guest(u_xenpf_op, op, u.firmware_info.
>                                         u.vbeddc_info.edid_transfer_time) ||
>                   copy_to_compat(op->u.firmware_info.u.vbeddc_info.edid,
> -                                bootsym(boot_edid_info), 128) )
> +                                xbi->edid_info, 128) )
>                  ret = -EFAULT;
>              break;
>          case XEN_FW_EFI_INFO:
> diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
> index 599cf04..b3bf26a 100644
> --- a/xen/arch/x86/setup.c
> +++ b/xen/arch/x86/setup.c
> @@ -12,7 +12,6 @@
>  #include <xen/console.h>
>  #include <xen/serial.h>
>  #include <xen/trace.h>
> -#include <xen/multiboot.h>
>  #include <xen/domain_page.h>
>  #include <xen/version.h>
>  #include <xen/gdbstub.h>
> @@ -49,6 +48,7 @@
>  #include <xen/cpu.h>
>  #include <asm/nmi.h>
>  #include <asm/alternative.h>
> +#include <asm/xbi.h>
>
>  /* opt_nosmp: If true, secondary processors are ignored. */
>  static bool_t __initdata opt_nosmp;
> @@ -93,6 +93,8 @@ unsigned long __initdata highmem_start;
>  size_param("highmem-start", highmem_start);
>  #endif
>
> +xbi_t *xbi;
> +
>  cpumask_t __read_mostly cpu_present_map;
>
>  unsigned long __read_mostly xen_phys_start;
> @@ -138,7 +140,7 @@ static void __init parse_acpi_param(char *s)
>      }
>  }
>
> -static const module_t *__initdata initial_images;
> +static const boot_module_t *__initdata initial_images;
>  static unsigned int __initdata nr_initial_images;
>
>  unsigned long __init initial_images_nrpages(void)
> @@ -147,7 +149,7 @@ unsigned long __init initial_images_nrpages(void)
>      unsigned int i;
>
>      for ( nr = i = 0; i < nr_initial_images; ++i )
> -        nr += PFN_UP(initial_images[i].mod_end);
> +        nr += PFN_UP(initial_images[i].end);
>
>      return nr;
>  }
> @@ -158,10 +160,10 @@ void __init discard_initial_images(void)
>
>      for ( i = 0; i < nr_initial_images; ++i )
>      {
> -        uint64_t start = (uint64_t)initial_images[i].mod_start << PAGE_SHIFT;
> +        uint64_t start = (uint64_t)initial_images[i].start << PAGE_SHIFT;
>
>          init_domheap_pages(start,
> -                           start + PAGE_ALIGN(initial_images[i].mod_end));
> +                           start + PAGE_ALIGN(initial_images[i].end));
>      }
>
>      nr_initial_images = 0;
> @@ -262,14 +264,14 @@ static void __init normalise_cpu_order(void)
>   * Ensure a given physical memory range is present in the bootstrap mappings.
>   * Use superpage mappings to ensure that pagetable memory needn't be 
> allocated.
>   */
> -static void *__init bootstrap_map(const module_t *mod)
> +static void *__init bootstrap_map(const boot_module_t *mod)
>  {
>      static unsigned long __initdata map_cur = BOOTSTRAP_MAP_BASE;
>      uint64_t start, end, mask = (1L << L2_PAGETABLE_SHIFT) - 1;
>      void *ret;
>
>      if ( system_state != SYS_STATE_early_boot )
> -        return mod ? mfn_to_virt(mod->mod_start) : NULL;
> +        return mod ? mfn_to_virt(mod->start) : NULL;
>
>      if ( !mod )
>      {
> @@ -278,8 +280,8 @@ static void *__init bootstrap_map(const module_t *mod)
>          return NULL;
>      }
>
> -    start = (uint64_t)mod->mod_start << PAGE_SHIFT;
> -    end = start + mod->mod_end;
> +    start = (uint64_t)mod->start << PAGE_SHIFT;
> +    end = start + mod->end;
>      if ( start >= end )
>          return NULL;
>
> @@ -309,25 +311,25 @@ static void *__init move_memory(
>
>      while ( size )
>      {
> -        module_t mod;
> +        boot_module_t mod;
>          unsigned int soffs = src & mask;
>          unsigned int doffs = dst & mask;
>          unsigned int sz;
>          void *d, *s;
>
> -        mod.mod_start = (src - soffs) >> PAGE_SHIFT;
> -        mod.mod_end = soffs + size;
> -        if ( mod.mod_end > blksz )
> -            mod.mod_end = blksz;
> -        sz = mod.mod_end - soffs;
> +        mod.start = (src - soffs) >> PAGE_SHIFT;
> +        mod.end = soffs + size;
> +        if ( mod.end > blksz )
> +            mod.end = blksz;
> +        sz = mod.end - soffs;
>          s = bootstrap_map(&mod);
>
> -        mod.mod_start = (dst - doffs) >> PAGE_SHIFT;
> -        mod.mod_end = doffs + size;
> -        if ( mod.mod_end > blksz )
> -            mod.mod_end = blksz;
> -        if ( sz > mod.mod_end - doffs )
> -            sz = mod.mod_end - doffs;
> +        mod.start = (dst - doffs) >> PAGE_SHIFT;
> +        mod.end = doffs + size;
> +        if ( mod.end > blksz )
> +            mod.end = blksz;
> +        if ( sz > mod.end - doffs )
> +            sz = mod.end - doffs;
>          d = bootstrap_map(&mod);
>
>          memmove(d + doffs, s + soffs, sz);
> @@ -346,7 +348,7 @@ static void *__init move_memory(
>  }
>
>  static uint64_t __init consider_modules(
> -    uint64_t s, uint64_t e, uint32_t size, const module_t *mod,
> +    uint64_t s, uint64_t e, uint32_t size, const boot_module_t *mod,
>      unsigned int nr_mods, unsigned int this_mod)
>  {
>      unsigned int i;
> @@ -356,8 +358,8 @@ static uint64_t __init consider_modules(
>
>      for ( i = 0; i < nr_mods ; ++i )
>      {
> -        uint64_t start = (uint64_t)mod[i].mod_start << PAGE_SHIFT;
> -        uint64_t end = start + PAGE_ALIGN(mod[i].mod_end);
> +        uint64_t start = (uint64_t)mod[i].start << PAGE_SHIFT;
> +        uint64_t end = start + PAGE_ALIGN(mod[i].end);
>
>          if ( i == this_mod )
>              continue;
> @@ -406,76 +408,6 @@ void set_pdx_range(unsigned long smfn, unsigned long 
> emfn)
>  /* A temporary copy of the e820 map that we can mess with during bootstrap. 
> */
>  static struct e820map __initdata boot_e820;
>
> -struct boot_video_info {
> -    u8  orig_x;             /* 0x00 */
> -    u8  orig_y;             /* 0x01 */
> -    u8  orig_video_mode;    /* 0x02 */
> -    u8  orig_video_cols;    /* 0x03 */
> -    u8  orig_video_lines;   /* 0x04 */
> -    u8  orig_video_isVGA;   /* 0x05 */
> -    u16 orig_video_points;  /* 0x06 */
> -
> -    /* VESA graphic mode -- linear frame buffer */
> -    u32 capabilities;       /* 0x08 */
> -    u16 lfb_linelength;     /* 0x0c */
> -    u16 lfb_width;          /* 0x0e */
> -    u16 lfb_height;         /* 0x10 */
> -    u16 lfb_depth;          /* 0x12 */
> -    u32 lfb_base;           /* 0x14 */
> -    u32 lfb_size;           /* 0x18 */
> -    u8  red_size;           /* 0x1c */
> -    u8  red_pos;            /* 0x1d */
> -    u8  green_size;         /* 0x1e */
> -    u8  green_pos;          /* 0x1f */
> -    u8  blue_size;          /* 0x20 */
> -    u8  blue_pos;           /* 0x21 */
> -    u8  rsvd_size;          /* 0x22 */
> -    u8  rsvd_pos;           /* 0x23 */
> -    u16 vesapm_seg;         /* 0x24 */
> -    u16 vesapm_off;         /* 0x26 */
> -    u16 vesa_attrib;        /* 0x28 */
> -};
> -extern struct boot_video_info boot_vid_info;
> -
> -static void __init parse_video_info(void)
> -{
> -    struct boot_video_info *bvi = &bootsym(boot_vid_info);
> -
> -    /* The EFI loader fills vga_console_info directly. */
> -    if ( efi_enabled )
> -        return;
> -
> -    if ( (bvi->orig_video_isVGA == 1) && (bvi->orig_video_mode == 3) )
> -    {
> -        vga_console_info.video_type = XEN_VGATYPE_TEXT_MODE_3;
> -        vga_console_info.u.text_mode_3.font_height = bvi->orig_video_points;
> -        vga_console_info.u.text_mode_3.cursor_x = bvi->orig_x;
> -        vga_console_info.u.text_mode_3.cursor_y = bvi->orig_y;
> -        vga_console_info.u.text_mode_3.rows = bvi->orig_video_lines;
> -        vga_console_info.u.text_mode_3.columns = bvi->orig_video_cols;
> -    }
> -    else if ( bvi->orig_video_isVGA == 0x23 )
> -    {
> -        vga_console_info.video_type = XEN_VGATYPE_VESA_LFB;
> -        vga_console_info.u.vesa_lfb.width = bvi->lfb_width;
> -        vga_console_info.u.vesa_lfb.height = bvi->lfb_height;
> -        vga_console_info.u.vesa_lfb.bytes_per_line = bvi->lfb_linelength;
> -        vga_console_info.u.vesa_lfb.bits_per_pixel = bvi->lfb_depth;
> -        vga_console_info.u.vesa_lfb.lfb_base = bvi->lfb_base;
> -        vga_console_info.u.vesa_lfb.lfb_size = bvi->lfb_size;
> -        vga_console_info.u.vesa_lfb.red_pos = bvi->red_pos;
> -        vga_console_info.u.vesa_lfb.red_size = bvi->red_size;
> -        vga_console_info.u.vesa_lfb.green_pos = bvi->green_pos;
> -        vga_console_info.u.vesa_lfb.green_size = bvi->green_size;
> -        vga_console_info.u.vesa_lfb.blue_pos = bvi->blue_pos;
> -        vga_console_info.u.vesa_lfb.blue_size = bvi->blue_size;
> -        vga_console_info.u.vesa_lfb.rsvd_pos = bvi->rsvd_pos;
> -        vga_console_info.u.vesa_lfb.rsvd_size = bvi->rsvd_size;
> -        vga_console_info.u.vesa_lfb.gbl_caps = bvi->capabilities;
> -        vga_console_info.u.vesa_lfb.mode_attrs = bvi->vesa_attrib;
> -    }
> -}
> -
>  static void __init kexec_reserve_area(struct e820map *e820)
>  {
>      unsigned long kdump_start = kexec_crash_area.start;
> @@ -540,15 +472,12 @@ static char * __init cmdline_cook(char *p, char 
> *loader_name)
>      return p;
>  }
>
> -void __init noreturn __start_xen(unsigned long mbi_p)
> +void __init noreturn __start_xen(xbi_t *xbi_start)
>  {
> -    char *memmap_type = NULL;
> -    char *cmdline, *kextra, *loader;
> +    char *cmdline, *kextra;
>      unsigned int initrdidx, domcr_flags = DOMCRF_s3_integrity;
> -    multiboot_info_t *mbi = __va(mbi_p);
> -    module_t *mod = (module_t *)__va(mbi->mods_addr);
>      unsigned long nr_pages, raw_max_page, modules_headroom, *module_map;
> -    int i, j, e820_warn = 0, bytes = 0;
> +    int i, j;
>      bool_t acpi_boot_table_init_done = 0;
>      struct domain *dom0;
>      struct ns16550_defaults ns16550 = {
> @@ -573,13 +502,16 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>
>      /* Full exception support from here on in. */
>
> -    loader = (mbi->flags & MBI_LOADERNAME)
> -        ? (char *)__va(mbi->boot_loader_name) : "unknown";
> +    if ( !efi_enabled )
> +        xbi = xbi_start;
> +    else
> +    {
> +        xbi = __va(xbi_start);
> +        xbi->cmdline = __va(xbi->cmdline);
> +    }
>
>      /* Parse the command-line options. */
> -    cmdline = cmdline_cook((mbi->flags & MBI_CMDLINE) ?
> -                           __va(mbi->cmdline) : NULL,
> -                           loader);
> +    cmdline = cmdline_cook(xbi->cmdline, xbi->boot_loader_name);
>      if ( (kextra = strstr(cmdline, " -- ")) != NULL )
>      {
>          /*
> @@ -597,8 +529,6 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>       * allocing any xenheap structures wanted in lower memory. */
>      kexec_early_calculations();
>
> -    parse_video_info();
> -
>      if ( cpu_has_efer )
>          rdmsrl(MSR_EFER, this_cpu(efer));
>      asm volatile ( "mov %%cr4,%0" : "=r" (this_cpu(cr4)) );
> @@ -613,27 +543,33 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>      ehci_dbgp_init();
>      console_init_preirq();
>
> -    printk("Bootloader: %s\n", loader);
> +    if ( xbi->err_msg )
> +        panic(xbi->err_msg);
> +
> +    if ( xbi->warn_msg )
> +        printk(xbi->warn_msg);
> +
> +    printk("Bootloader: %s\n", xbi->boot_loader_name);
>
> -    printk("Command line: %s\n", cmdline);
> +    printk("Command line: %s\n", xbi->cmdline ? xbi->cmdline : "NONE");
>
>      printk("Video information:\n");
>
>      /* Print VGA display mode information. */
> -    switch ( vga_console_info.video_type )
> +    switch ( xbi->vga_console_info.video_type )
>      {
>      case XEN_VGATYPE_TEXT_MODE_3:
>          printk(" VGA is text mode %dx%d, font 8x%d\n",
> -               vga_console_info.u.text_mode_3.columns,
> -               vga_console_info.u.text_mode_3.rows,
> -               vga_console_info.u.text_mode_3.font_height);
> +               xbi->vga_console_info.u.text_mode_3.columns,
> +               xbi->vga_console_info.u.text_mode_3.rows,
> +               xbi->vga_console_info.u.text_mode_3.font_height);
>          break;
>      case XEN_VGATYPE_VESA_LFB:
>      case XEN_VGATYPE_EFI_LFB:
>          printk(" VGA is graphics mode %dx%d, %d bpp\n",
> -               vga_console_info.u.vesa_lfb.width,
> -               vga_console_info.u.vesa_lfb.height,
> -               vga_console_info.u.vesa_lfb.bits_per_pixel);
> +               xbi->vga_console_info.u.vesa_lfb.width,
> +               xbi->vga_console_info.u.vesa_lfb.height,
> +               xbi->vga_console_info.u.vesa_lfb.bits_per_pixel);
>          break;
>      default:
>          printk(" No VGA detected\n");
> @@ -641,15 +577,15 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>      }
>
>      /* Print VBE/DDC EDID information. */
> -    if ( bootsym(boot_edid_caps) != 0x1313 )
> +    if ( xbi->edid_caps != 0x1313 )
>      {
> -        u16 caps = bootsym(boot_edid_caps);
> +        u16 caps = xbi->edid_caps;
>          printk(" VBE/DDC methods:%s%s%s; ",
>                 (caps & 1) ? " V1" : "",
>                 (caps & 2) ? " V2" : "",
>                 !(caps & 3) ? " none" : "");
>          printk("EDID transfer time: %d seconds\n", caps >> 8);
> -        if ( *(u32 *)bootsym(boot_edid_info) == 0x13131313 )
> +        if ( *(u32 *)xbi->edid_info == 0x13131313 )
>          {
>              printk(" EDID info not retrieved because ");
>              if ( !(caps & 3) )
> @@ -662,13 +598,11 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>      }
>
>      printk("Disc information:\n");
> -    printk(" Found %d MBR signatures\n",
> -           bootsym(boot_mbr_signature_nr));
> -    printk(" Found %d EDD information structures\n",
> -           bootsym(boot_edd_info_nr));
> +    printk(" Found %d MBR signatures\n", xbi->mbr_signature_nr);
> +    printk(" Found %d EDD information structures\n", xbi->edd_info_nr);
>
>      /* Check that we have at least one Multiboot module. */
> -    if ( !(mbi->flags & MBI_MODULES) || (mbi->mods_count == 0) )
> +    if ( !xbi->mods_nr )
>          panic("dom0 kernel not specified. Check bootloader configuration.");
>
>      if ( ((unsigned long)cpu0_stack & (STACK_SIZE-1)) != 0 )
> @@ -686,77 +620,10 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>          /* Make boot page tables match non-EFI boot. */
>          l3_bootmap[l3_table_offset(BOOTSTRAP_MAP_BASE)] =
>              l3e_from_paddr(__pa(l2_bootmap), __PAGE_HYPERVISOR);
> -
> -        memmap_type = loader;
>      }
> -    else if ( e820_raw_nr != 0 )
> -    {
> -        memmap_type = "Xen-e820";
> -    }
> -    else if ( mbi->flags & MBI_MEMMAP )
> -    {
> -        memmap_type = "Multiboot-e820";
> -        while ( (bytes < mbi->mmap_length) && (e820_raw_nr < E820MAX) )
> -        {
> -            memory_map_t *map = __va(mbi->mmap_addr + bytes);
> -
> -            /*
> -             * This is a gross workaround for a BIOS bug. Some bootloaders do
> -             * not write e820 map entries into pre-zeroed memory. This is
> -             * okay if the BIOS fills in all fields of the map entry, but
> -             * some broken BIOSes do not bother to write the high word of
> -             * the length field if the length is smaller than 4GB. We
> -             * detect and fix this by flagging sections below 4GB that
> -             * appear to be larger than 4GB in size.
> -             */
> -            if ( (map->base_addr_high == 0) && (map->length_high != 0) )
> -            {
> -                if ( !e820_warn )
> -                {
> -                    printk("WARNING: Buggy e820 map detected and fixed "
> -                           "(truncated length fields).\n");
> -                    e820_warn = 1;
> -                }
> -                map->length_high = 0;
> -            }
> -
> -            e820_raw[e820_raw_nr].addr =
> -                ((u64)map->base_addr_high << 32) | (u64)map->base_addr_low;
> -            e820_raw[e820_raw_nr].size =
> -                ((u64)map->length_high << 32) | (u64)map->length_low;
> -            e820_raw[e820_raw_nr].type = map->type;
> -            e820_raw_nr++;
> -
> -            bytes += map->size + 4;
> -        }
> -    }
> -    else if ( bootsym(lowmem_kb) )
> -    {
> -        memmap_type = "Xen-e801";
> -        e820_raw[0].addr = 0;
> -        e820_raw[0].size = bootsym(lowmem_kb) << 10;
> -        e820_raw[0].type = E820_RAM;
> -        e820_raw[1].addr = 0x100000;
> -        e820_raw[1].size = bootsym(highmem_kb) << 10;
> -        e820_raw[1].type = E820_RAM;
> -        e820_raw_nr = 2;
> -    }
> -    else if ( mbi->flags & MBI_MEMLIMITS )
> -    {
> -        memmap_type = "Multiboot-e801";
> -        e820_raw[0].addr = 0;
> -        e820_raw[0].size = mbi->mem_lower << 10;
> -        e820_raw[0].type = E820_RAM;
> -        e820_raw[1].addr = 0x100000;
> -        e820_raw[1].size = mbi->mem_upper << 10;
> -        e820_raw[1].type = E820_RAM;
> -        e820_raw_nr = 2;
> -    }
> -    else
> -        panic("Bootloader provided no memory information.");
>
>      /* Sanitise the raw E820 map to produce a final clean version. */
> -    max_page = raw_max_page = init_e820(memmap_type, e820_raw, &e820_raw_nr);
> +    max_page = raw_max_page = init_e820(xbi->mmap_type, xbi->e820map, 
> &xbi->e820map_nr);
>
>      /* Create a temporary copy of the E820 map. */
>      memcpy(&boot_e820, &e820, sizeof(e820));
> @@ -769,8 +636,8 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>      set_kexec_crash_area_size((u64)nr_pages << PAGE_SHIFT);
>      kexec_reserve_area(&boot_e820);
>
> -    initial_images = mod;
> -    nr_initial_images = mbi->mods_count;
> +    nr_initial_images = xbi->mods_nr;
> +    initial_images = xbi->mods;
>
>      /*
>       * Iterate backwards over all superpage-aligned RAM regions.
> @@ -785,16 +652,15 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>       * we can relocate the dom0 kernel and other multiboot modules. Also, on
>       * x86/64, we relocate Xen to higher memory.
>       */
> -    for ( i = 0; !efi_enabled && i < mbi->mods_count; i++ )
> +    for ( i = 0; !efi_enabled && i < xbi->mods_nr; i++ )
>      {
> -        if ( mod[i].mod_start & (PAGE_SIZE - 1) )
> +        if ( xbi->mods[i].start & (PAGE_SIZE - 1) )
>              panic("Bootloader didn't honor module alignment request.");
> -        mod[i].mod_end -= mod[i].mod_start;
> -        mod[i].mod_start >>= PAGE_SHIFT;
> -        mod[i].reserved = 0;
> +        xbi->mods[i].end -= xbi->mods[i].start;
> +        xbi->mods[i].start >>= PAGE_SHIFT;
>      }
>
> -    modules_headroom = bzimage_headroom(bootstrap_map(mod), mod->mod_end);
> +    modules_headroom = bzimage_headroom(bootstrap_map(xbi->mods), 
> xbi->mods->end);
>      bootstrap_map(NULL);
>
>  #ifndef highmem_start
> @@ -835,7 +701,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>          {
>              /* Don't overlap with modules. */
>              end = consider_modules(s, e, reloc_size + mask,
> -                                   mod, mbi->mods_count, -1);
> +                                   xbi->mods, xbi->mods_nr, -1);
>              end &= ~mask;
>          }
>          else
> @@ -923,36 +789,36 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>          }
>
>          /* Is the region suitable for relocating the multiboot modules? */
> -        for ( j = mbi->mods_count - 1; j >= 0; j-- )
> +        for ( j = xbi->mods_nr - 1; j >= 0; j-- )
>          {
>              unsigned long headroom = j ? 0 : modules_headroom;
> -            unsigned long size = PAGE_ALIGN(headroom + mod[j].mod_end);
> +            unsigned long size = PAGE_ALIGN(headroom + xbi->mods[j].end);
>
> -            if ( mod[j].reserved )
> +            if ( xbi->mods[j].relocated )
>                  continue;
>
>              /* Don't overlap with other modules. */
> -            end = consider_modules(s, e, size, mod, mbi->mods_count, j);
> +            end = consider_modules(s, e, size, xbi->mods, xbi->mods_nr, j);
>
>              if ( highmem_start && end > highmem_start )
>                  continue;
>
>              if ( s < end &&
>                   (headroom ||
> -                  ((end - size) >> PAGE_SHIFT) > mod[j].mod_start) )
> +                  ((end - size) >> PAGE_SHIFT) > xbi->mods[j].start) )
>              {
>                  move_memory(end - size + headroom,
> -                            (uint64_t)mod[j].mod_start << PAGE_SHIFT,
> -                            mod[j].mod_end, 0);
> -                mod[j].mod_start = (end - size) >> PAGE_SHIFT;
> -                mod[j].mod_end += headroom;
> -                mod[j].reserved = 1;
> +                            (uint64_t)xbi->mods[j].start << PAGE_SHIFT,
> +                            xbi->mods[j].end, 0);
> +                xbi->mods[j].start = (end - size) >> PAGE_SHIFT;
> +                xbi->mods[j].end += headroom;
> +                xbi->mods[j].relocated = 1;
>              }
>          }
>
>          /* Don't overlap with modules. */
>          e = consider_modules(s, e, PAGE_ALIGN(kexec_crash_area.size),
> -                             mod, mbi->mods_count, -1);
> +                             xbi->mods, xbi->mods_nr, -1);
>          if ( !kexec_crash_area.start && (s < e) )
>          {
>              e = (e - kexec_crash_area.size) & PAGE_MASK;
> @@ -960,18 +826,18 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>          }
>      }
>
> -    if ( modules_headroom && !mod->reserved )
> +    if ( modules_headroom && !xbi->mods->relocated )
>          panic("Not enough memory to relocate the dom0 kernel image.");
> -    for ( i = 0; i < mbi->mods_count; ++i )
> +    for ( i = 0; i < xbi->mods_nr; ++i )
>      {
> -        uint64_t s = (uint64_t)mod[i].mod_start << PAGE_SHIFT;
> +        uint64_t s = (uint64_t)xbi->mods[i].start << PAGE_SHIFT;
>
> -        reserve_e820_ram(&boot_e820, s, s + PAGE_ALIGN(mod[i].mod_end));
> +        reserve_e820_ram(&boot_e820, s, s + PAGE_ALIGN(xbi->mods[i].end));
>      }
>
>      if ( !xen_phys_start )
>          panic("Not enough memory to relocate Xen.");
> -    reserve_e820_ram(&boot_e820, efi_enabled ? mbi->mem_upper : 
> __pa(&_start),
> +    reserve_e820_ram(&boot_e820, efi_enabled ? xbi->mem_upper : 
> __pa(&_start),
>                       __pa(&_end));
>
>      /* Late kexec reservation (dynamic start address). */
> @@ -1017,10 +883,10 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>                      ASSERT(j);
>                  }
>                  map_e = boot_e820.map[j].addr + boot_e820.map[j].size;
> -                for ( j = 0; j < mbi->mods_count; ++j )
> +                for ( j = 0; j < xbi->mods_nr; ++j )
>                  {
> -                    uint64_t end = pfn_to_paddr(mod[j].mod_start) +
> -                                   mod[j].mod_end;
> +                    uint64_t end = pfn_to_paddr(xbi->mods[j].start) +
> +                                   xbi->mods[j].end;
>
>                      if ( map_e < end )
>                          map_e = end;
> @@ -1093,13 +959,13 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>          }
>      }
>
> -    for ( i = 0; i < mbi->mods_count; ++i )
> +    for ( i = 0; i < xbi->mods_nr; ++i )
>      {
> -        set_pdx_range(mod[i].mod_start,
> -                      mod[i].mod_start + PFN_UP(mod[i].mod_end));
> -        map_pages_to_xen((unsigned long)mfn_to_virt(mod[i].mod_start),
> -                         mod[i].mod_start,
> -                         PFN_UP(mod[i].mod_end), PAGE_HYPERVISOR);
> +        set_pdx_range(xbi->mods[i].start,
> +                      xbi->mods[i].start + PFN_UP(xbi->mods[i].end));
> +        map_pages_to_xen((unsigned long)mfn_to_virt(xbi->mods[i].start),
> +                         xbi->mods[i].start,
> +                         PFN_UP(xbi->mods[i].end), PAGE_HYPERVISOR);
>      }
>
>      if ( kexec_crash_area.size )
> @@ -1253,13 +1119,13 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>
>      init_IRQ();
>
> -    module_map = xmalloc_array(unsigned long, 
> BITS_TO_LONGS(mbi->mods_count));
> -    bitmap_fill(module_map, mbi->mods_count);
> +    module_map = xmalloc_array(unsigned long, BITS_TO_LONGS(xbi->mods_nr));
> +    bitmap_fill(module_map, xbi->mods_nr);
>      __clear_bit(0, module_map); /* Dom0 kernel is always first */
>
> -    xsm_multiboot_init(module_map, mbi, bootstrap_map);
> +    xsm_multiboot_init(module_map, xbi, bootstrap_map);
>
> -    microcode_grab_module(module_map, mbi, bootstrap_map);
> +    microcode_grab_module(module_map, xbi, bootstrap_map);
>
>      timer_init();
>
> @@ -1364,12 +1230,12 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>      dom0->target = NULL;
>
>      /* Grab the DOM0 command line. */
> -    cmdline = (char *)(mod[0].string ? __va(mod[0].string) : NULL);
> +    cmdline = (char *)(xbi->mods[0].cmdline ? __va(xbi->mods[0].cmdline) : 
> NULL);
>      if ( (cmdline != NULL) || (kextra != NULL) )
>      {
>          static char __initdata dom0_cmdline[MAX_GUEST_CMDLINE];
>
> -        cmdline = cmdline_cook(cmdline, loader);
> +        cmdline = cmdline_cook(cmdline, xbi->boot_loader_name);
>          safe_strcpy(dom0_cmdline, cmdline);
>
>          if ( kextra != NULL )
> @@ -1396,8 +1262,8 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>      if ( xen_cpuidle )
>          xen_processor_pmbits |= XEN_PROCESSOR_PM_CX;
>
> -    initrdidx = find_first_bit(module_map, mbi->mods_count);
> -    if ( bitmap_weight(module_map, mbi->mods_count) > 1 )
> +    initrdidx = find_first_bit(module_map, xbi->mods_nr);
> +    if ( bitmap_weight(module_map, xbi->mods_nr) > 1 )
>          printk(XENLOG_WARNING
>                 "Multiple initrd candidates, picking module #%u\n",
>                 initrdidx);
> @@ -1414,9 +1280,9 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>       * We're going to setup domain0 using the module(s) that we stashed 
> safely
>       * above our heap. The second module, if present, is an initrd ramdisk.
>       */
> -    if ( construct_dom0(dom0, mod, modules_headroom,
> -                        (initrdidx > 0) && (initrdidx < mbi->mods_count)
> -                        ? mod + initrdidx : NULL,
> +    if ( construct_dom0(dom0, xbi->mods, modules_headroom,
> +                        (initrdidx > 0) && (initrdidx < xbi->mods_nr)
> +                        ? xbi->mods + initrdidx : NULL,
>                          bootstrap_map, cmdline) != 0)
>          panic("Could not set up DOM0 guest OS");
>
> diff --git a/xen/arch/x86/x86_64/asm-offsets.c 
> b/xen/arch/x86/x86_64/asm-offsets.c
> index 3994f4d..2123eb3 100644
> --- a/xen/arch/x86/x86_64/asm-offsets.c
> +++ b/xen/arch/x86/x86_64/asm-offsets.c
> @@ -12,7 +12,7 @@
>  #include <compat/xen.h>
>  #include <asm/fixmap.h>
>  #include <asm/hardirq.h>
> -#include <xen/multiboot.h>
> +#include <asm/mbd.h>
>
>  #define DEFINE(_sym, _val)                                                 \
>      asm volatile ("\n.ascii\"==>#define " #_sym " %0 /* " #_val " */<==\"" \
> @@ -163,6 +163,5 @@ void __dummy__(void)
>      OFFSET(CPUINFO_features, struct cpuinfo_x86, x86_capability);
>      BLANK();
>
> -    OFFSET(MB_flags, multiboot_info_t, flags);
> -    OFFSET(MB_cmdline, multiboot_info_t, cmdline);
> +    OFFSET(MBD_cmdline, mbd_t, cmdline);
>  }
> diff --git a/xen/drivers/acpi/osl.c b/xen/drivers/acpi/osl.c
> index 93c983c..f034e1a 100644
> --- a/xen/drivers/acpi/osl.c
> +++ b/xen/drivers/acpi/osl.c
> @@ -39,6 +39,7 @@
>  #include <xen/domain_page.h>
>  #include <xen/efi.h>
>  #include <xen/vmap.h>
> +#include <asm/xbi.h>
>
>  #define _COMPONENT             ACPI_OS_SERVICES
>  ACPI_MODULE_NAME("osl")
> @@ -67,10 +68,10 @@ void __init acpi_os_vprintf(const char *fmt, va_list args)
>  acpi_physical_address __init acpi_os_get_root_pointer(void)
>  {
>         if (efi_enabled) {
> -               if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
> -                       return efi.acpi20;
> -               else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
> -                       return efi.acpi;
> +               if (xbi->acpi20 != EFI_INVALID_TABLE_ADDR)
> +                       return xbi->acpi20;
> +               else if (xbi->acpi != EFI_INVALID_TABLE_ADDR)
> +                       return xbi->acpi;
>                 else {
>                         printk(KERN_ERR PREFIX
>                                "System description tables not found\n");
> diff --git a/xen/drivers/video/vesa.c b/xen/drivers/video/vesa.c
> index 575db62..8941ac3 100644
> --- a/xen/drivers/video/vesa.c
> +++ b/xen/drivers/video/vesa.c
> @@ -12,10 +12,11 @@
>  #include <xen/vga.h>
>  #include <asm/io.h>
>  #include <asm/page.h>
> +#include <asm/xbi.h>
>  #include "font.h"
>  #include "lfb.h"
>
> -#define vlfb_info    vga_console_info.u.vesa_lfb
> +#define vlfb_info    (xbi->vga_console_info.u.vesa_lfb)
>
>  static void lfb_flush(void);
>
> @@ -43,7 +44,7 @@ void __init vesa_early_init(void)
>  {
>      unsigned int vram_vmode;
>
> -    vga_compat = !(vga_console_info.u.vesa_lfb.gbl_caps & 2);
> +    vga_compat = !(xbi->vga_console_info.u.vesa_lfb.gbl_caps & 2);
>
>      if ( (vlfb_info.bits_per_pixel < 8) || (vlfb_info.bits_per_pixel > 32) )
>          return;
> diff --git a/xen/drivers/video/vga.c b/xen/drivers/video/vga.c
> index 40e5963..feb9b31 100644
> --- a/xen/drivers/video/vga.c
> +++ b/xen/drivers/video/vga.c
> @@ -11,9 +11,7 @@
>  #include <xen/vga.h>
>  #include <xen/pci.h>
>  #include <asm/io.h>
> -
> -/* Filled in by arch boot code. */
> -struct xen_vga_console_info vga_console_info;
> +#include <asm/xbi.h>
>
>  static int vgacon_keep;
>  static unsigned int xpos, ypos;
> @@ -75,15 +73,15 @@ void __init video_init(void)
>              vgacon_keep = 1;
>      }
>
> -    switch ( vga_console_info.video_type )
> +    switch ( xbi->vga_console_info.video_type )
>      {
>      case XEN_VGATYPE_TEXT_MODE_3:
>          if ( page_is_ram_type(paddr_to_pfn(0xB8000), RAM_TYPE_CONVENTIONAL) 
> ||
>               ((video = ioremap(0xB8000, 0x8000)) == NULL) )
>              return;
>          outw(0x200a, 0x3d4); /* disable cursor */
> -        columns = vga_console_info.u.text_mode_3.columns;
> -        lines   = vga_console_info.u.text_mode_3.rows;
> +        columns = xbi->vga_console_info.u.text_mode_3.columns;
> +        lines   = xbi->vga_console_info.u.text_mode_3.rows;
>          memset(video, 0, columns * lines * 2);
>          video_puts = vga_text_puts;
>          break;
> @@ -92,7 +90,7 @@ void __init video_init(void)
>          vesa_early_init();
>          break;
>      default:
> -        memset(&vga_console_info, 0, sizeof(vga_console_info));
> +        memset(&xbi->vga_console_info, 0, sizeof(xbi->vga_console_info));
>          break;
>      }
>  }
> @@ -163,7 +161,7 @@ void __init video_endboot(void)
>              }
>      }
>
> -    switch ( vga_console_info.video_type )
> +    switch ( xbi->vga_console_info.video_type )
>      {
>      case XEN_VGATYPE_TEXT_MODE_3:
>          if ( !vgacon_keep )
> @@ -206,6 +204,6 @@ static void vga_text_puts(const char *s)
>
>  int __init fill_console_start_info(struct dom0_vga_console_info *ci)
>  {
> -    memcpy(ci, &vga_console_info, sizeof(*ci));
> +    memcpy(ci, &xbi->vga_console_info, sizeof(*ci));
>      return 1;
>  }
> diff --git a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h
> index 210ff57..ae68322 100644
> --- a/xen/include/asm-x86/config.h
> +++ b/xen/include/asm-x86/config.h
> @@ -119,8 +119,6 @@ extern unsigned int trampoline_xen_phys_start;
>  extern unsigned char trampoline_cpu_started;
>  extern char wakeup_start[];
>  extern unsigned int video_mode, video_flags;
> -extern unsigned short boot_edid_caps;
> -extern unsigned char boot_edid_info[128];
>  #endif
>
>  #define asmlinkage
> diff --git a/xen/include/asm-x86/e820.h b/xen/include/asm-x86/e820.h
> index 08b413d..5d3683a 100644
> --- a/xen/include/asm-x86/e820.h
> +++ b/xen/include/asm-x86/e820.h
> @@ -33,12 +33,4 @@ extern int e820_add_range(
>  extern unsigned long init_e820(const char *, struct e820entry *, int *);
>  extern struct e820map e820;
>
> -/* These symbols live in the boot trampoline. */
> -extern struct e820entry e820map[];
> -extern int e820nr;
> -extern unsigned int lowmem_kb, highmem_kb;
> -
> -#define e820_raw bootsym(e820map)
> -#define e820_raw_nr bootsym(e820nr)
> -
>  #endif /*__E820_HEADER*/
> diff --git a/xen/include/asm-x86/edd.h b/xen/include/asm-x86/edd.h
> index afaa237..e8361a5 100644
> --- a/xen/include/asm-x86/edd.h
> +++ b/xen/include/asm-x86/edd.h
> @@ -143,12 +143,6 @@ struct __packed mbr_signature {
>      u32 signature;
>  };
>
> -/* These all reside in the boot trampoline. Access via bootsym(). */
> -extern struct mbr_signature boot_mbr_signature[];
> -extern u8 boot_mbr_signature_nr;
> -extern struct edd_info boot_edd_info[];
> -extern u8 boot_edd_info_nr;
> -
>  #endif /* __ASSEMBLY__ */
>
>  /* Maximum number of EDD information structures at boot_edd_info. */
> diff --git a/xen/include/asm-x86/setup.h b/xen/include/asm-x86/setup.h
> index 8f8c6f3..88e9124 100644
> --- a/xen/include/asm-x86/setup.h
> +++ b/xen/include/asm-x86/setup.h
> @@ -1,7 +1,7 @@
>  #ifndef __X86_SETUP_H_
>  #define __X86_SETUP_H_
>
> -#include <xen/multiboot.h>
> +#include <asm/xbi.h>
>
>  extern unsigned long xenheap_initial_phys_start;
>
> @@ -27,9 +27,9 @@ void vesa_mtrr_init(void);
>
>  int construct_dom0(
>      struct domain *d,
> -    const module_t *kernel, unsigned long kernel_headroom,
> -    module_t *initrd,
> -    void *(*bootstrap_map)(const module_t *),
> +    const boot_module_t *kernel, unsigned long kernel_headroom,
> +    boot_module_t *initrd,
> +    void *(*bootstrap_map)(const boot_module_t *),
>      char *cmdline);
>
>  unsigned long initial_images_nrpages(void);
> @@ -38,7 +38,7 @@ void discard_initial_images(void);
>  int xen_in_range(unsigned long mfn);
>
>  void microcode_grab_module(
> -    unsigned long *, const multiboot_info_t *, void *(*)(const module_t *));
> +    unsigned long *, const xbi_t *, void *(*)(const boot_module_t *));
>
>  extern uint8_t kbd_shift_flags;
>
> diff --git a/xen/include/xen/efi.h b/xen/include/xen/efi.h
> index 8a2b788..64d2dea 100644
> --- a/xen/include/xen/efi.h
> +++ b/xen/include/xen/efi.h
> @@ -9,16 +9,6 @@ extern const bool_t efi_enabled;
>
>  #define EFI_INVALID_TABLE_ADDR (~0UL)
>
> -/* Add fields here only if they need to be referenced from non-EFI code. */
> -struct efi {
> -    unsigned long mps;          /* MPS table */
> -    unsigned long acpi;         /* ACPI table (IA64 ext 0.71) */
> -    unsigned long acpi20;       /* ACPI table (ACPI 2.0) */
> -    unsigned long smbios;       /* SM BIOS table */
> -};
> -
> -extern struct efi efi;
> -
>  #ifndef __ASSEMBLY__
>
>  union xenpf_efi_info;
> diff --git a/xen/include/xen/vga.h b/xen/include/xen/vga.h
> index f72b63d..3d5c331 100644
> --- a/xen/include/xen/vga.h
> +++ b/xen/include/xen/vga.h
> @@ -11,8 +11,4 @@
>
>  #include <xen/video.h>
>
> -#ifdef CONFIG_VGA
> -extern struct xen_vga_console_info vga_console_info;
> -#endif
> -
>  #endif /* _XEN_VGA_H */
> diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
> index a85045d..87f3729 100644
> --- a/xen/include/xsm/xsm.h
> +++ b/xen/include/xsm/xsm.h
> @@ -16,7 +16,7 @@
>  #define __XSM_H__
>
>  #include <xen/sched.h>
> -#include <xen/multiboot.h>
> +#include <asm/xbi.h>
>
>  typedef void xsm_op_t;
>  DEFINE_XEN_GUEST_HANDLE(xsm_op_t);
> @@ -659,11 +659,11 @@ static inline int xsm_ioport_mapping (xsm_default_t 
> def, struct domain *d, uint3
>
>  #ifdef CONFIG_MULTIBOOT
>  extern int xsm_multiboot_init(unsigned long *module_map,
> -                              const multiboot_info_t *mbi,
> -                              void *(*bootstrap_map)(const module_t *));
> +                              const xbi_t *xbi,
> +                              void *(*bootstrap_map)(const boot_module_t *));
>  extern int xsm_multiboot_policy_init(unsigned long *module_map,
> -                                     const multiboot_info_t *mbi,
> -                                     void *(*bootstrap_map)(const module_t 
> *));
> +                                     const xbi_t *xbi,
> +                                     void *(*bootstrap_map)(const 
> boot_module_t *));
>  #endif
>
>  #ifdef HAS_DEVICE_TREE
> @@ -683,8 +683,8 @@ extern void xsm_fixup_ops(struct xsm_operations *ops);
>
>  #ifdef CONFIG_MULTIBOOT
>  static inline int xsm_multiboot_init (unsigned long *module_map,
> -                                      const multiboot_info_t *mbi,
> -                                      void *(*bootstrap_map)(const module_t 
> *))
> +                                      const xbi_t *xbi,
> +                                      void *(*bootstrap_map)(const 
> boot_module_t *))
>  {
>      return 0;
>  }
> diff --git a/xen/xsm/xsm_core.c b/xen/xsm/xsm_core.c
> index 0ac6d03..85d4d33 100644
> --- a/xen/xsm/xsm_core.c
> +++ b/xen/xsm/xsm_core.c
> @@ -60,8 +60,8 @@ static int __init xsm_core_init(void)
>
>  #ifdef CONFIG_MULTIBOOT
>  int __init xsm_multiboot_init(unsigned long *module_map,
> -                              const multiboot_info_t *mbi,
> -                              void *(*bootstrap_map)(const module_t *))
> +                              const xbi_t *xbi,
> +                              void *(*bootstrap_map)(const boot_module_t *))
>  {
>      int ret = 0;
>
> @@ -69,7 +69,7 @@ int __init xsm_multiboot_init(unsigned long *module_map,
>
>      if ( XSM_MAGIC )
>      {
> -        ret = xsm_multiboot_policy_init(module_map, mbi, bootstrap_map);
> +        ret = xsm_multiboot_policy_init(module_map, xbi, bootstrap_map);
>          if ( ret )
>          {
>              bootstrap_map(NULL);
> diff --git a/xen/xsm/xsm_policy.c b/xen/xsm/xsm_policy.c
> index 6e0bb78..5700eac 100644
> --- a/xen/xsm/xsm_policy.c
> +++ b/xen/xsm/xsm_policy.c
> @@ -19,9 +19,6 @@
>   */
>
>  #include <xsm/xsm.h>
> -#ifdef CONFIG_MULTIBOOT
> -#include <xen/multiboot.h>
> -#endif
>  #include <xen/bitops.h>
>  #ifdef HAS_DEVICE_TREE
>  # include <asm/setup.h>
> @@ -33,11 +30,10 @@ u32 __initdata policy_size = 0;
>
>  #ifdef CONFIG_MULTIBOOT
>  int __init xsm_multiboot_policy_init(unsigned long *module_map,
> -                                     const multiboot_info_t *mbi,
> -                                     void *(*bootstrap_map)(const module_t 
> *))
> +                                     const xbi_t *xbi,
> +                                     void *(*bootstrap_map)(const 
> boot_module_t *))
>  {
>      int i;
> -    module_t *mod = (module_t *)__va(mbi->mods_addr);
>      int rc = 0;
>      u32 *_policy_start;
>      unsigned long _policy_len;
> @@ -46,13 +42,13 @@ int __init xsm_multiboot_policy_init(unsigned long 
> *module_map,
>       * Try all modules and see whichever could be the binary policy.
>       * Adjust module_map for the module that is the binary policy.
>       */
> -    for ( i = mbi->mods_count-1; i >= 1; i-- )
> +    for ( i = xbi->mods_nr - 1; i >= 1; i-- )
>      {
>          if ( !test_bit(i, module_map) )
>              continue;
>
> -        _policy_start = bootstrap_map(mod + i);
> -        _policy_len   = mod[i].mod_end;
> +        _policy_start = bootstrap_map(xbi->mods + i);
> +        _policy_len   = xbi->mods[i].end;
>
>          if ( (xsm_magic_t)(*_policy_start) == XSM_MAGIC )
>          {
> --
> 1.7.10.4
>

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

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