[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.