vgabios: Use standard VGA IO wrappers in geodevga.c.
[seabios.git] / src / post.c
index d8f4acf1587b75529a5f29c84d534ef931ea9497..b4ad1fa07b3dde5ec9c7d8870bf18315c116af8f 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,10 +227,11 @@ maininit(void)
 
     // Initialize pci
     pci_setup();
-    pci_probe();
-    pci_path_setup();
     smm_init();
 
+    // Setup Xen hypercalls
+    xen_init_hypercalls();
+
     // Initialize internal tables
     boot_setup();
 
@@ -279,7 +283,7 @@ maininit(void)
 
 
 /****************************************************************
- * Code relocation
+ * POST entry and code relocation
  ****************************************************************/
 
 // Update given relocs for the code at 'dest' with a given 'delta'
@@ -291,8 +295,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)
 {
@@ -330,71 +333,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();
 }