From 5f82d0858de183bff785f0fbbee16469e08f210b Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Wed, 20 Apr 2011 17:13:06 +0100 Subject: [PATCH] tools: support SeaBIOS. Use by default when upstream qemu is configured. The SeaBIOS integration here is only semi-complete and is targetted at developers and very early adopters who can be expected to cope with some rough edges. In particular the user must clone, patch as necessary and compile SeaBIOS themselves since this patchset does not cover any of that (in the same way we currently do not integrate upstream qemu clone+build). Include a big comment to that effect next to the Config.mk option. Many of the bios_config callback functions are not yet used by SeaBIOS. Signed-off-by: Ian Campbell Acked-by: Ian Jackson Committed-by: Ian Jackson --- Config.mk | 12 ++++ tools/firmware/hvmloader/Makefile | 17 ++++- tools/firmware/hvmloader/config-seabios.h | 9 +++ tools/firmware/hvmloader/config.h | 1 + tools/firmware/hvmloader/hvmloader.c | 5 ++ tools/firmware/hvmloader/seabios.c | 75 +++++++++++++++++++++++ tools/libxl/libxl_dm.c | 3 +- 7 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 tools/firmware/hvmloader/config-seabios.h create mode 100644 tools/firmware/hvmloader/seabios.c 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; } } -- 2.39.5