[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 25/07/2011 15:03, "Konrad Rzeszutek Wilk" <konrad.wilk@xxxxxxxxxx> wrote: > 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? Open Virtual Machine Firmware. It looks to be a build/branch of EDK (used to be called Tianocore?) which is Intel's BSD-licensed UEFI BIOS implementation. Good to have I guess. :-) -- Keir >> 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 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |