aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2011-06-01 16:39:55 +0100
committerIan Campbell <ian.campbell@citrix.com>2011-06-01 16:39:55 +0100
commit1be247c03cba02af4466607ed698f69cde971157 (patch)
treedfa06ea95b0c08e90327af1ed4b7e8d3adaaf273 /tools
parent433a581709b9c5d053e3a40d73c937584545adb9 (diff)
downloadxen-1be247c03cba02af4466607ed698f69cde971157.tar.gz
xen-1be247c03cba02af4466607ed698f69cde971157.tar.bz2
xen-1be247c03cba02af4466607ed698f69cde971157.zip
hvmloader: allow per-BIOS decision on loading option ROMS
SeaBIOS has functionality to load ROMs from the PCI device directly, it makes sense to use this when it is available. Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/firmware/hvmloader/config-seabios.h3
-rw-r--r--tools/firmware/hvmloader/config.h3
-rw-r--r--tools/firmware/hvmloader/hvmloader.c65
-rw-r--r--tools/firmware/hvmloader/rombios.c2
-rw-r--r--tools/firmware/hvmloader/seabios.c6
5 files changed, 42 insertions, 37 deletions
diff --git a/tools/firmware/hvmloader/config-seabios.h b/tools/firmware/hvmloader/config-seabios.h
index 864e4e8754..56fb7bceae 100644
--- a/tools/firmware/hvmloader/config-seabios.h
+++ b/tools/firmware/hvmloader/config-seabios.h
@@ -1,9 +1,6 @@
#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 8599adae1a..3670a6619d 100644
--- a/tools/firmware/hvmloader/config.h
+++ b/tools/firmware/hvmloader/config.h
@@ -19,7 +19,8 @@ struct bios_config {
/* SMBIOS */
unsigned int smbios_start, smbios_end;
- /* Option ROMs */
+ /* ROMS */
+ int load_roms;
unsigned int optionrom_start, optionrom_end;
/* ACPI tables */
diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c
index 6964f5084d..a7920de90f 100644
--- a/tools/firmware/hvmloader/hvmloader.c
+++ b/tools/firmware/hvmloader/hvmloader.c
@@ -373,7 +373,7 @@ int main(void)
uint32_t highbios = 0;
const struct bios_config *bios;
int option_rom_sz = 0, vgabios_sz = 0, etherboot_sz = 0, smbios_sz = 0;
- uint32_t etherboot_phys_addr, option_rom_phys_addr;
+ uint32_t etherboot_phys_addr = 0, option_rom_phys_addr = 0;
/* Initialise hypercall stubs with RET, rendering them no-ops. */
memset((void *)HYPERCALL_PHYSICAL_ADDRESS, 0xc3 /* RET */, PAGE_SIZE);
@@ -417,39 +417,42 @@ int main(void)
( (hvm_info->nr_vcpus > 1) || hvm_info->apic_mode ) )
bios->create_mp_tables();
- switch ( virtual_vga )
+ if ( bios->load_roms )
{
- case VGA_cirrus:
- printf("Loading Cirrus VGABIOS ...\n");
- memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
- vgabios_cirrusvga, sizeof(vgabios_cirrusvga));
- vgabios_sz = round_option_rom(sizeof(vgabios_cirrusvga));
- break;
- case VGA_std:
- printf("Loading Standard VGABIOS ...\n");
- memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
- vgabios_stdvga, sizeof(vgabios_stdvga));
- vgabios_sz = round_option_rom(sizeof(vgabios_stdvga));
- break;
- case VGA_pt:
- printf("Loading VGABIOS of passthroughed gfx ...\n");
- vgabios_sz =
- round_option_rom((*(uint8_t *)(VGABIOS_PHYSICAL_ADDRESS+2)) * 512);
- break;
- default:
- printf("No emulated VGA adaptor ...\n");
- break;
- }
+ switch ( virtual_vga )
+ {
+ case VGA_cirrus:
+ printf("Loading Cirrus VGABIOS ...\n");
+ memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
+ vgabios_cirrusvga, sizeof(vgabios_cirrusvga));
+ vgabios_sz = round_option_rom(sizeof(vgabios_cirrusvga));
+ break;
+ case VGA_std:
+ printf("Loading Standard VGABIOS ...\n");
+ memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
+ vgabios_stdvga, sizeof(vgabios_stdvga));
+ vgabios_sz = round_option_rom(sizeof(vgabios_stdvga));
+ break;
+ case VGA_pt:
+ printf("Loading VGABIOS of passthroughed gfx ...\n");
+ vgabios_sz = round_option_rom(
+ (*(uint8_t *)(VGABIOS_PHYSICAL_ADDRESS+2)) * 512);
+ break;
+ default:
+ printf("No emulated VGA adaptor ...\n");
+ break;
+ }
- etherboot_phys_addr = VGABIOS_PHYSICAL_ADDRESS + vgabios_sz;
- if ( etherboot_phys_addr < bios->optionrom_start )
- etherboot_phys_addr = bios->optionrom_start;
- etherboot_sz = scan_etherboot_nic(bios->optionrom_end,
- etherboot_phys_addr);
+ etherboot_phys_addr = VGABIOS_PHYSICAL_ADDRESS + vgabios_sz;
+ if ( etherboot_phys_addr < bios->optionrom_start )
+ etherboot_phys_addr = bios->optionrom_start;
+ etherboot_sz = scan_etherboot_nic(bios->optionrom_end,
+ etherboot_phys_addr);
- option_rom_phys_addr = etherboot_phys_addr + etherboot_sz;
- option_rom_sz = pci_load_option_roms(bios->optionrom_end,
- option_rom_phys_addr);
+ option_rom_phys_addr = etherboot_phys_addr + etherboot_sz;
+ option_rom_sz = pci_load_option_roms(bios->optionrom_end,
+ option_rom_phys_addr);
+ }
if ( hvm_info->acpi_enabled )
{
diff --git a/tools/firmware/hvmloader/rombios.c b/tools/firmware/hvmloader/rombios.c
index 629a1425d4..f85ff79fc7 100644
--- a/tools/firmware/hvmloader/rombios.c
+++ b/tools/firmware/hvmloader/rombios.c
@@ -372,6 +372,8 @@ struct bios_config rombios_config = {
.smbios_start = SMBIOS_PHYSICAL_ADDRESS,
.smbios_end = SMBIOS_PHYSICAL_END,
+ .load_roms = 1,
+
.optionrom_start = OPTIONROM_PHYSICAL_ADDRESS,
.optionrom_end = OPTIONROM_PHYSICAL_END,
diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c
index 534b421f43..3d0b42ccae 100644
--- a/tools/firmware/hvmloader/seabios.c
+++ b/tools/firmware/hvmloader/seabios.c
@@ -46,8 +46,10 @@ struct bios_config seabios_config = {
.smbios_start = 0,
.smbios_end = 0,
- .optionrom_start = OPTIONROM_PHYSICAL_ADDRESS,
- .optionrom_end = OPTIONROM_PHYSICAL_END,
+ .load_roms = 0,
+
+ .optionrom_start = 0,
+ .optionrom_end = 0,
.acpi_start = 0,