X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fpost.c;h=7c76959f23611f68638dc049c629e66ee5867450;hb=b29200c51beb1e75e7f844a4093da05b8394ad5e;hp=7618b176154b933f4b5f28c514ae1088942f68cf;hpb=659c99de95e69ad281ca361605d4bce72a090620;p=seabios.git diff --git a/src/post.c b/src/post.c index 7618b17..7c76959 100644 --- a/src/post.c +++ b/src/post.c @@ -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(); }