X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fpost.c;h=a566b34bfdb847e5b0d000a7595b899eb841818c;hb=89eb6241e51bc825cfbc1292802a960dcb48d778;hp=4d86b923692af2fde5b064403cfde49646cf56b4;hpb=0a924124b4f5daf3735a7f81f906a387ba8296f4;p=seabios.git diff --git a/src/post.c b/src/post.c index 4d86b92..a566b34 100644 --- a/src/post.c +++ b/src/post.c @@ -1,6 +1,6 @@ // 32bit code to Power On Self Test (POST) a machine. // -// Copyright (C) 2008 Kevin O'Connor +// Copyright (C) 2008,2009 Kevin O'Connor // Copyright (C) 2002 MandrakeSoft S.A. // // This file may be distributed under the terms of the GNU LGPLv3 license. @@ -11,17 +11,22 @@ #include "util.h" // memset #include "biosvar.h" // struct bios_data_area_s #include "disk.h" // floppy_drive_setup +#include "ata.h" // ata_setup #include "memmap.h" // add_e820 #include "pic.h" // pic_setup #include "pci.h" // create_pirtable #include "acpi.h" // acpi_bios_init #include "bregs.h" // struct bregs +#include "mptable.h" // mptable_init #include "boot.h" // IPL +#include "usb.h" // usb_setup +#include "smbios.h" // smbios_init +#include "paravirt.h" // qemu_cfg_port_probe void __set_irq(int vector, void *loc) { - SET_IVT(vector, SEG_BIOS, (u32)loc - BUILD_BIOS_ADDR); + SET_IVT(vector, SEGOFF(SEG_BIOS, (u32)loc - BUILD_BIOS_ADDR)); } #define set_irq(vector, func) do { \ @@ -46,9 +51,10 @@ init_ivt() set_irq(i, entry_hwpic2); // Initialize software handlers. + set_irq(0x02, entry_02); set_irq(0x10, entry_10); - set_irq(0x11, entry_11_official); - set_irq(0x12, entry_12_official); + set_irq(0x11, entry_11); + set_irq(0x12, entry_12); set_irq(0x13, entry_13_official); set_irq(0x14, entry_14); set_irq(0x15, entry_15); @@ -61,7 +67,7 @@ init_ivt() // set vector 0x79 to zero // this is used by 'gardian angel' protection system - SET_IVT(0x79, 0, 0); + SET_IVT(0x79, SEGOFF(0, 0)); __set_irq(0x1E, &diskette_param_table2); } @@ -74,16 +80,15 @@ init_bda() struct bios_data_area_s *bda = MAKE_FLATPTR(SEG_BDA, 0); memset(bda, 0, sizeof(*bda)); - int esize = DIV_ROUND_UP(sizeof(struct extended_bios_data_area_s), 1024); - SET_BDA(mem_size_kb, 640 - esize); - u16 eseg = FLATPTR_TO_SEG((640 - esize) * 1024); + int esize = EBDA_SIZE_START; + SET_BDA(mem_size_kb, BUILD_LOWRAM_END/1024 - esize); + u16 eseg = EBDA_SEGMENT_START; SET_BDA(ebda_seg, eseg); + // Init ebda struct extended_bios_data_area_s *ebda = get_ebda_ptr(); memset(ebda, 0, sizeof(*ebda)); ebda->size = esize; - SET_IVT(0x41, eseg, offsetof(struct extended_bios_data_area_s, fdpt[0])); - SET_IVT(0x46, eseg, offsetof(struct extended_bios_data_area_s, fdpt[1])); } static void @@ -91,7 +96,7 @@ ram_probe(void) { dprintf(3, "Find memory size\n"); if (CONFIG_COREBOOT) { - coreboot_fill_map(); + coreboot_setup(); } else { // On emulators, get memory size from nvram. u32 rs = ((inb_cmos(CMOS_MEM_EXTMEM2_LOW) << 16) @@ -117,7 +122,7 @@ ram_probe(void) } // Don't declare any memory between 0xa0000 and 0x100000 - add_e820(0xa0000, 0x50000, E820_HOLE); + add_e820(BUILD_LOWRAM_END, BUILD_BIOS_ADDR-BUILD_LOWRAM_END, E820_HOLE); // Mark known areas as reserved. u16 ebda_seg = get_ebda_seg(); @@ -125,7 +130,7 @@ ram_probe(void) , E820_RESERVED); add_e820(BUILD_BIOS_ADDR, BUILD_BIOS_SIZE, E820_RESERVED); - if (CONFIG_KVM) + if (kvm_para_available()) // 4 pages before the bios, 3 pages for vmx tss pages, the // other page for EPT real mode pagetable add_e820(0xfffbc000, 4*4096, E820_RESERVED); @@ -136,9 +141,10 @@ ram_probe(void) static void init_bios_tables(void) { - if (CONFIG_COREBOOT) - // XXX - not supported on coreboot yet. + if (CONFIG_COREBOOT) { + coreboot_copy_biostable(); return; + } create_pirtable(); @@ -156,36 +162,50 @@ post() init_ivt(); init_bda(); + qemu_cfg_port_probe(); + pic_setup(); timer_setup(); mathcp_setup(); smp_probe_setup(); - memmap_setup(); ram_probe(); mtrr_setup(); + smp_probe(); + malloc_setup(); + pmm_setup(); + + pci_setup(); + smm_init(); pnp_setup(); vga_setup(); + usb_setup(); kbd_setup(); lpt_setup(); serial_setup(); mouse_setup(); - pci_bios_setup(); - smm_init(); - init_bios_tables(); - memmap_finalize(); boot_setup(); - floppy_drive_setup(); - hard_drive_setup(); + drive_setup(); + cdemu_setup(); + floppy_setup(); + ata_setup(); + ramdisk_setup(); optionrom_setup(); + + // Run BCVs + boot_prep(); + + pmm_finalize(); + malloc_finalize(); + memmap_finalize(); } // 32-bit entry point. @@ -195,7 +215,7 @@ _start() init_dma(); debug_serial_setup(); - dprintf(1, "Start bios\n"); + dprintf(1, "Start bios (version %s)\n", VERSION); // Allow writes to modify bios area (0xf0000) make_bios_writable(); @@ -203,23 +223,16 @@ _start() // Perform main setup code. post(); - // Run BCVs - boot_prep(); - // Setup bios checksum. - BiosChecksum = -checksum((u8*)BUILD_BIOS_ADDR, BUILD_BIOS_SIZE - 1); + BiosChecksum -= checksum((u8*)BUILD_BIOS_ADDR, BUILD_BIOS_SIZE); - // Prep for boot process. + // Write protect bios memory. make_bios_readonly(); // Invoke int 19 to start boot process. dprintf(3, "Jump to int19\n"); struct bregs br; memset(&br, 0, sizeof(br)); + br.flags = F_IF; call16_int(0x19, &br); } - -// Ughh - some older gcc compilers have a bug which causes VISIBLE32 -// functions to not be exported as a global variable - force _start -// to be global here. -asm(".global _start");