[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1 of 3] Enable UEFI BIOS(OVMF) support in Xen-unstable HVM
On Sat, Jul 23, 2011 at 12:23:16AM +0800, Bei Guan wrote: > Hi, > > My name is Bei Guan and I am one of this year's GSOS students for Tianocore. > My project is to enable Xen support in OVMF and the following is about my What does OVMF stand for? > patch for Xen-unstable. Could you give me some comments? Thank you very > much. > > This patch can enable Xen-unstable hvmloader to load OVMF BIOS as Xen HVM > UEFI support. It supports OVMF BIOS in IA32 and X86 environment. The loaded > OVMF BIOS can get Xen SMBIOS and ACPI tables contents inside itself. > > In order to be clear, I divide the patch into three parts: > ovmf_xen_support.patch Enable Xen hvmloader to load OVMF > ovmf_firmware.patch OVMF binary files > ovmf_xl_xend.patch Add hvmloader/bios xenstore key in libxl and xend > > > 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: > You should enable the HVM guest ACPI: acpi=1 > You can 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' ] > > > *ovmf_xen_support.patch:* > ------ > > # HG changeset patch > # User gbtju85@xxxxxxxxx > # > > diff -r e298ce67777e tools/firmware/hvmloader/Makefile > --- a/tools/firmware/hvmloader/Makefile Mon Jul 18 14:38:31 2011 +0100 > +++ b/tools/firmware/hvmloader/Makefile Fri Jul 22 23:00:20 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 e298ce67777e tools/firmware/hvmloader/config.h > --- a/tools/firmware/hvmloader/config.h Mon Jul 18 14:38:31 2011 +0100 > +++ b/tools/firmware/hvmloader/config.h Fri Jul 22 23:00:20 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 { > @@ -16,6 +16,9 @@ > /* Physical address to load at */ > unsigned int bios_address; > > + /* Custom load function. */ > + void (*load)(const struct bios_config *config); > + void (*pci_setup)(void); > /* ROMS */ > int load_roms; > unsigned int optionrom_start, optionrom_end; > @@ -36,6 +39,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 e298ce67777e tools/firmware/hvmloader/hvmloader.c > --- a/tools/firmware/hvmloader/hvmloader.c Mon Jul 18 14:38:31 2011 +0100 > +++ b/tools/firmware/hvmloader/hvmloader.c Fri Jul 22 23:00:20 2011 +0800 > @@ -360,6 +360,8 @@ > #ifdef ENABLE_SEABIOS > { "seabios", &seabios_config, }, > #endif > + { "ovmf-ia32", &ovmf32_config, }, > + { "ovmf-x64", &ovmf64_config, }, > { NULL, NULL } > }; > > @@ -416,9 +418,13 @@ > bios->create_smbios_tables(); > } > > - printf("Loading %s ...\n", bios->name); > - memcpy((void *)bios->bios_address, bios->image, > - bios->image_size); > + if (bios->load) { You don't want the printf on this line? > + bios->load(bios); > + } else { > + printf("Loading %s ...\n", bios->name); > + memcpy((void *)bios->bios_address, bios->image, > + bios->image_size); > + } > > if (bios->bios_relocate) > bios->bios_relocate(); > @@ -451,8 +457,10 @@ > vgabios_sz = round_option_rom( > (*(uint8_t *)(VGABIOS_PHYSICAL_ADDRESS+2)) * 512); > break; > + case VGA_custom: > + break; > default: > - printf("No emulated VGA adaptor ...\n"); > + printf("No emulated VGA adaptor ROM...\n"); > break; > } > > diff -r e298ce67777e tools/firmware/hvmloader/ovmf.c > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/tools/firmware/hvmloader/ovmf.c Fri Jul 22 23:00:20 2011 +0800 > @@ -0,0 +1,189 @@ > +/* > + * 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. Get rid of the address. That is not neccessary in anymore. > + */ > + > +#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; > + > + BUG_ON(mem_back_ram(mfn)); > + } > + > + printf("Initialized FD backing pages...\n"); > + > + /* Copy FD. */ What is FD? _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |