# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1302013752 -3600
# Node ID e471a31bf22626a5686c3d17141cdb9a6a65abbe
# Parent c387185f0a254c794b73d71d282fb941d3de5d98
tools: hvmloader: build and install hvmloader-seabios
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
diff -r c387185f0a25 -r e471a31bf226 .hgignore
--- a/.hgignore Tue Apr 05 15:29:12 2011 +0100
+++ b/.hgignore Tue Apr 05 15:29:12 2011 +0100
@@ -143,6 +143,7 @@
^tools/firmware/hvmloader/acpi/dsdt.*\.c$
^tools/firmware/hvmloader/acpi/ssdt_.*\.h$
^tools/firmware/hvmloader/hvmloader-rombios$
+^tools/firmware/hvmloader/hvmloader-seabios$
^tools/firmware/hvmloader/roms\.h$
^tools/firmware/rombios/BIOS-bochs-[^/]*$
^tools/firmware/rombios/_rombios[^/]*_\.c$
diff -r c387185f0a25 -r e471a31bf226 Config.mk
--- a/Config.mk Tue Apr 05 15:29:12 2011 +0100
+++ b/Config.mk Tue Apr 05 15:29:12 2011 +0100
@@ -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 -r c387185f0a25 -r e471a31bf226 tools/firmware/Makefile
--- a/tools/firmware/Makefile Tue Apr 05 15:29:12 2011 +0100
+++ b/tools/firmware/Makefile Tue Apr 05 15:29:12 2011 +0100
@@ -3,6 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk
# hvmloader is a 32-bit protected mode binary.
TARGET_ROMBIOS := hvmloader/hvmloader-rombios
+TARGET_SEABIOS := hvmloader/hvmloader-seabios
INST_DIR := $(DESTDIR)$(XENFIRMWAREDIR)
SUBDIRS :=
@@ -28,6 +29,7 @@ install: all
[ -d $(INST_DIR) ] || $(INSTALL_DIR) $(INST_DIR)
[ ! -e $(TARGET_ROMBIOS) ] || $(INSTALL_DATA) $(TARGET_ROMBIOS)
$(INST_DIR)
[ ! -e $(TARGET_ROMBIOS) ] || ln -nfs hvmloader-rombios
$(INST_DIR)/hvmloader
+ [ ! -e $(TARGET_SEABIOS) ] || $(INSTALL_DATA) $(TARGET_SEABIOS)
$(INST_DIR)
.PHONY: clean
clean: subdirs-clean
diff -r c387185f0a25 -r e471a31bf226 tools/firmware/hvmloader/Makefile
--- a/tools/firmware/hvmloader/Makefile Tue Apr 05 15:29:12 2011 +0100
+++ b/tools/firmware/hvmloader/Makefile Tue Apr 05 15:29:12 2011 +0100
@@ -36,6 +36,10 @@ endif
OBJS = $(patsubst %.c,%.o,$(SRCS))
TARGETS := hvmloader-rombios
+ifneq ($(SEABIOS_DIR),)
+TARGETS += hvmloader-seabios
+ROM_SEABIOS := $(SEABIOS_DIR)/out/bios.bin
+endif
CIRRUSVGA_DEBUG ?= n
@@ -46,6 +50,9 @@ all: subdirs-all
hvmloader-rombios.o: hvmloader.c roms.h
$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_$*.o) -DBIOS_ROM_rombios=1
-DBIOS_ROM_STR=\"ROMBIOS\" -c -o $@ hvmloader.c
+hvmloader-seabios.o: hvmloader.c roms.h
+ $(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_$*.o) -DBIOS_ROM_seabios=1
-DBIOS_ROM_STR=\"SeaBIOS\" -c -o $@ hvmloader.c
+
smbios.o: CFLAGS += -D__SMBIOS_DATE__="\"$(shell date +%m/%d/%Y)\""
hvmloader-%: hvmloader-%.o $(OBJS) acpi/acpi.a
@@ -54,13 +61,19 @@ hvmloader-%: hvmloader-%.o $(OBJS) acpi/
rm -f $@.tmp
roms.h: ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin \
- ../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../etherboot/eb-roms.h
+ ../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../etherboot/eb-roms.h
$(ROM_SEABIOS)
echo "/* Autogenerated file. DO NOT EDIT */" > roms.h
echo "#ifdef BIOS_ROM_rombios" >> roms.h
sh ./mkhex biosimg ../rombios/BIOS-bochs-latest >> roms.h
echo "#endif" >> roms.h
+ifneq ($(ROM_SEABIOS),)
+ echo "#ifdef BIOS_ROM_seabios" >> roms.h
+ sh ./mkhex biosimg $(ROM_SEABIOS) >> roms.h
+ echo "#endif" >> roms.h
+endif
+
sh ./mkhex vgabios_stdvga ../vgabios/VGABIOS-lgpl-latest.bin >> roms.h
ifeq ($(CIRRUSVGA_DEBUG),y)
sh ./mkhex vgabios_cirrusvga \
@@ -77,5 +90,6 @@ clean: subdirs-clean
rm -f roms.h acpi.h
rm -f hvmloader hvmloader.tmp *.o $(DEPS)
rm -f hvmloader-rombios hvmloader-rombios.tmp
+ rm -f hvmloader-seabios hvmloader-seabios.tmp
-include $(DEPS)
diff -r c387185f0a25 -r e471a31bf226 tools/firmware/hvmloader/config-seabios.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/firmware/hvmloader/config-seabios.h Tue Apr 05 15:29:12 2011 +0100
@@ -0,0 +1,13 @@
+#ifndef __HVMLOADER_CONFIG_SEABIOS_H__
+#define __HVMLOADER_CONFIG_SEABIOS_H__
+
+/* Memory map. */
+#define VGABIOS_PHYSICAL_ADDRESS 0x000C0000
+#define OPTIONROM_PHYSICAL_ADDRESS 0x000C8000
+
+#define OPTIONROM_PHYSICAL_END 0x000E0000
+
+#define BIOS_PHYSICAL_ADDRESS 0x000E0000
+#define BIOS_MAXIMUM_SIZE (0x00100000 - BIOS_PHYSICAL_ADDRESS)
+
+#endif /* __HVMLOADER_CONFIG_SEABIOS_H__ */
diff -r c387185f0a25 -r e471a31bf226 tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c Tue Apr 05 15:29:12 2011 +0100
+++ b/tools/firmware/hvmloader/hvmloader.c Tue Apr 05 15:29:12 2011 +0100
@@ -36,6 +36,8 @@
#if defined(BIOS_ROM_rombios)
# include "../rombios/config.h"
# include "../rombios/e820.h"
+#elif defined(BIOS_ROM_seabios)
+# include "config-seabios.h"
#else
# error "Building for unknown BIOS"
#endif
@@ -156,6 +158,7 @@ static void init_hypercalls(void)
printf("Detected Xen v%u.%u%s\n", eax >> 16, eax & 0xffff, extraversion);
}
+#ifdef BIOS_ROM_rombios
static void apic_setup(void)
{
/* Set the IOAPIC ID to the static value used in the MP/ACPI tables. */
@@ -170,7 +173,9 @@ static void apic_setup(void)
ioapic_write(0x10, APIC_DM_EXTINT);
ioapic_write(0x11, SET_APIC_ID(LAPIC_ID(0)));
}
+#endif
+#ifdef BIOS_ROM_rombios
static void pci_setup(void)
{
uint32_t base, devfn, bar_reg, bar_data, bar_sz, cmd, mmio_total = 0;
@@ -380,6 +385,7 @@ static void pci_setup(void)
pci_writew(devfn, PCI_COMMAND, cmd);
}
}
+#endif
/*
* Scan the list of Option ROMs at @roms for one which supports
@@ -496,6 +502,7 @@ static int scan_etherboot_nic(uint32_t c
return rom_size;
}
+#ifdef BIOS_ROM_rombios
/*
* Scan the PCI bus for the devices that have an option ROM, and copy
* the corresponding rom data to rom_phys_addr.
@@ -538,6 +545,7 @@ static int pci_load_option_roms(uint32_t
return rom_phys_addr - rom_base_addr;
}
+#endif
/* Replace possibly erroneous memory-size CMOS fields with correct values. */
static void cmos_write_memory_size(void)
@@ -565,6 +573,7 @@ static void cmos_write_memory_size(void)
cmos_outb(0x35, (uint8_t)( alt_mem >> 8));
}
+#ifdef BIOS_ROM_rombios
/*
* 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
@@ -583,7 +592,9 @@ static void init_vm86_tss(void)
hypercall_hvm_op(HVMOP_set_param, &p);
printf("vm86 TSS at %08lx\n", virt_to_phys(tss));
}
+#endif
+#ifdef BIOS_ROM_rombios
static void dump_e820_table(void)
{
struct e820entry *e820 = E820;
@@ -702,18 +713,23 @@ static void build_e820_table(void)
*E820_NR = nr;
}
+#endif
int main(void)
{
int option_rom_sz = 0, vgabios_sz = 0, etherboot_sz = 0;
- int smbios_sz;
- uint32_t etherboot_phys_addr, option_rom_phys_addr, bios32_addr;
+#ifdef BIOS_ROM_rombios
+ int smbios_sz = 0;
+ uint32_t bios32_addr;
struct bios_info *bios_info;
+#endif
+ uint32_t etherboot_phys_addr, option_rom_phys_addr;
printf("HVM Loader\n");
init_hypercalls();
+#ifdef BIOS_ROM_rombios
printf("CPU speed is %u MHz\n", get_cpu_mhz());
xenbus_setup();
@@ -728,15 +744,22 @@ int main(void)
smbios_sz = hvm_write_smbios_tables(SCRATCH_PHYSICAL_ADDRESS,
SMBIOS_PHYSICAL_ADDRESS,
SMBIOS_MAXIMUM_SIZE);
+#endif
printf("Loading " BIOS_ROM_STR "...\n");
BUILD_BUG_ON(sizeof(biosimg) > BIOS_MAXIMUM_SIZE);
memcpy((void *)BIOS_PHYSICAL_ADDRESS, biosimg, sizeof(biosimg));
+#ifdef BIOS_ROM_rombios
bios32_addr = highbios_setup();
if ( (hvm_info->nr_vcpus > 1) || hvm_info->apic_mode )
create_mp_tables();
+#endif
+
+#ifdef BIOS_ROM_seabios
+ virtual_vga = VGA_cirrus;
+#endif
switch ( virtual_vga )
{
@@ -763,30 +786,40 @@ int main(void)
}
etherboot_phys_addr = VGABIOS_PHYSICAL_ADDRESS + vgabios_sz;
+#ifdef BIOS_ROM_rombios
if ( etherboot_phys_addr < OPTIONROM_PHYSICAL_ADDRESS )
etherboot_phys_addr = OPTIONROM_PHYSICAL_ADDRESS;
+#endif
etherboot_sz = scan_etherboot_nic(etherboot_phys_addr);
option_rom_phys_addr = etherboot_phys_addr + etherboot_sz;
+#ifdef BIOS_ROM_rombios
option_rom_sz = pci_load_option_roms(option_rom_phys_addr);
+#endif
+#ifdef BIOS_ROM_rombios
if ( hvm_info->acpi_enabled )
+#endif
{
struct xen_hvm_param p = {
.domid = DOMID_SELF,
.index = HVM_PARAM_ACPI_IOPORTS_LOCATION,
.value = 1,
};
+#ifdef BIOS_ROM_rombios
struct acpi_parameters acpi_params = {
.phys = ACPI_PHYSICAL_ADDRESS,
};
printf("Loading ACPI ...\n");
acpi_build_tables(&acpi_params);
+#endif
hypercall_hvm_op(HVMOP_set_param, &p);
}
+#ifdef BIOS_ROM_rombios
init_vm86_tss();
+#endif
cmos_write_memory_size();
@@ -803,14 +836,17 @@ int main(void)
printf(" %05x-%05x: PCI Option ROMs\n",
option_rom_phys_addr,
option_rom_phys_addr + option_rom_sz - 1);
+#ifdef BIOS_ROM_rombios
if ( smbios_sz )
printf(" %05x-%05x: SMBIOS tables\n",
SMBIOS_PHYSICAL_ADDRESS,
SMBIOS_PHYSICAL_ADDRESS + smbios_sz - 1);
+#endif
printf(" %05x-%05x: Main BIOS\n",
BIOS_PHYSICAL_ADDRESS,
BIOS_PHYSICAL_ADDRESS + sizeof(biosimg) - 1);
+#ifdef BIOS_ROM_rombios
build_e820_table();
dump_e820_table();
@@ -827,6 +863,7 @@ int main(void)
bios_info->bios32_entry = bios32_addr;
xenbus_shutdown();
+#endif
printf("Invoking " BIOS_ROM_STR " ...\n");
return 0;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|