WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 11 of 11] tools: hvmloader: build and install hvmload

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH 11 of 11] tools: hvmloader: build and install hvmloader-seabios
From: Ian Campbell <ian.campbell@xxxxxxxxxx>
Date: Tue, 05 Apr 2011 16:46:36 +0100
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Tue, 05 Apr 2011 08:58:25 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1302018385@xxxxxxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <patchbomb.1302018385@xxxxxxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mercurial-patchbomb/1.6.4
# 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

<Prev in Thread] Current Thread [Next in Thread>