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: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH 2 of 3] Enable UEFI BIOS(OVMF) support in Xen-unstable HVM
From: Bei Guan <gbtju85@xxxxxxxxx>
Date: Fri, 5 Aug 2011 19:20:24 +0800
Cc: Xen Devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, Tim Deegan <Tim.Deegan@xxxxxxxxxx>, edk2-devel@xxxxxxxxxxxxxxxxxxxxx, Andrei Warkentin <andreiw@xxxxxxxxxxxx>, Keir Fraser <keir.xen@xxxxxxxxx>, Jordan Justen <jljusten@xxxxxxxxx>
Delivery-date: Fri, 05 Aug 2011 04:21:33 -0700
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=eBYacQu1PFGd8I53GHwtoirZGnKMkPnAT2fSCYG0ihk=; b=KW8eNj/1IBCw+7S9iWjK6AkPKoOSUTjhdvFB5u2vX30uMEIUMVpCk+4S+Ya3UvAl7s aCdrSokeoBMajTJ8T6S0zb8+IAhzTvayi72gqZIaTbcv9RqDuTcPPXY9VvppcH+DwQV4 t+Z89aVUdnoN5xmGIbEIgi1Nf2Tv54fycrEyI=
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <20026.48387.889557.9445@xxxxxxxxxxxxxxxxxxxxxxxx>
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>
References: <CAEQjb-SRJ7243mf0cEHZPUpt_hfXcBdZgs1AGL_Ep144HpRkrg@xxxxxxxxxxxxxx> <CA4F6783.1E6DB%keir.xen@xxxxxxxxx> <20026.48387.889557.9445@xxxxxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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


The patches are also available at
https://github.com/GavinGuan/gavinguan/blob/master/xen/ovmf-support/ovmf_xen_support.patch
https://github.com/GavinGuan/gavinguan/blob/master/xen/ovmf-support/ovmf_xl.patch
https://github.com/GavinGuan/gavinguan/blob/master/xen/ovmf-support/ovmf_firmware.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.

Attachment: ovmf_xen_support.patch
Description: Text Data

Attachment: ovmf_xl.patch
Description: Text Data

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