WARNING - OLD ARCHIVES

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

xen-devel

Re: [Xen-devel] [PATCH 2 of 3] Enable UEFI BIOS(OVMF) support in Xen-uns

To: Bei Guan <gbtju85@xxxxxxxxx>, Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH 2 of 3] Enable UEFI BIOS(OVMF) support in Xen-unstable HVM
From: Keir Fraser <keir@xxxxxxx>
Date: Fri, 05 Aug 2011 05:10:12 -0700
Cc: edk2-devel@xxxxxxxxxxxxxxxxxxxxx, Xen Devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, Jordan Justen <jljusten@xxxxxxxxx>, Tim Deegan <Tim.Deegan@xxxxxxxxxx>, Andrei Warkentin <andreiw@xxxxxxxxxxxx>
Delivery-date: Fri, 05 Aug 2011 05:11:11 -0700
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=sender:user-agent:date:subject:from:to:cc:message-id:thread-topic :thread-index:in-reply-to:mime-version:content-type :content-transfer-encoding; bh=vPgJHWYW3aoqh6Xc5qepzp5m8bWjJCrHry4cA4u/e/s=; b=KCCw86EQrrJHvcXktlz3NpBIDcA7Kk7Yg72jCAOmx/pPDL4ABBGJwSrvO/9sPe3SGL CMs5jE0XyGbXpf5RCUohjyxVkPhPUQ6y0wrgKn+xwJqdIJBG0JEZ37gGWBIK/mLjyN5b C3vF2a77idtq1NFz1vQvJGuCFYRh4GaApl2oI=
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <CAEQjb-TLJTct7NOcJgg0iam5-9XqMc8DHsihXKx8CbKHU5QaxQ@xxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Thread-index: AcxTaKBrYIChjueKNEyk5uFRXGbq2A==
Thread-topic: [Xen-devel] [PATCH 2 of 3] Enable UEFI BIOS(OVMF) support in Xen-unstable HVM
User-agent: Microsoft-Entourage/12.30.0.110427
On 05/08/2011 04:20, "Bei Guan" <gbtju85@xxxxxxxxx> wrote:

> Hi All,
> 
> Thank you for all your comments. I has removed the patch for xend and modified
> some other little stuff according to your comments.
> I have rebased my patches on the top of the latest Xen-unstable version
> (changeset: 23756:0f36c2eec2e).
> Is there any more comment? Thank you very much.
>
> In the patch for ovmf.c, we add a method ovmf_pci_setup(), which is copied
> form method pci_setup() in hvmloader/pci.c except for all the VGA related
> stuff. This method is assigned to bios->pci_setup(). The reason for adding
> such a method is stated here:
> http://sourceforge.net/mailarchive/message.php?msg_id=27854247

No, that email thread appears to be confusion. Andrei is saying that a
function like pci_setup() does need to be called -- you can't replace
ovmf_pci_setup() with *nothing*. But there's nothing in that thread that
states, or explains why, you can't just use the generic function
pci_setup(), even if it does contain some pointless stuff for OVMF that will
get redone when the BIOS takes control.

We need that explanation, or just get rid of ovmf_pci_setup() and use the
generic pci_setup() like our legacy BIOSes do.

 -- Keir
 
