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: Keir Fraser <keir@xxxxxxx>
Subject: Re: [Xen-devel] [PATCH 2 of 3] Enable UEFI BIOS(OVMF) support in Xen-unstable HVM
From: Ian Campbell <Ian.Campbell@xxxxxxxxxxxxx>
Date: Tue, 9 Aug 2011 10:58:11 +0100
Cc: Devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, Deegan <Tim.Deegan@xxxxxxxxxxxxx>, Xen, "edk2-devel@xxxxxxxxxxxxxxxxxxxxx" <edk2-devel@xxxxxxxxxxxxxxxxxxxxx>, Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>, Andrei Warkentin <andreiw@xxxxxxxxxxxx>, Tim, Jordan Justen <jljusten@xxxxxxxxx>, Bei Guan <gbtju85@xxxxxxxxx>
Delivery-date: Tue, 09 Aug 2011 03:01:04 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <CA612D10.1A144%keir@xxxxxxx>
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>
Organization: Citrix Systems, Inc.
References: <CA612D10.1A144%keir@xxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
On Fri, 2011-08-05 at 13:16 +0100, Keir Fraser wrote:
> 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.
> 
> Apart from the pci_setup hook I just emailed about, hopefully we can avoid
> code duplication in the init_vm86_tss hook as well. I'm not sure why we even
> need the hook -- I'll need to check what it's for with Ian Campbell (cc'ed).

I dunno ;-) I had assumed it was a rombios specific thing when I
refactored for SeaBIOS (which doesn't implement the hook).

Thinking about it again is this VM86 TSS a hangover from the days where
we used to "emulate" realmode using vm86 in the HVM guest context (IIRC
that was called vmxassist?). Perhaps the hook can be simply dropped?

Aha:
        changeset:   18891:6595393a3d28
        user:        Keir Fraser <keir.fraser@xxxxxxxxxx>
        date:        Tue Dec 09 16:28:02 2008 +0000
        files:       [...]
        description:
        Use virtual 8086 mode for VMX guests with CR0.PE == 0
        
        When a VMX guest tries to enter real mode, put it in virtual 8086 mode
        instead, if that's possible.  Handle all errors and corner cases by
        falling back to the real-mode emulator.
        
        This is similar to the old VMXASSIST system except it uses Xen's
        x86_emulate emulator instead of having a partial emulator in the guest
        firmware.  It more than doubles the speed of real-mode operation on
        VMX.
        
        Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx>

Looks like it is actually needed for all BIOS types?

Ian.

> 
>  - Keir
> 
> > 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
> >
> >
> > 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