Don't clutter post.c with the gory details of QEMU memory sizing and BIOS table creation. Instead, move that code to paravirt.c.
Signed-off-by: Kevin O'Connor kevin@koconnor.net --- src/paravirt.c | 56 ++++++++++++++++++++++++++++++++++++++++++ src/paravirt.h | 2 ++ src/post.c | 77 ++++++++-------------------------------------------------- 3 files changed, 68 insertions(+), 67 deletions(-)
diff --git a/src/paravirt.c b/src/paravirt.c index f180261..9022186 100644 --- a/src/paravirt.c +++ b/src/paravirt.c @@ -13,9 +13,65 @@ #include "ioport.h" // outw #include "paravirt.h" // qemu_cfg_preinit #include "smbios.h" // struct smbios_structure_header +#include "memmap.h" // add_e820 +#include "cmos.h" // CMOS_* +#include "acpi.h" // acpi_setup +#include "mptable.h" // mptable_setup +#include "pci.h" // create_pirtable
int qemu_cfg_present;
+void +qemu_ramsize_preinit(void) +{ + // On emulators, get memory size from nvram. + u32 rs = ((inb_cmos(CMOS_MEM_EXTMEM2_LOW) << 16) + | (inb_cmos(CMOS_MEM_EXTMEM2_HIGH) << 24)); + if (rs) + rs += 16 * 1024 * 1024; + else + rs = (((inb_cmos(CMOS_MEM_EXTMEM_LOW) << 10) + | (inb_cmos(CMOS_MEM_EXTMEM_HIGH) << 18)) + + 1 * 1024 * 1024); + RamSize = rs; + add_e820(0, rs, E820_RAM); + + // Check for memory over 4Gig + u64 high = ((inb_cmos(CMOS_MEM_HIGHMEM_LOW) << 16) + | ((u32)inb_cmos(CMOS_MEM_HIGHMEM_MID) << 24) + | ((u64)inb_cmos(CMOS_MEM_HIGHMEM_HIGH) << 32)); + RamSizeOver4G = high; + add_e820(0x100000000ull, high, E820_RAM); + + /* reserve 256KB BIOS area at the end of 4 GB */ + add_e820(0xfffc0000, 256*1024, E820_RESERVED); + + u32 count = qemu_cfg_e820_entries(); + if (count) { + struct e820_reservation entry; + int i; + + for (i = 0; i < count; i++) { + qemu_cfg_e820_load_next(&entry); + add_e820(entry.address, entry.length, entry.type); + } + } else if (kvm_para_available()) { + // Backwards compatibility - provide hard coded range. + // 4 pages before the bios, 3 pages for vmx tss pages, the + // other page for EPT real mode pagetable + add_e820(0xfffbc000, 4*4096, E820_RESERVED); + } +} + +void +qemu_biostable_setup(void) +{ + pirtable_setup(); + mptable_setup(); + smbios_setup(); + acpi_setup(); +} + static void qemu_cfg_select(u16 f) { diff --git a/src/paravirt.h b/src/paravirt.h index 765a6c1..4f2d5b8 100644 --- a/src/paravirt.h +++ b/src/paravirt.h @@ -43,6 +43,8 @@ static inline int kvm_para_available(void)
extern int qemu_cfg_present;
+void qemu_ramsize_preinit(void); +void qemu_biostable_setup(void); void qemu_cfg_preinit(void); int qemu_cfg_show_boot_menu(void); void qemu_cfg_get_uuid(u8 *uuid); diff --git a/src/post.c b/src/post.c index dbf4944..33b51b7 100644 --- a/src/post.c +++ b/src/post.c @@ -15,13 +15,9 @@ #include "ahci.h" // ahci_setup #include "memmap.h" // add_e820 #include "pic.h" // pic_setup -#include "pci.h" // create_pirtable -#include "acpi.h" // acpi_bios_init #include "bregs.h" // struct bregs -#include "mptable.h" // mptable_init #include "boot.h" // IPL #include "usb.h" // usb_setup -#include "smbios.h" // smbios_init #include "paravirt.h" // qemu_cfg_port_probe #include "xen.h" // xen_preinit #include "ps2port.h" // ps2port_setup @@ -40,33 +36,12 @@ static void ramsize_preinit(void) { dprintf(3, "Find memory size\n"); - if (CONFIG_COREBOOT) { + if (CONFIG_COREBOOT) coreboot_preinit(); - } else if (usingXen()) { + else if (usingXen()) xen_ramsize_preinit(); - } else { - // On emulators, get memory size from nvram. - u32 rs = ((inb_cmos(CMOS_MEM_EXTMEM2_LOW) << 16) - | (inb_cmos(CMOS_MEM_EXTMEM2_HIGH) << 24)); - if (rs) - rs += 16 * 1024 * 1024; - else - rs = (((inb_cmos(CMOS_MEM_EXTMEM_LOW) << 10) - | (inb_cmos(CMOS_MEM_EXTMEM_HIGH) << 18)) - + 1 * 1024 * 1024); - RamSize = rs; - add_e820(0, rs, E820_RAM); - - // Check for memory over 4Gig - u64 high = ((inb_cmos(CMOS_MEM_HIGHMEM_LOW) << 16) - | ((u32)inb_cmos(CMOS_MEM_HIGHMEM_MID) << 24) - | ((u64)inb_cmos(CMOS_MEM_HIGHMEM_HIGH) << 32)); - RamSizeOver4G = high; - add_e820(0x100000000ull, high, E820_RAM); - - /* reserve 256KB BIOS area at the end of 4 GB */ - add_e820(0xfffc0000, 256*1024, E820_RESERVED); - } + else + qemu_ramsize_preinit();
// Don't declare any memory between 0xa0000 and 0x100000 add_e820(BUILD_LOWRAM_END, BUILD_BIOS_ADDR-BUILD_LOWRAM_END, E820_HOLE); @@ -74,22 +49,6 @@ ramsize_preinit(void) // Mark known areas as reserved. add_e820(BUILD_BIOS_ADDR, BUILD_BIOS_SIZE, E820_RESERVED);
- u32 count = qemu_cfg_e820_entries(); - if (count) { - struct e820_reservation entry; - int i; - - for (i = 0; i < count; i++) { - qemu_cfg_e820_load_next(&entry); - add_e820(entry.address, entry.length, entry.type); - } - } else if (kvm_para_available()) { - // Backwards compatibility - provide hard coded range. - // 4 pages before the bios, 3 pages for vmx tss pages, the - // other page for EPT real mode pagetable - add_e820(0xfffbc000, 4*4096, E820_RESERVED); - } - dprintf(1, "Ram Size=0x%08x (0x%016llx high)\n", RamSize, RamSizeOver4G); }
@@ -204,27 +163,6 @@ device_hardware_setup(void) }
static void -biostable_setup(void) -{ - if (CONFIG_COREBOOT) { - coreboot_biostable_setup(); - return; - } - if (usingXen()) { - xen_biostable_setup(); - return; - } - - pirtable_setup(); - - mptable_setup(); - - smbios_setup(); - - acpi_setup(); -} - -static void platform_hardware_setup(void) { // Init base pc hardware. @@ -249,7 +187,12 @@ platform_hardware_setup(void) smp_setup();
// Setup external BIOS interface tables - biostable_setup(); + if (CONFIG_COREBOOT) + coreboot_biostable_setup(); + else if (usingXen()) + xen_biostable_setup(); + else + qemu_biostable_setup(); }
static void