Revision f753ff16 hw/pc.c
b/hw/pc.c | ||
---|---|---|
754 | 754 |
nb_ne2k++; |
755 | 755 |
} |
756 | 756 |
|
757 |
static int load_option_rom(const char *oprom, target_phys_addr_t start, |
|
758 |
target_phys_addr_t end) |
|
759 |
{ |
|
760 |
int size; |
|
761 |
|
|
762 |
size = get_image_size(oprom); |
|
763 |
if (size > 0 && start + size > end) { |
|
764 |
fprintf(stderr, "Not enough space to load option rom '%s'\n", |
|
765 |
oprom); |
|
766 |
exit(1); |
|
767 |
} |
|
768 |
size = load_image_targphys(oprom, start, end - start); |
|
769 |
if (size < 0) { |
|
770 |
fprintf(stderr, "Could not load option rom '%s'\n", oprom); |
|
771 |
exit(1); |
|
772 |
} |
|
773 |
/* Round up optiom rom size to the next 2k boundary */ |
|
774 |
size = (size + 2047) & ~2047; |
|
775 |
return size; |
|
776 |
} |
|
777 |
|
|
757 | 778 |
/* PC hardware initialisation */ |
758 | 779 |
static void pc_init1(ram_addr_t ram_size, int vga_ram_size, |
759 | 780 |
const char *boot_device, |
... | ... | |
763 | 784 |
{ |
764 | 785 |
char buf[1024]; |
765 | 786 |
int ret, linux_boot, i; |
766 |
ram_addr_t ram_addr, vga_ram_addr, bios_offset, vga_bios_offset, option_rom_start = 0;
|
|
787 |
ram_addr_t ram_addr, vga_ram_addr, bios_offset, option_rom_offset;
|
|
767 | 788 |
ram_addr_t below_4g_mem_size, above_4g_mem_size = 0; |
768 |
int bios_size, isa_bios_size, vga_bios_size;
|
|
789 |
int bios_size, isa_bios_size, oprom_area_size;
|
|
769 | 790 |
PCIBus *pci_bus; |
770 | 791 |
int piix3_devfn = -1; |
771 | 792 |
CPUState *env; |
... | ... | |
856 | 877 |
fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", buf); |
857 | 878 |
exit(1); |
858 | 879 |
} |
859 |
|
|
860 |
if (using_vga) { |
|
861 |
/* VGA BIOS load */ |
|
862 |
if (cirrus_vga_enabled) { |
|
863 |
snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_CIRRUS_FILENAME); |
|
864 |
} else { |
|
865 |
snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_FILENAME); |
|
866 |
} |
|
867 |
vga_bios_size = get_image_size(buf); |
|
868 |
if (vga_bios_size <= 0 || vga_bios_size > 65536) |
|
869 |
goto vga_bios_error; |
|
870 |
vga_bios_offset = qemu_ram_alloc(65536); |
|
871 |
|
|
872 |
ret = load_image(buf, phys_ram_base + vga_bios_offset); |
|
873 |
if (ret != vga_bios_size) { |
|
874 |
vga_bios_error: |
|
875 |
fprintf(stderr, "qemu: could not load VGA BIOS '%s'\n", buf); |
|
876 |
exit(1); |
|
877 |
} |
|
878 |
/* Round up vga bios size to the next 2k boundary */ |
|
879 |
vga_bios_size = (vga_bios_size + 2047) & ~2047; |
|
880 |
option_rom_start = 0xc0000 + vga_bios_size; |
|
881 |
|
|
882 |
/* setup basic memory access */ |
|
883 |
cpu_register_physical_memory(0xc0000, vga_bios_size, |
|
884 |
vga_bios_offset | IO_MEM_ROM); |
|
885 |
} |
|
886 |
|
|
887 |
/* No point in placing option roms before this address, since bochs bios |
|
888 |
* will only start looking for it at 0xc8000 */ |
|
889 |
if (option_rom_start < 0xc8000) |
|
890 |
option_rom_start = 0xc8000; |
|
891 |
|
|
892 |
|
|
893 | 880 |
/* map the last 128KB of the BIOS in ISA space */ |
894 | 881 |
isa_bios_size = bios_size; |
895 | 882 |
if (isa_bios_size > (128 * 1024)) |
... | ... | |
898 | 885 |
isa_bios_size, |
899 | 886 |
(bios_offset + bios_size - isa_bios_size) | IO_MEM_ROM); |
900 | 887 |
|
901 |
{ |
|
902 |
ram_addr_t option_rom_offset; |
|
903 |
int size, offset; |
|
904 |
|
|
905 |
offset = option_rom_start; |
|
906 |
if (linux_boot) { |
|
907 |
option_rom_offset = qemu_ram_alloc(TARGET_PAGE_SIZE); |
|
908 |
load_linux(phys_ram_base + option_rom_offset, |
|
909 |
kernel_filename, initrd_filename, kernel_cmdline); |
|
910 |
cpu_register_physical_memory(option_rom_start, TARGET_PAGE_SIZE, |
|
911 |
option_rom_offset | IO_MEM_ROM); |
|
912 |
offset += TARGET_PAGE_SIZE; |
|
913 |
} |
|
914 | 888 |
|
915 |
for (i = 0; i < nb_option_roms; i++) { |
|
916 |
size = get_image_size(option_rom[i]); |
|
917 |
if (size < 0) { |
|
918 |
fprintf(stderr, "Could not load option rom '%s'\n", |
|
919 |
option_rom[i]); |
|
920 |
exit(1); |
|
921 |
} |
|
922 |
if (size > (0xe0000 - offset)) |
|
923 |
goto option_rom_error; |
|
924 |
option_rom_offset = qemu_ram_alloc(size); |
|
925 |
ret = load_image(option_rom[i], phys_ram_base + option_rom_offset); |
|
926 |
if (ret != size) { |
|
927 |
option_rom_error: |
|
928 |
fprintf(stderr, "Could not fit %soption roms in available space\n", using_vga ? "VGA bios and " : ""); |
|
929 |
exit(1); |
|
930 |
} |
|
931 |
size = (size + 4095) & ~4095; |
|
932 |
cpu_register_physical_memory(offset, size, option_rom_offset | IO_MEM_ROM); |
|
933 |
offset += size; |
|
889 |
|
|
890 |
option_rom_offset = qemu_ram_alloc(0x20000); |
|
891 |
oprom_area_size = 0; |
|
892 |
cpu_register_physical_memory(0xc0000, 0x20000, |
|
893 |
option_rom_offset | IO_MEM_ROM); |
|
894 |
|
|
895 |
if (using_vga) { |
|
896 |
/* VGA BIOS load */ |
|
897 |
if (cirrus_vga_enabled) { |
|
898 |
snprintf(buf, sizeof(buf), "%s/%s", bios_dir, |
|
899 |
VGABIOS_CIRRUS_FILENAME); |
|
900 |
} else { |
|
901 |
snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_FILENAME); |
|
934 | 902 |
} |
903 |
oprom_area_size = load_option_rom(buf, 0xc0000, 0xe0000); |
|
904 |
} |
|
905 |
/* Although video roms can grow larger than 0x8000, the area between |
|
906 |
* 0xc0000 - 0xc8000 is reserved for them. It means we won't be looking |
|
907 |
* for any other kind of option rom inside this area */ |
|
908 |
if (oprom_area_size < 0x8000) |
|
909 |
oprom_area_size = 0x8000; |
|
910 |
|
|
911 |
if (linux_boot) { |
|
912 |
load_linux(phys_ram_base + option_rom_offset + oprom_area_size, |
|
913 |
kernel_filename, initrd_filename, kernel_cmdline); |
|
914 |
oprom_area_size += 2048; |
|
915 |
} |
|
916 |
|
|
917 |
for (i = 0; i < nb_option_roms; i++) { |
|
918 |
oprom_area_size += load_option_rom(option_rom[i], |
|
919 |
0xc0000 + oprom_area_size, 0xe0000); |
|
935 | 920 |
} |
936 | 921 |
|
937 | 922 |
/* map all the bios at the top of memory */ |
Also available in: Unified diff