X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fpost.c;h=b4ad1fa07b3dde5ec9c7d8870bf18315c116af8f;hb=184705fc8c7d8ef75a6cfca4d61cbf35c0df0334;hp=d8f4acf1587b75529a5f29c84d534ef931ea9497;hpb=096a9b10e68eb1b2087cc30e4fa6d333b6a03d72;p=seabios.git diff --git a/src/post.c b/src/post.c index d8f4acf..b4ad1fa 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,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(); }