tsc crap :/
[seabios.git] / src / post.c
index 4a75f511141429ddaaf9290ce917cbf9912e21f0..7c76959f23611f68638dc049c629e66ee5867450 100644 (file)
@@ -12,6 +12,7 @@
 #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
@@ -22,6 +23,7 @@
 #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
 
@@ -100,6 +102,8 @@ ram_probe(void)
     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)
@@ -157,6 +161,10 @@ init_bios_tables(void)
         coreboot_copy_biostable();
         return;
     }
+    if (usingXen()) {
+       xen_copy_biostables();
+       return;
+    }
 
     create_pirtable();
 
@@ -178,6 +186,8 @@ init_hw(void)
 
     floppy_setup();
     ata_setup();
+    ahci_setup();
+    cbfs_payload_setup();
     ramdisk_setup();
     virtio_blk_setup();
 }
@@ -200,27 +210,30 @@ startBoot(void)
 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)
@@ -231,13 +244,19 @@ maininit(void)
 
     // 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)
@@ -270,7 +289,7 @@ maininit(void)
 
 
 /****************************************************************
- * Code relocation
+ * POST entry and code relocation
  ****************************************************************/
 
 // Update given relocs for the code at 'dest' with a given 'delta'
@@ -282,8 +301,7 @@ updateRelocs(void *dest, u32 *rstart, u32 *rend, u32 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)
 {
@@ -321,70 +339,45 @@ reloc_init(void)
     func();
 }
 
-static int HaveRunPost;
-
-// 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)
 {
-    // Allow writes to modify bios area (0xf0000)
-    make_bios_writable();
-
     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
- ****************************************************************/
-
-// 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);
+    // Check if we are running under Xen.
+    xen_probe();
 
-    if (HaveRunPost)
-        // This is a soft reboot - invoke a hard reboot.
-        tryReboot();
+    // Allow writes to modify bios area (0xf0000)
+    make_bios_writable();
 
-    // Perform main setup code.
-    post();
+    // Now that memory is read/writable - start post process.
+    dopost();
 }