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
|