#include "biosvar.h" // struct bios_data_area_s
#include "disk.h" // floppy_drive_setup
#include "ata.h" // ata_setup
+#include "ahci.h" // ahci_setup
#include "memmap.h" // add_e820
#include "pic.h" // pic_setup
#include "pci.h" // create_pirtable
#include "usb.h" // usb_setup
#include "smbios.h" // smbios_init
#include "paravirt.h" // qemu_cfg_port_probe
+#include "xen.h" // xen_probe_hvm_info
#include "ps2port.h" // ps2port_setup
#include "virtio-blk.h" // virtio_blk_setup
dprintf(3, "Find memory size\n");
if (CONFIG_COREBOOT) {
coreboot_setup();
+ } else if (usingXen()) {
+ xen_setup();
} else {
// On emulators, get memory size from nvram.
u32 rs = ((inb_cmos(CMOS_MEM_EXTMEM2_LOW) << 16)
coreboot_copy_biostable();
return;
}
+ if (usingXen()) {
+ xen_copy_biostables();
+ return;
+ }
create_pirtable();
floppy_setup();
ata_setup();
+ ahci_setup();
+ cbfs_payload_setup();
ramdisk_setup();
virtio_blk_setup();
}
static void
maininit(void)
{
+ // Running at new code address - do code relocation fixups
+ malloc_fixupreloc();
+
// Setup ivt/bda/ebda
init_ivt();
init_bda();
// Init base pc hardware.
- thread_setup();
pic_setup();
timer_setup();
mathcp_setup();
// Initialize mtrr
- smp_probe_setup();
mtrr_setup();
// Initialize pci
pci_setup();
smm_init();
+ // Setup Xen hypercalls
+ xen_init_hypercalls();
+
// Initialize internal tables
boot_setup();
- drive_setup();
// Start hardware initialization (if optionrom threading)
if (CONFIG_THREADS && CONFIG_THREAD_OPTIONROMS)
// Setup interfaces that option roms may need
bios32_setup();
+ dprintf(3, "[wurm] pmm_setup\n");
pmm_setup();
+ dprintf(3, "[wurm] pnp_setup\n");
pnp_setup();
+ dprintf(3, "[wurm] kbd_setup\n");
kbd_setup();
+ dprintf(3, "[wurm] mouse_setup\n");
mouse_setup();
+ dprintf(3, "[wurm] init_bios_tables\n");
init_bios_tables();
// Run vga option rom
+ dprintf(3, "[wurm] vga_setup\n");
vga_setup();
// Do hardware initialization (if running synchronously)
}
// Run option roms
+ dprintf(3, "[wurm] optionrom_setup\n");
optionrom_setup();
// Run BCVs and show optional boot menu
+ dprintf(3, "[wurm] boot_prep\n");
boot_prep();
// Finalize data structures before boot
+ dprintf(3, "[wurm] cdemu_setup\n");
cdemu_setup();
+ dprintf(3, "[wurm] pmm_finalize\n");
pmm_finalize();
+ dprintf(3, "[wurm] malloc_finalize\n");
malloc_finalize();
+ dprintf(3, "[wurm] memmap_finalize\n");
memmap_finalize();
// Setup bios checksum.
BiosChecksum -= checksum((u8*)BUILD_BIOS_ADDR, BUILD_BIOS_SIZE);
// Write protect bios memory.
+ dprintf(3, "[wurm] make_bios_readonly\n");
make_bios_readonly();
// Invoke int 19 to start boot process.
+ dprintf(3, "[wurm] startBoot\n");
startBoot();
}
/****************************************************************
- * Code relocation
+ * POST entry and code relocation
****************************************************************/
// Update given relocs for the code at 'dest' with a given 'delta'
*((u32*)(dest + *reloc)) += delta;
}
-// Start of Power On Self Test - the BIOS initilization. This
-// function sets up for and attempts relocation of the init code.
+// Relocate init code and then call maininit() at new address.
static void
reloc_init(void)
{
func();
}
-// Start of Power On Self Test (POST) - the BIOS initilization phase.
-// This function sets up for and attempts relocation of the init code.
+// Setup for code relocation and then call reloc_init
void VISIBLE32INIT
-post(void)
+dopost(void)
{
+ HaveRunPost = 1;
+
// Detect ram and setup internal malloc.
- memmap_setup();
qemu_cfg_port_probe();
ram_probe();
malloc_setup();
+ // Relocate initialization code and call maininit().
reloc_init();
}
-
-/****************************************************************
- * POST entry point
- ****************************************************************/
-
-static int HaveRunPost;
-
-// Attempt to invoke a hard-reboot.
-static void
-tryReboot(void)
+// Entry point for Power On Self Test (POST) - the BIOS initilization
+// phase. This function makes the memory at 0xc0000-0xfffff
+// read/writable and then calls dopost().
+void VISIBLE32FLAT
+handle_post(void)
{
- dprintf(1, "Attempting a hard reboot\n");
-
- // Setup for reset on qemu.
- if (! CONFIG_COREBOOT) {
- qemu_prep_reset();
- if (HaveRunPost)
- apm_shutdown();
- }
-
- // Try keyboard controller reboot.
- i8042_reboot();
-
- // Try PCI 0xcf9 reboot
- pci_reboot();
+ debug_serial_setup();
+ dprintf(1, "Start bios (version %s)\n", VERSION);
- // Try triple fault
- asm volatile("int3");
+ // Enable CPU caching
+ setcr0(getcr0() & ~(CR0_CD|CR0_NW));
- panic("Could not reboot");
-}
+ // Clear CMOS reboot flag.
+ outb_cmos(0, CMOS_RESET_CODE);
-// 32-bit entry point.
-void VISIBLE32FLAT
-_start(void)
-{
+ // Make sure legacy DMA isn't running.
init_dma();
- debug_serial_setup();
- dprintf(1, "Start bios (version %s)\n", VERSION);
-
- if (HaveRunPost)
- // This is a soft reboot - invoke a hard reboot.
- tryReboot();
+ // Check if we are running under Xen.
+ xen_probe();
// Allow writes to modify bios area (0xf0000)
make_bios_writable();
- HaveRunPost = 1;
- // Perform main setup code.
- post();
+ // Now that memory is read/writable - start post process.
+ dopost();
}