ahci: ignore atapi devices which are not cdroms
[seabios.git] / src / post.c
index d8f4acf1587b75529a5f29c84d534ef931ea9497..e195e891fcab8bf1fd0c24f4bec1467d4a6e3469 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)
 {
@@ -331,63 +334,23 @@ reloc_init(void)
 }
 
 // Start of Power On Self Test (POST) - the BIOS initilization phase.
-// This function sets up for and attempts relocation of the init code.
+// This function does the setup needed for code relocation, and then
+// invokes the relocation and main setup code.
 void VISIBLE32INIT
-post(void)
-{
-    // Detect ram and setup internal malloc.
-    qemu_cfg_port_probe();
-    ram_probe();
-    malloc_setup();
-
-    reloc_init();
-}
-
-
-/****************************************************************
- * POST entry point
- ****************************************************************/
-
-static int HaveRunPost;
-
-// Attempt to invoke a hard-reboot.
-static void
-tryReboot(void)
+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();
+    debug_serial_setup();
+    dprintf(1, "Start bios (version %s)\n", VERSION);
 
-    // Try PCI 0xcf9 reboot
-    pci_reboot();
+    // Enable CPU caching
+    setcr0(getcr0() & ~(CR0_CD|CR0_NW));
 
-    // Try triple fault
-    asm volatile("int3");
+    // Clear CMOS reboot flag.
+    outb_cmos(0, CMOS_RESET_CODE);
 
-    panic("Could not reboot");
-}
-
-// 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();
 
@@ -395,6 +358,11 @@ _start(void)
     make_bios_writable();
     HaveRunPost = 1;
 
-    // Perform main setup code.
-    post();
+    // Detect ram and setup internal malloc.
+    qemu_cfg_port_probe();
+    ram_probe();
+    malloc_setup();
+
+    // Relocate initialization code and call maininit().
+    reloc_init();
 }