> The patches are also available at
> https://github.com/GavinGuan/gavinguan/blob/master/xen/ovmf-support/ovmf_xen_s
> upport.patch
> https://github.com/GavinGuan/gavinguan/blob/master/xen/ovmf-support/ovmf_xl.pa
> tch
> https://github.com/GavinGuan/gavinguan/blob/master/xen/ovmf-support/ovmf_firmw
> are.patch
> 
> 
> # HG changeset patch
> # User gbtju85@xxxxxxxxx
> #
> 
> Enable Xen-unstable hvmloader to load OVMF BIOS.
> It supports OVMF BIOS in IA32 and X86 environment.
> 
> Usage:
> Add an option field in HVM config file.
> # OVMF support. When enabled, hvmloader can load OVMF bios of
> IA32("ovmf-ia32") and X64("ovmf-x64")
> hvmbios = "ovmf-ia32"
> #hvmbios = "ovmf-x64"
> 
> Note:
> Enable the HVM guest ACPI: acpi=1
> Use the OVMF to boot into a UEFI-aware OS, such as
> ubuntu-10.10-desktop-amd64.iso. Just set the "disk" option like this:
> disk = [ 'file:/root/<img_name>.img,ioemu:hda,w',
> 'file:/root/ubuntu-10.10-desktop-amd64.iso,hdc:cdrom,r' ]
> 
> diff -r 0f36c2eec2e1 tools/firmware/hvmloader/Makefile
> --- a/tools/firmware/hvmloader/Makefile    Thu Jul 28 15:40:54 2011 +0100
> +++ b/tools/firmware/hvmloader/Makefile    Fri Aug 05 17:58:27 2011 +0800
> @@ -43,6 +43,19 @@
>  CFLAGS += -DENABLE_ROMBIOS
>  ROMBIOS_ROM := $(ROMBIOS_DIR)/BIOS-bochs-latest
>  endif
> +OVMF_DIR :=  ../ovmf
> +OVMF32_ROM := $(OVMF_DIR)/ovmf-ia32.bin
> +OVMF64_ROM := $(OVMF_DIR)/ovmf-x64.bin
> +OVMF32_CIRRUS_VGA_ROM := $(OVMF_DIR)/ovmf-ia32-cirrus-vga.bin
> +OVMF64_CIRRUS_VGA_ROM := $(OVMF_DIR)/ovmf-x64-cirrus-vga.bin
> +
> +ifneq ($(OVMF32_ROM),)
> +OBJS += ovmf.o
> +endif
> +
> +ifneq ($(OVMF64_ROM),)
> +OBJS += ovmf.o
> +endif
>  
>  ifneq ($(SEABIOS_DIR),)
>  OBJS += seabios.o
> @@ -69,7 +82,7 @@
>      $(OBJCOPY) hvmloader.tmp hvmloader
>      rm -f hvmloader.tmp
>  
> -roms.inc: $(ROMBIOS_ROM) $(SEABIOS_ROM) $(STDVGA_ROM) $(CIRRUSVGA_ROM)
> ../etherboot/eb-roms.h
> +roms.inc: $(ROMBIOS_ROM) $(SEABIOS_ROM) $(STDVGA_ROM) $(CIRRUSVGA_ROM)
> $(OVMF32_ROM) $(OVMF64_ROM) $(OVMF32_CIRRUS_VGA_ROM) $(OVMF64_CIRRUS_VGA_ROM)
> ../etherboot/eb-roms.h
>      echo "/* Autogenerated file. DO NOT EDIT */" > $@.new
>  
>  ifneq ($(ROMBIOS_ROM),)
> @@ -84,6 +97,30 @@
>      echo "#endif" >> $@.new
>  endif
>  
> +ifneq ($(OVMF32_ROM),)
> +    echo "#ifdef ROM_INCLUDE_OVMF32" >> $@.new
> +    sh ./mkhex ovmf32 $(OVMF32_ROM) >> $@.new
> +    echo "#endif" >> $@.new   
> +endif 
> +
> +ifneq ($(OVMF64_ROM),)
> +    echo "#ifdef ROM_INCLUDE_OVMF64" >> $@.new
> +    sh ./mkhex ovmf64 $(OVMF64_ROM) >> $@.new
> +    echo "#endif" >> $@.new   
> +endif 
> +
> +ifneq ($(OVMF32_CIRRUS_VGA_ROM),)
> +    echo "#ifdef ROM_INCLUDE_OVMF32_CIRRUS_VGA" >> $@.new
> +    sh ./mkhex ovmf32_cirrus_vga $(OVMF32_CIRRUS_VGA_ROM) >> $@.new
> +    echo "#endif" >> $@.new
> +endif 
> +
> +ifneq ($(OVMF64_CIRRUS_VGA_ROM),)
> +    echo "#ifdef ROM_INCLUDE_OVMF64_CIRRUS_VGA" >> $@.new
> +    sh ./mkhex ovmf64_cirrus_vga $(OVMF64_CIRRUS_VGA_ROM) >> $@.new
> +    echo "#endif" >> $@.new   
> +endif 
> +
>  ifneq ($(STDVGA_ROM),)
>      echo "#ifdef ROM_INCLUDE_VGABIOS" >> $@.new
>      sh ./mkhex vgabios_stdvga $(STDVGA_ROM) >> $@.new
> diff -r 0f36c2eec2e1 tools/firmware/hvmloader/config.h
> --- a/tools/firmware/hvmloader/config.h    Thu Jul 28 15:40:54 2011 +0100
> +++ b/tools/firmware/hvmloader/config.h    Fri Aug 05 17:58:27 2011 +0800
> @@ -3,7 +3,7 @@
>  
>  #include <stdint.h>
>  
> -enum virtual_vga { VGA_none, VGA_std, VGA_cirrus, VGA_pt };
> +enum virtual_vga { VGA_none, VGA_std, VGA_cirrus, VGA_pt, VGA_custom };
>  extern enum virtual_vga virtual_vga;
>  
>  struct bios_config {
> @@ -27,6 +27,7 @@
>  
>      void (*vm86_setup)(void);
>      void (*e820_setup)(void);
> +    void (*pci_setup)(void);
>  
>      void (*acpi_build_tables)(void);
>      void (*create_mp_tables)(void);
> @@ -36,6 +37,8 @@
>  
>  extern struct bios_config rombios_config;
>  extern struct bios_config seabios_config;
> +extern struct bios_config ovmf32_config;
> +extern struct bios_config ovmf64_config;
>  
>  #define PAGE_SHIFT 12
>  #define PAGE_SIZE  (1ul << PAGE_SHIFT)
> diff -r 0f36c2eec2e1 tools/firmware/hvmloader/hvmloader.c
> --- a/tools/firmware/hvmloader/hvmloader.c    Thu Jul 28 15:40:54 2011 +0100
> +++ b/tools/firmware/hvmloader/hvmloader.c    Fri Aug 05 17:58:27 2011 +0800
> @@ -361,6 +361,8 @@
>  #ifdef ENABLE_SEABIOS
>      { "seabios", &seabios_config, },
>  #endif
> +    { "ovmf-ia32", &ovmf32_config, },
> +    { "ovmf-x64", &ovmf64_config, },
>      { NULL, NULL }
>  };
>  
> @@ -420,7 +422,11 @@
>      printf("CPU speed is %u MHz\n", get_cpu_mhz());
>  
>      apic_setup();
> -    pci_setup();
> +    if (bios->pci_setup) {
> +        bios->pci_setup();
> +    } else {
> +        pci_setup();
> +    }
>  
>      smp_initialise();
>  
> @@ -471,6 +477,8 @@
>              vgabios_sz = round_option_rom(
>                  (*(uint8_t *)(VGABIOS_PHYSICAL_ADDRESS+2)) * 512);
>              break;
> +        case VGA_custom:
> +            break;
>          default:
>              printf("No emulated VGA adaptor ...\n");
>              break;
> diff -r 0f36c2eec2e1 tools/firmware/hvmloader/ovmf.c
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ b/tools/firmware/hvmloader/ovmf.c    Fri Aug 05 17:58:27 2011 +0800
> @@ -0,0 +1,394 @@
> +/*
> + * HVM OVMF UEFI support.
> + *
> + * Bei Guan, gbtju85@xxxxxxxxx
> + * Andrei Warkentin, andreiw@xxxxxxxxxxxx
> + * Leendert van Doorn, leendert@xxxxxxxxxxxxxx
> + * Copyright (c) 2005, International Business Machines Corporation.
> + * Copyright (c) 2006, Keir Fraser, XenSource Inc.
> + * Copyright (c) 2011, Citrix Inc.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope 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, write to the Free Software Foundation, Inc., 59
> Temple
> + * Place - Suite 330, Boston, MA 02111-1307 USA.
> + */
> +
> +#include "config.h"
> +#include "smbios_types.h"
> +#include "acpi/acpi2_0.h"
> +#include "apic_regs.h"
> +#include "../rombios/config.h"
> +#include "util.h"
> +#include "pci_regs.h"
> +#include "hypercall.h"
> +
> +#include <xen/hvm/params.h>
> +#include <xen/hvm/ioreq.h>
> +#include <xen/memory.h>
> +
> +#define ROM_INCLUDE_OVMF32
> +#define ROM_INCLUDE_OVMF64
> +#define ROM_INCLUDE_OVMF32_CIRRUS_VGA
> +#define ROM_INCLUDE_OVMF64_CIRRUS_VGA
> +#include "roms.inc"
> +
> +#define OVMF_BEGIN              0xFFF00000ULL
> +#define OVMF_SIZE               0x00100000ULL
> +#define OVMF_MAXOFFSET          0x000FFFFFULL
> +#define OVMF_END                (OVMF_BEGIN + OVMF_SIZE)
> +#define LOWCHUNK_BEGIN          0x000F0000
> +#define LOWCHUNK_SIZE           0x00010000
> +#define LOWCHUNK_MAXOFFSET      0x0000FFFF
> +#define LOWCHUNK_END            (OVMF_BEGIN + OVMF_SIZE)
> +
> +/*
> + * Set up an empty TSS area for virtual 8086 mode to use.
> + * The only important thing is that it musn't have any bits set
> + * in the interrupt redirection bitmap, so all zeros will do.
> + */
> +static void ovmf_init_vm86_tss(void)
> +{
> +    void *tss;
> +    struct xen_hvm_param p;
> +
> +    tss = mem_alloc(128, 128);
> +    memset(tss, 0, 128);
> +    p.domid = DOMID_SELF;
> +    p.index = HVM_PARAM_VM86_TSS;
> +    p.value = virt_to_phys(tss);
> +    hypercall_hvm_op(HVMOP_set_param, &p);
> +    printf("vm86 TSS at %08lx\n", virt_to_phys(tss));
> +}
> +
> +static void ovmf_load(const struct bios_config *config)
> +{
> +    xen_pfn_t mfn;
> +    uint64_t addr = OVMF_BEGIN;
> +
> +    virtual_vga = VGA_custom;
> +
> +    /* Copy video ROM. */
> +    if (config == &ovmf32_config) {
> +        memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
> +               ovmf32_cirrus_vga, sizeof(ovmf32_cirrus_vga));
> +        printf("OVMF32 Cirrus [0x%x-0x%x]\n", VGABIOS_PHYSICAL_ADDRESS,
> +               VGABIOS_PHYSICAL_ADDRESS + sizeof(ovmf32_cirrus_vga));
> +    } else if (config == &ovmf64_config) {
> +        memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
> +               ovmf64_cirrus_vga, sizeof(ovmf64_cirrus_vga));
> +        printf("OVMF64 Cirrus [0x%x-0x%x]\n", VGABIOS_PHYSICAL_ADDRESS,
> +               VGABIOS_PHYSICAL_ADDRESS + sizeof(ovmf64_cirrus_vga));
> +    }
> +
> +    /* Copy low-reset vector portion. */
> +    memcpy((void *) LOWCHUNK_BEGIN, (uint8_t *) config->image
> +           + OVMF_SIZE
> +           - LOWCHUNK_SIZE,
> +           LOWCHUNK_SIZE);
> +
> +    /* Ensure we have backing page prior to moving FD. */
> +    while ((addr >> PAGE_SHIFT) != (OVMF_END >> PAGE_SHIFT)) {
> +        mfn = (uint32_t) (addr >> PAGE_SHIFT);
> +        addr += PAGE_SIZE;
> +
> +        mem_hole_populate_ram(mfn, 1);
> +    }
> +
> +    printf("Initialized FD backing pages...\n");
> +
> +    /* Copy FD. */
> +    memcpy((void *) OVMF_BEGIN, config->image, OVMF_SIZE);
> +    printf("Load complete!\n");
> +}
> +
> +/*
> + * Ideally this function should just adjust the low memory size so MMIO fits,
> + * everything else should be done in UEFI code
> + */
> +static void ovmf_pci_setup(void)
> +{
> +    uint32_t base, devfn, bar_reg, bar_data, bar_sz, cmd, mmio_total = 0;
> +    uint16_t class, vendor_id, device_id;
> +    unsigned int bar, pin, link, isa_irq;
> +
> +    /* Resources assignable to PCI devices via BARs. */
> +    struct resource {
> +        uint32_t base, max;
> +    } *resource, mem_resource, io_resource;
> +
> +    /* Create a list of device BARs in descending order of size. */
> +    struct bars {
> +        uint32_t devfn, bar_reg, bar_sz;
> +    } *bars = (struct bars *)SCRATCH_PHYSICAL_ADDRESS;
> +    unsigned int i, nr_bars = 0;
> +
> +    /* Program PCI-ISA bridge with appropriate link routes. */
> +    isa_irq = 0;
> +    for ( link = 0; link < 4; link++ )
> +    {
> +        do { isa_irq = (isa_irq + 1) & 15;
> +        } while ( !(PCI_ISA_IRQ_MASK & (1U << isa_irq)) );
> +        pci_writeb(PCI_ISA_DEVFN, 0x60 + link, isa_irq);
> +        printf("PCI-ISA link %u routed to IRQ%u\n", link, isa_irq);
> +    }
> +
> +    /* Program ELCR to match PCI-wired IRQs. */
> +    outb(0x4d0, (uint8_t)(PCI_ISA_IRQ_MASK >> 0));
> +    outb(0x4d1, (uint8_t)(PCI_ISA_IRQ_MASK >> 8));
> +
> +    /* Scan the PCI bus and map resources. */
> +    for ( devfn = 0; devfn < 256; devfn++ )
> +    {
> +        class     = pci_readw(devfn, PCI_CLASS_DEVICE);
> +        vendor_id = pci_readw(devfn, PCI_VENDOR_ID);
> +        device_id = pci_readw(devfn, PCI_DEVICE_ID);
> +        if ( (vendor_id == 0xffff) && (device_id == 0xffff) )
> +            continue;
> +
> +        ASSERT((devfn != PCI_ISA_DEVFN) ||
> +               ((vendor_id == 0x8086) && (device_id == 0x7000)));
> +
> +        switch ( class )
> +        {
> +        case 0x0680:
> +            /* PIIX4 ACPI PM. Special device with special PCI config space.
> */
> +            ASSERT((vendor_id == 0x8086) && (device_id == 0x7113));
> +            pci_writew(devfn, 0x20, 0x0000); /* No smb bus IO enable */
> +            pci_writew(devfn, 0xd2, 0x0000); /* No smb bus IO enable */
> +            pci_writew(devfn, 0x22, 0x0000);
> +            pci_writew(devfn, 0x3c, 0x0009); /* Hardcoded IRQ9 */
> +            pci_writew(devfn, 0x3d, 0x0001);
> +            pci_writel(devfn, 0x40, ACPI_PM1A_EVT_BLK_ADDRESS_V1 | 1);
> +            pci_writeb(devfn, 0x80, 0x01); /* enable PM io space */
> +            break;
> +        case 0x0101:
> +            if ( vendor_id == 0x8086 )
> +            {
> +                /* Intel ICHs since PIIX3: enable IDE legacy mode. */
> +                pci_writew(devfn, 0x40, 0x8000); /* enable IDE0 */
> +                pci_writew(devfn, 0x42, 0x8000); /* enable IDE1 */
> +            }
> +            break;
> +        }
> +
> +        /* Map the I/O memory and port resources. */
> +        for ( bar = 0; bar < 7; bar++ )
> +        {
> +            bar_reg = PCI_BASE_ADDRESS_0 + 4*bar;
> +            if ( bar == 6 )
> +                bar_reg = PCI_ROM_ADDRESS;
> +
> +            bar_data = pci_readl(devfn, bar_reg);
> +            pci_writel(devfn, bar_reg, ~0);
> +            bar_sz = pci_readl(devfn, bar_reg);
> +            pci_writel(devfn, bar_reg, bar_data);
> +            if ( bar_sz == 0 )
> +                continue;
> +
> +            bar_sz &= (((bar_data & PCI_BASE_ADDRESS_SPACE) ==
> +                        PCI_BASE_ADDRESS_SPACE_MEMORY) ?
> +                       PCI_BASE_ADDRESS_MEM_MASK :
> +                       (PCI_BASE_ADDRESS_IO_MASK & 0xffff));
> +            bar_sz &= ~(bar_sz - 1);
> +
> +            for ( i = 0; i < nr_bars; i++ )
> +                if ( bars[i].bar_sz < bar_sz )
> +                    break;
> +
> +            if ( i != nr_bars )
> +                memmove(&bars[i+1], &bars[i], (nr_bars-i) * sizeof(*bars));
> +
> +            bars[i].devfn   = devfn;
> +            bars[i].bar_reg = bar_reg;
> +            bars[i].bar_sz  = bar_sz;
> +
> +            if ( (bar_data & PCI_BASE_ADDRESS_SPACE) ==
> +                 PCI_BASE_ADDRESS_SPACE_MEMORY )
> +                mmio_total += bar_sz;
> +
> +            nr_bars++;
> +
> +            /* Skip the upper-half of the address for a 64-bit BAR. */
> +            if ( (bar_data & (PCI_BASE_ADDRESS_SPACE |
> +                              PCI_BASE_ADDRESS_MEM_TYPE_MASK)) ==
> +                 (PCI_BASE_ADDRESS_SPACE_MEMORY |
> +                  PCI_BASE_ADDRESS_MEM_TYPE_64) )
> +                bar++;
> +        }
> +
> +        /* Map the interrupt. */
> +        pin = pci_readb(devfn, PCI_INTERRUPT_PIN);
> +        if ( pin != 0 )
> +        {
> +            /* This is the barber's pole mapping used by Xen. */
> +            link = ((pin - 1) + (devfn >> 3)) & 3;
> +            isa_irq = pci_readb(PCI_ISA_DEVFN, 0x60 + link);
> +            pci_writeb(devfn, PCI_INTERRUPT_LINE, isa_irq);
> +            printf("pci dev %02x:%x INT%c->IRQ%u\n",
> +                   devfn>>3, devfn&7, 'A'+pin-1, isa_irq);
> +        }
> +
> +        /* Enable bus mastering. */
> +        cmd = pci_readw(devfn, PCI_COMMAND);
> +        cmd |= PCI_COMMAND_MASTER;
> +        pci_writew(devfn, PCI_COMMAND, cmd);
> +    }
> +
> +    while ( (mmio_total > (pci_mem_end - pci_mem_start)) &&
> +            ((pci_mem_start << 1) != 0) )
> +        pci_mem_start <<= 1;
> +
> +    while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend )
> +    {
> +        struct xen_add_to_physmap xatp;
> +        if ( hvm_info->high_mem_pgend == 0 )
> +            hvm_info->high_mem_pgend = 1ull << (32 - PAGE_SHIFT);
> +        xatp.domid = DOMID_SELF;
> +        xatp.space = XENMAPSPACE_gmfn;
> +        xatp.idx   = --hvm_info->low_mem_pgend;
> +        xatp.gpfn  = hvm_info->high_mem_pgend++;
> +        if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
> +            BUG();
> +    }
> +
> +    mem_resource.base = pci_mem_start;
> +    mem_resource.max = pci_mem_end;
> +    io_resource.base = 0xc000;
> +    io_resource.max = 0x10000;
> +
> +    /* Assign iomem and ioport resources in descending order of size. */
> +    for ( i = 0; i < nr_bars; i++ )
> +    {
> +        devfn   = bars[i].devfn;
> +        bar_reg = bars[i].bar_reg;
> +        bar_sz  = bars[i].bar_sz;
> +
> +        bar_data = pci_readl(devfn, bar_reg);
> +
> +        if ( (bar_data & PCI_BASE_ADDRESS_SPACE) ==
> +             PCI_BASE_ADDRESS_SPACE_MEMORY )
> +        {
> +            resource = &mem_resource;
> +            bar_data &= ~PCI_BASE_ADDRESS_MEM_MASK;
> +        }
> +        else
> +        {
> +            resource = &io_resource;
> +            bar_data &= ~PCI_BASE_ADDRESS_IO_MASK;
> +        }
> +
> +        base = (resource->base + bar_sz - 1) & ~(bar_sz - 1);
> +        bar_data |= base;
> +        base += bar_sz;
> +
> +        if ( (base < resource->base) || (base > resource->max) )
> +        {
> +            printf("pci dev %02x:%x bar %02x size %08x: no space for "
> +                   "resource!\n", devfn>>3, devfn&7, bar_reg, bar_sz);
> +            continue;
> +        }
> +
> +        resource->base = base;
> +
> +        pci_writel(devfn, bar_reg, bar_data);
> +        printf("pci dev %02x:%x bar %02x size %08x: %08x\n",
> +               devfn>>3, devfn&7, bar_reg, bar_sz, bar_data);
> +
> +        /* Now enable the memory or I/O mapping. */
> +        cmd = pci_readw(devfn, PCI_COMMAND);
> +        if ( (bar_reg == PCI_ROM_ADDRESS) ||
> +             ((bar_data & PCI_BASE_ADDRESS_SPACE) ==
> +              PCI_BASE_ADDRESS_SPACE_MEMORY) )
> +            cmd |= PCI_COMMAND_MEMORY;
> +        else
> +            cmd |= PCI_COMMAND_IO;
> +        pci_writew(devfn, PCI_COMMAND, cmd);
> +    }
> +}
> +
> +static void ovmf_acpi_build_tables(void)
> +{
> +    acpi_build_tables(ACPI_PHYSICAL_ADDRESS);
> +}
> +
> +static void ovmf_create_smbios_tables(void)
> +{
> +    hvm_write_smbios_tables(SMBIOS_PHYSICAL_ADDRESS,
> +                            SMBIOS_PHYSICAL_ADDRESS + sizeof(struct
> smbios_entry_point),
> +                            SMBIOS_PHYSICAL_END);
> +}
> +
> +struct bios_config ovmf32_config =  {
> +    .name = "OVMF-IA32",
> +
> +    .image = ovmf32,
> +    .image_size = sizeof(ovmf32),
> +
> +    .bios_address = 0,
> +
> +    .load_roms = 0,
> +
> +    .optionrom_start = 0,
> +    .optionrom_end = 0,
> +
> +    .bios_load = ovmf_load,
> +
> +    .bios_info_setup = NULL,
> +    .bios_info_finish = NULL,
> +
> +    .vm86_setup = ovmf_init_vm86_tss,
> +    .e820_setup = NULL,
> +    .pci_setup = ovmf_pci_setup,
> +
> +    .acpi_build_tables = ovmf_acpi_build_tables,
> +    .create_mp_tables = NULL,
> +    .create_smbios_tables = ovmf_create_smbios_tables,
> +    .create_pir_tables = NULL,
> +};
> +
> +struct bios_config ovmf64_config =  {
> +    .name = "OVMF-X64",
> +
> +    .image = ovmf64,
> +    .image_size = sizeof(ovmf64),
> +
> +    .bios_address = 0,
> +
> +    .load_roms = 0,
> +
> +    .optionrom_start = 0,
> +    .optionrom_end = 0,
> +
> +    .bios_load = ovmf_load,
> +
> +    .bios_info_setup = NULL,
> +    .bios_info_finish = NULL,
> +
> +    .vm86_setup = ovmf_init_vm86_tss,
> +    .e820_setup = NULL,
> +    .pci_setup = ovmf_pci_setup,
> +
> +    .acpi_build_tables = ovmf_acpi_build_tables,
> +    .create_mp_tables = NULL,
> +    .create_smbios_tables = ovmf_create_smbios_tables,
> +    .create_pir_tables = NULL,
> +};
> +
> +/*
> + * Local variables:
> + * mode: C
> + * c-set-style: "BSD"
> + * c-basic-offset: 4
> + * tab-width: 4
> + * indent-tabs-mode: nil
> + * End:
> + */
> diff -r 0f36c2eec2e1 tools/firmware/ovmf/ovmf-ia32-cirrus-vga.bin
> Binary file tools/firmware/ovmf/ovmf-ia32-cirrus-vga.bin has changed
> diff -r 0f36c2eec2e1 tools/firmware/ovmf/ovmf-ia32.bin
> Binary file tools/firmware/ovmf/ovmf-ia32.bin has changed
> diff -r 0f36c2eec2e1 tools/firmware/ovmf/ovmf-x64-cirrus-vga.bin
> Binary file tools/firmware/ovmf/ovmf-x64-cirrus-vga.bin has changed
> diff -r 0f36c2eec2e1 tools/firmware/ovmf/ovmf-x64.bin
> Binary file tools/firmware/ovmf/ovmf-x64.bin has changed
> 
> 
> 
> 
> 
> 
> # HG changeset patch
> # User gbtju85@xxxxxxxxx
> #
> 
> Xen: Expose hvmloader/bios in libxl.
> 
> Exposes the hvmloader/bios xenstore key in libxl, so firmware loaded
> can be overriden (choices: rombios, seabios, ovmf-ia32, ovmf-x64).
> 
> Sign-off-by: Bei Guan <gbtju85@xxxxxxxxx>
> 
> diff -r 0f36c2eec2e1 tools/libxl/libxl.idl
> --- a/tools/libxl/libxl.idl    Thu Jul 28 15:40:54 2011 +0100
> +++ b/tools/libxl/libxl.idl    Fri Aug 05 18:13:37 2011 +0800
> @@ -137,6 +137,7 @@
>  
>  libxl_domain_create_info = Struct("domain_create_info",[
>      ("type",         libxl_domain_type),
> +    ("hvmbios",      string),
>      ("hap",          bool),
>      ("oos",          bool),
>      ("ssidref",      uint32),
> diff -r 0f36c2eec2e1 tools/libxl/libxl_create.c
> --- a/tools/libxl/libxl_create.c    Thu Jul 28 15:40:54 2011 +0100
> +++ b/tools/libxl/libxl_create.c    Fri Aug 05 18:13:37 2011 +0800
> @@ -407,6 +407,10 @@
>      if (info->poolname)
>          xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/pool_name", vm_path),
> info->poolname, strlen(info->poolname));
>  
> +    if (info->hvmbios){
> +        xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/hvmloader/bios",
> dom_path), info->hvmbios, strlen(info->hvmbios));
> +    }
> +
>      libxl__xs_writev(gc, t, dom_path, info->xsdata);
>      libxl__xs_writev(gc, t, libxl__sprintf(gc, "%s/platform", dom_path),
> info->platformdata);
>  
> diff -r 0f36c2eec2e1 tools/libxl/libxl_dm.c
> --- a/tools/libxl/libxl_dm.c    Thu Jul 28 15:40:54 2011 +0100
> +++ b/tools/libxl/libxl_dm.c    Fri Aug 05 18:13:37 2011 +0800
> @@ -804,6 +804,7 @@
>      char *vm_path;
>      char **pass_stuff;
>      const char *dm;
> +    char *custom_bios;
>  
>      if (info->device_model_stubdomain) {
>          libxl_device_vfb vfb;
> @@ -835,10 +836,13 @@
>          goto out;
>      }
>  
> -    path = libxl__sprintf(gc, "/local/domain/%d/hvmloader", info->domid);
> -    xs_mkdir(ctx->xsh, XBT_NULL, path);
> -    libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "%s/bios", path),
> -                    "%s", libxl__domain_bios(gc, info));
> +    custom_bios = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc,
> "/local/domain/%d/hvmloader/bios", info->domid));
> +    if (!custom_bios) {
> +        path = libxl__sprintf(gc, "/local/domain/%d/hvmloader", info->domid);
> +        xs_mkdir(ctx->xsh, XBT_NULL, path);
> +        libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "%s/bios", path),
> +                        "%s", libxl__domain_bios(gc, info));
> +    }
>  
>      path = libxl__sprintf(gc, "/local/domain/0/device-model/%d",
> info->domid);
>      xs_mkdir(ctx->xsh, XBT_NULL, path);
> diff -r 0f36c2eec2e1 tools/libxl/xl_cmdimpl.c
> --- a/tools/libxl/xl_cmdimpl.c    Thu Jul 28 15:40:54 2011 +0100
> +++ b/tools/libxl/xl_cmdimpl.c    Fri Aug 05 18:13:37 2011 +0800
> @@ -567,6 +567,10 @@
>          }
>      }
>  
> +    if (!xlu_cfg_get_string (config, "hvmbios", &buf)){
> +        c_info->hvmbios = strdup(buf);
> +    }
> +
>      c_info->type = LIBXL_DOMAIN_TYPE_PV;
>      if (!xlu_cfg_get_string (config, "builder", &buf) &&
>          !strncmp(buf, "hvm", strlen(buf)))
> 
> 
> 
> 
> Thanks,
> Bei Guan
> 
> 
> 
> 
> 2011/8/4 Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
>> Keir Fraser writes ("Re: [Xen-devel] [PATCH 2 of 3] Enable UEFI BIOS(OVMF)
>> support in Xen-unstable HVM"):
>>> I'd probably prefer to let xend grow obsolete quietly than add further
>>> features. Noone's maintaining it to fix it up if new features break it. No
>>> strong opinion on that though, it's up to the tools maintainers.
>> 
>> I would agree.  I would want a compelling reason (or strong community
>> support) to accept new feature patches to xend.
>> 
>> Ian.
> 
> 



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