From: Ian Campbell Date: Wed, 1 Jun 2011 15:47:04 +0000 (+0100) Subject: hvmloader: refactor BIOS info setup X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~10248 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c25fb1ae7b81da62d93afe8044c359d7372962d6;p=xen.git hvmloader: refactor BIOS info setup Currently we have ->bios_high_setup, which is called relatively early and returns a cookie which is passed to ->bios_info_setup which runs towards the end and creates the BIOS info, incorporating the cookie which (in the case of ROMBIOS) happens to be the BIOS's high load address . This is rather ROMBIOS specific. Refactor to have ->bios_info_setup which is called early and prepares the bios_info, ->bios_relocate which does any necessary relocation (updating the BIOS info as necessary) and ->bios_info_finish which finalises the info (e.g. by calculating the checksum). Signed-off-by: Ian Campbell --- diff --git a/tools/firmware/hvmloader/config.h b/tools/firmware/hvmloader/config.h index afce05bbb1..2ef5d6da18 100644 --- a/tools/firmware/hvmloader/config.h +++ b/tools/firmware/hvmloader/config.h @@ -20,8 +20,10 @@ struct bios_config { int load_roms; unsigned int optionrom_start, optionrom_end; - uint32_t (*bios_high_setup)(void); - void (*bios_info_setup)(uint32_t); + void (*bios_info_setup)(void); + void (*bios_info_finish)(void); + + void (*bios_relocate)(void); void (*vm86_setup)(void); void (*e820_setup)(void); diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c index 89407964e7..401d381b23 100644 --- a/tools/firmware/hvmloader/hvmloader.c +++ b/tools/firmware/hvmloader/hvmloader.c @@ -383,7 +383,6 @@ static const struct bios_config *detect_bios(void) int main(void) { - uint32_t highbios = 0; const struct bios_config *bios; int option_rom_sz = 0, vgabios_sz = 0, etherboot_sz = 0; uint32_t etherboot_phys_addr = 0, option_rom_phys_addr = 0; @@ -409,6 +408,9 @@ int main(void) perform_tests(); + if (bios->bios_info_setup) + bios->bios_info_setup(); + if (bios->create_smbios_tables) { printf("Writing SMBIOS tables ...\n"); bios->create_smbios_tables(); @@ -418,8 +420,8 @@ int main(void) memcpy((void *)bios->bios_address, bios->image, bios->image_size); - if (bios->bios_high_setup) - highbios = bios->bios_high_setup(); + if (bios->bios_relocate) + bios->bios_relocate(); if ( bios->create_mp_tables && ( (hvm_info->nr_vcpus > 1) || hvm_info->apic_mode ) ) @@ -505,8 +507,8 @@ int main(void) if (bios->e820_setup) bios->e820_setup(); - if (bios->bios_info_setup) - bios->bios_info_setup(highbios); + if (bios->bios_info_finish) + bios->bios_info_finish(); xenbus_shutdown(); diff --git a/tools/firmware/hvmloader/rombios.c b/tools/firmware/hvmloader/rombios.c index b4006263af..a3b5667815 100644 --- a/tools/firmware/hvmloader/rombios.c +++ b/tools/firmware/hvmloader/rombios.c @@ -64,7 +64,7 @@ static void rombios_setup_e820(void) dump_e820_table(E820, *E820_NR); } -static void rombios_setup_bios_info(uint32_t bioshigh) +static void rombios_setup_bios_info(void) { struct bios_info *bios_info; @@ -74,13 +74,30 @@ static void rombios_setup_bios_info(uint32_t bioshigh) bios_info->com2_present = uart_exists(0x2f8); bios_info->lpt1_present = lpt_exists(0x378); bios_info->hpet_present = hpet_exists(ACPI_HPET_ADDRESS); - bios_info->pci_min = pci_mem_start; - bios_info->pci_len = pci_mem_end - pci_mem_start; bios_info->madt_csum_addr = madt_csum_addr; bios_info->madt_lapic0_addr = madt_lapic0_addr; +} + +static void rombios_relocate(void) +{ + uint32_t bioshigh; + struct bios_info *bios_info; + + bioshigh = rombios_highbios_setup(); + + bios_info = (struct bios_info *)BIOS_INFO_PHYSICAL_ADDRESS; bios_info->bios32_entry = bioshigh; } +static void rombios_finish_bios_info(void) +{ + struct bios_info *bios_info; + + bios_info = (struct bios_info *)BIOS_INFO_PHYSICAL_ADDRESS; + bios_info->pci_min = pci_mem_start; + bios_info->pci_len = pci_mem_end - pci_mem_start; +} + /* * find_mp_table_start - searchs through BIOS memory for '___HVMMP' signature * @@ -158,8 +175,10 @@ struct bios_config rombios_config = { .optionrom_start = OPTIONROM_PHYSICAL_ADDRESS, .optionrom_end = OPTIONROM_PHYSICAL_END, - .bios_high_setup = rombios_highbios_setup, .bios_info_setup = rombios_setup_bios_info, + .bios_info_finish = rombios_finish_bios_info, + + .bios_relocate = rombios_relocate, .vm86_setup = rombios_init_vm86_tss, .e820_setup = rombios_setup_e820, diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c index 53cc01ed63..0bc1975c22 100644 --- a/tools/firmware/hvmloader/seabios.c +++ b/tools/firmware/hvmloader/seabios.c @@ -44,6 +44,9 @@ struct bios_config seabios_config = { .optionrom_end = 0, .bios_info_setup = NULL, + .bios_info_finish = NULL, + + .bios_relocate = NULL, .vm86_setup = NULL, .e820_setup = NULL,