diff --git a/Config.mk b/Config.mk index 0693b34c82..97b8d5b23d 100644 --- a/Config.mk +++ b/Config.mk @@ -184,6 +184,18 @@ QEMU_TAG := xen-4.1.0-rc6 # Fri Feb 11 17:54:51 2011 +0000 # qemu-xen: fix segfault with empty cdroms +# Short answer -- do not enable this unless you know what you are +# doing and are prepared for some pain. + +# SeaBIOS integration is a work in progress. Before enabling this +# option you must clone git://git.qemu.org/seabios.git/, possibly add +# some development patches and then build it yourself before pointing +# this variable to it (using an absolute path). +# +# Note that using SeaBIOS requires the use the upstream qemu as the +# device model. +SEABIOS_DIR ?= + # Optional components XENSTAT_XENTOP ?= y VTPM_TOOLS ?= n diff --git a/tools/firmware/hvmloader/Makefile b/tools/firmware/hvmloader/Makefile index 9f121a469f..b32954c79d 100644 --- a/tools/firmware/hvmloader/Makefile +++ b/tools/firmware/hvmloader/Makefile @@ -40,9 +40,16 @@ CIRRUSVGA_DEBUG ?= n ROMBIOS_DIR := ../rombios ifneq ($(ROMBIOS_DIR),) OBJS += rombios.o +CFLAGS += -DENABLE_ROMBIOS ROMBIOS_ROM := $(ROMBIOS_DIR)/BIOS-bochs-latest endif +ifneq ($(SEABIOS_DIR),) +OBJS += seabios.o +CFLAGS += -DENABLE_SEABIOS +SEABIOS_ROM := $(SEABIOS_DIR)/out/bios.bin +endif + STDVGA_ROM := ../vgabios/VGABIOS-lgpl-latest.bin ifeq ($(CIRRUSVGA_DEBUG),y) CIRRUSVGA_ROM := ../vgabios/VGABIOS-lgpl-latest.cirrus.debug.bin @@ -54,7 +61,7 @@ endif all: subdirs-all $(MAKE) hvmloader -rombios.o hvmloader.o: roms.inc +rombios.o seabios.o hvmloader.o: roms.inc smbios.o: CFLAGS += -D__SMBIOS_DATE__="\"$(shell date +%m/%d/%Y)\"" hvmloader: $(OBJS) acpi/acpi.a @@ -62,7 +69,7 @@ hvmloader: $(OBJS) acpi/acpi.a $(OBJCOPY) hvmloader.tmp hvmloader rm -f hvmloader.tmp -roms.inc: $(ROMBIOS_ROM) $(STDVGA_ROM) $(CIRRUSVGA_ROM) ../etherboot/eb-roms.h +roms.inc: $(ROMBIOS_ROM) $(SEABIOS_ROM) $(STDVGA_ROM) $(CIRRUSVGA_ROM) ../etherboot/eb-roms.h echo "/* Autogenerated file. DO NOT EDIT */" > $@.new ifneq ($(ROMBIOS_ROM),) @@ -71,6 +78,12 @@ ifneq ($(ROMBIOS_ROM),) echo "#endif" >> $@.new endif +ifneq ($(SEABIOS_ROM),) + echo "#ifdef ROM_INCLUDE_SEABIOS" >> $@.new + sh ./mkhex seabios $(SEABIOS_ROM) >> $@.new + echo "#endif" >> $@.new +endif + ifneq ($(STDVGA_ROM),) echo "#ifdef ROM_INCLUDE_VGABIOS" >> $@.new sh ./mkhex vgabios_stdvga $(STDVGA_ROM) >> $@.new diff --git a/tools/firmware/hvmloader/config-seabios.h b/tools/firmware/hvmloader/config-seabios.h new file mode 100644 index 0000000000..864e4e8754 --- /dev/null +++ b/tools/firmware/hvmloader/config-seabios.h @@ -0,0 +1,9 @@ +#ifndef __HVMLOADER_CONFIG_SEABIOS_H__ +#define __HVMLOADER_CONFIG_SEABIOS_H__ + +#define OPTIONROM_PHYSICAL_ADDRESS 0x000C8000 +#define OPTIONROM_PHYSICAL_END 0x000E0000 + +#define SEABIOS_PHYSICAL_ADDRESS 0x000E0000 + +#endif /* __HVMLOADER_CONFIG_SEABIOS_H__ */ diff --git a/tools/firmware/hvmloader/config.h b/tools/firmware/hvmloader/config.h index 296d500af0..8599adae1a 100644 --- a/tools/firmware/hvmloader/config.h +++ b/tools/firmware/hvmloader/config.h @@ -40,6 +40,7 @@ struct bios_config { }; extern struct bios_config rombios_config; +extern struct bios_config seabios_config; #define PAGE_SHIFT 12 #define PAGE_SIZE (1ul << PAGE_SHIFT) diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c index 855087499d..6964f5084d 100644 --- a/tools/firmware/hvmloader/hvmloader.c +++ b/tools/firmware/hvmloader/hvmloader.c @@ -341,7 +341,12 @@ struct bios_info { const char *key; const struct bios_config *bios; } bios_configs[] = { +#ifdef ENABLE_ROMBIOS { "rombios", &rombios_config, }, +#endif +#ifdef ENABLE_SEABIOS + { "seabios", &seabios_config, }, +#endif { NULL, NULL } }; diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c new file mode 100644 index 0000000000..534b421f43 --- /dev/null +++ b/tools/firmware/hvmloader/seabios.c @@ -0,0 +1,75 @@ +/* + * HVM SeaBIOS support. + * + * Leendert van Doorn, leendert@watson.ibm.com + * 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 "config-seabios.h" + +#include "util.h" + +#define ROM_INCLUDE_SEABIOS +#include "roms.inc" + +static void seabios_pci_setup(void) +{ + virtual_vga = VGA_cirrus; +} + +//BUILD_BUG_ON(sizeof(seabios) > (0x00100000U - SEABIOS_PHYSICAL_ADDRESS)); + +struct bios_config seabios_config = { + .name = "SeaBIOS", + + .image = seabios, + .image_size = sizeof(seabios), + + .bios_address = SEABIOS_PHYSICAL_ADDRESS, + + .smbios_start = 0, + .smbios_end = 0, + + .optionrom_start = OPTIONROM_PHYSICAL_ADDRESS, + .optionrom_end = OPTIONROM_PHYSICAL_END, + + .acpi_start = 0, + + .bios_info_setup = NULL, + + .apic_setup = NULL, + .pci_setup = seabios_pci_setup, + .smp_setup = NULL, + + .vm86_setup = NULL, + .e820_setup = NULL, + + .acpi_build_tables = NULL, + .create_mp_tables = NULL, +}; + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index b24fd0383c..5e80bbd1e1 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -65,7 +65,6 @@ const char *libxl__domain_device_model(libxl__gc *gc, break; } } - return dm; } @@ -74,7 +73,7 @@ static char *libxl__domain_bios(libxl__gc *gc, { switch (info->device_model_version) { case 1: return libxl__strdup(gc, "rombios"); - case 2: return libxl__strdup(gc, "rombios"); + case 2: return libxl__strdup(gc, "seabios"); default:return NULL; } }