[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 2 of 3] Enable UEFI BIOS(OVMF) support in Xen-unstable HVM



On Tue, 2011-08-09 at 13:56 +0100, Bei Guan wrote:

>         
>         >
>         > # 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
>         
>         
>         What is the difference between these versions of the VGA BIOS and the 
> existing one?
> I am unsure what is the difference between OVMF VGA BIOS and the existing one 
> in firmware/vgabios. Maybe Andrei or Jordan can give the answer.

Yes please.

> 
> 
>  
>         
>         It seems like you only checking the binaries, where is the source and 
> what is its license?
> The source code of OVMF BIOS is available at
> https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/OvmfPkg/ .
> And the license is BSD license.
> 
> 
> Building the OVMF BIOS needs the environment edk2, whose source code is 
> available at 
> https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/ .
> I am afraid OVMF source code can't be downloaded and built in Xen compiling 
> environment.
> So, I just provide the binary files of OVMF VGA and OVMF BIOS firmware.

Oh, I see.

Generally we would like to avoid adding new external projects to the Xen
source tree. Long term we would instead like to see a kind of "meta"
build system which pulls together Xen and the various bits and pieces.

In the seabios case we decided not to pull any bits seabios into
xen.hg/tools/firmware/seabios/ but rather to provide a configuration
variable which would point to a built seabios.git tree. I think a
similar model would make sense for the OVMF support. IOW OVMF_DIR = ""
by default (OVMF disabled), users who want OVMF can obtain and build
OVMF and then set OVMF_DIR to point this built tree. (eventually this
step  will be subsumed into the "meta" build system)

> 
> 
>  
>         
>         With SeaBIOS we moved to a model of loading option ROMs from the
>         emulated devices themselves (via the ROM BAR). Could this be used for
>         OVMF too? 
> Do you mean use the bios->load_roms to load OVMF VGA BIOS instead of loading 
> it in bios_load?

No. Hardware devices have a special BAR which can be used to map their
option ROM. BIOSes (i.e. real ones on physical machines) use this in
order to map the option ROMs and copy or run them etc. SeaBIOS also
supports this and qemu supports emulating these BARs for the given
devices by providing the contents of a specific file on the host file
system and so we don't load any VGA BIOS in hvmloader in that case and
just let seabios and qemu take care of it via this mechanism.

So what I'm suggesting is that OVMF should (and possibly already does)
support this operation and should load the VGA rom itself from the VGA
devices ROM BAR. If the VGABIOS for OVMF needs to be different to what
would be normally need with a legacy BIOS then we can enhance QEMU to
provide the option to request alternative ROM images be used.

This model makes sense since a device's option-ROM is tied more to the
specific device than it is to the BIOS etc.

>  
>         
>         > +
>         >  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, },
>         
>         
>         I suppose these (asymmetric) names are OVMF-isms?
> Yes, these two are the names of OVMF BIOS in platform IA32 and X64.

Ick, but oh well...

Is there any reason to prefer one to the other? How do I choose which
one I want? Can it be autodetected?

>         > +
>         > +/*
>         > + * 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)
>         > +{
>         
>         > [...]
>         > +}
>         
>         This function looks very similar to (a slightly out of date version 
> of)
>         the standard pci_setup. What (if any) are the actual differences?

> The difference is that in ovmf_pci_setup(), we remove the code related to VGA 
> setup, because we need to use the OVMF VGA bios.
> However, after Keir's comments, we have some testing and find that 
> pci_setup() also works well for loading OVMF BIOS.
> So, we will remove the ovmf_pci_setup() and use the existing pci_setup() 
> function.

Great.

Ian.




_______________________________________________
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®.