tsc crap :/
[seabios.git] / src / post.c
index 7618b176154b933f4b5f28c514ae1088942f68cf..7c76959f23611f68638dc049c629e66ee5867450 100644 (file)
@@ -210,6 +210,9 @@ 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();
@@ -224,9 +227,11 @@ maininit(void)
 
     // Initialize pci
     pci_setup();
-    pci_probe();
     smm_init();
 
+    // Setup Xen hypercalls
+    xen_init_hypercalls();
+
     // Initialize internal tables
     boot_setup();
 
@@ -239,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)
@@ -278,7 +289,7 @@ maininit(void)
 
 
 /****************************************************************
- * Code relocation
+ * POST entry and code relocation
  ****************************************************************/
 
 // Update given relocs for the code at 'dest' with a given 'delta'
@@ -290,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)
 {
@@ -329,71 +339,45 @@ 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.
     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)
-{
-    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();
-
-    // Try triple fault
-    asm volatile("int3");
-
-    panic("Could not reboot");
-}
-
-// 32-bit entry point.
+// 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
-_start(void)
+handle_post(void)
 {
-    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();
+    // Enable CPU caching
+    setcr0(getcr0() & ~(CR0_CD|CR0_NW));
+
+    // Clear CMOS reboot flag.
+    outb_cmos(0, CMOS_RESET_CODE);
+
+    // Make sure legacy DMA isn't running.
+    init_dma();
 
     // 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();
 }