Commit 970ac5a3082428dca91171f270dcd95d6f4b2636
1 parent
e9a1ab19
use ram allocation functions
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2405 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
57 additions
and
46 deletions
hw/pc.c
| ... | ... | @@ -451,8 +451,8 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, |
| 451 | 451 | { |
| 452 | 452 | char buf[1024]; |
| 453 | 453 | int ret, linux_boot, initrd_size, i; |
| 454 | - unsigned long bios_offset, vga_bios_offset, option_rom_offset; | |
| 455 | - int bios_size, isa_bios_size; | |
| 454 | + ram_addr_t ram_addr, vga_ram_addr, bios_offset, vga_bios_offset; | |
| 455 | + int bios_size, isa_bios_size, vga_bios_size; | |
| 456 | 456 | PCIBus *pci_bus; |
| 457 | 457 | int piix3_devfn = -1; |
| 458 | 458 | CPUState *env; |
| ... | ... | @@ -477,23 +477,24 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, |
| 477 | 477 | } |
| 478 | 478 | |
| 479 | 479 | /* allocate RAM */ |
| 480 | - cpu_register_physical_memory(0, ram_size, 0); | |
| 480 | + ram_addr = qemu_ram_alloc(ram_size); | |
| 481 | + cpu_register_physical_memory(0, ram_size, ram_addr); | |
| 481 | 482 | |
| 482 | - /* BIOS load */ | |
| 483 | - bios_offset = ram_size + vga_ram_size; | |
| 484 | - vga_bios_offset = bios_offset + 256 * 1024; | |
| 483 | + /* allocate VGA RAM */ | |
| 484 | + vga_ram_addr = qemu_ram_alloc(vga_ram_size); | |
| 485 | 485 | |
| 486 | + /* BIOS load */ | |
| 486 | 487 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, BIOS_FILENAME); |
| 487 | 488 | bios_size = get_image_size(buf); |
| 488 | 489 | if (bios_size <= 0 || |
| 489 | - (bios_size % 65536) != 0 || | |
| 490 | - bios_size > (256 * 1024)) { | |
| 490 | + (bios_size % 65536) != 0) { | |
| 491 | 491 | goto bios_error; |
| 492 | 492 | } |
| 493 | + bios_offset = qemu_ram_alloc(bios_size); | |
| 493 | 494 | ret = load_image(buf, phys_ram_base + bios_offset); |
| 494 | 495 | if (ret != bios_size) { |
| 495 | 496 | bios_error: |
| 496 | - fprintf(stderr, "qemu: could not load PC bios '%s'\n", buf); | |
| 497 | + fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", buf); | |
| 497 | 498 | exit(1); |
| 498 | 499 | } |
| 499 | 500 | |
| ... | ... | @@ -503,8 +504,18 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, |
| 503 | 504 | } else { |
| 504 | 505 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_FILENAME); |
| 505 | 506 | } |
| 507 | + vga_bios_size = get_image_size(buf); | |
| 508 | + if (vga_bios_size <= 0 || vga_bios_size > 65536) | |
| 509 | + goto vga_bios_error; | |
| 510 | + vga_bios_offset = qemu_ram_alloc(65536); | |
| 511 | + | |
| 506 | 512 | ret = load_image(buf, phys_ram_base + vga_bios_offset); |
| 507 | - | |
| 513 | + if (ret != vga_bios_size) { | |
| 514 | + vga_bios_error: | |
| 515 | + fprintf(stderr, "qemu: could not load VGA BIOS '%s'\n", buf); | |
| 516 | + exit(1); | |
| 517 | + } | |
| 518 | + | |
| 508 | 519 | /* setup basic memory access */ |
| 509 | 520 | cpu_register_physical_memory(0xc0000, 0x10000, |
| 510 | 521 | vga_bios_offset | IO_MEM_ROM); |
| ... | ... | @@ -519,20 +530,32 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, |
| 519 | 530 | isa_bios_size, |
| 520 | 531 | (bios_offset + bios_size - isa_bios_size) | IO_MEM_ROM); |
| 521 | 532 | |
| 522 | - option_rom_offset = 0; | |
| 523 | - for (i = 0; i < nb_option_roms; i++) { | |
| 524 | - int offset = bios_offset + bios_size + option_rom_offset; | |
| 525 | - int size; | |
| 526 | - | |
| 527 | - size = load_image(option_rom[i], phys_ram_base + offset); | |
| 528 | - if ((size + option_rom_offset) > 0x10000) { | |
| 529 | - fprintf(stderr, "Too many option ROMS\n"); | |
| 530 | - exit(1); | |
| 531 | - } | |
| 532 | - cpu_register_physical_memory(0xd0000 + option_rom_offset, | |
| 533 | - size, offset | IO_MEM_ROM); | |
| 534 | - option_rom_offset += size + 2047; | |
| 535 | - option_rom_offset -= (option_rom_offset % 2048); | |
| 533 | + { | |
| 534 | + ram_addr_t option_rom_offset; | |
| 535 | + int size, offset; | |
| 536 | + | |
| 537 | + offset = 0; | |
| 538 | + for (i = 0; i < nb_option_roms; i++) { | |
| 539 | + size = get_image_size(option_rom[i]); | |
| 540 | + if (size < 0) { | |
| 541 | + fprintf(stderr, "Could not load option rom '%s'\n", | |
| 542 | + option_rom[i]); | |
| 543 | + exit(1); | |
| 544 | + } | |
| 545 | + if (size > (0x10000 - offset)) | |
| 546 | + goto option_rom_error; | |
| 547 | + option_rom_offset = qemu_ram_alloc(size); | |
| 548 | + ret = load_image(option_rom[i], phys_ram_base + option_rom_offset); | |
| 549 | + if (ret != size) { | |
| 550 | + option_rom_error: | |
| 551 | + fprintf(stderr, "Too many option ROMS\n"); | |
| 552 | + exit(1); | |
| 553 | + } | |
| 554 | + size = (size + 4095) & ~4095; | |
| 555 | + cpu_register_physical_memory(0xd0000 + offset, | |
| 556 | + size, option_rom_offset | IO_MEM_ROM); | |
| 557 | + offset += size; | |
| 558 | + } | |
| 536 | 559 | } |
| 537 | 560 | |
| 538 | 561 | /* map all the bios at the top of memory */ |
| ... | ... | @@ -612,19 +635,19 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, |
| 612 | 635 | if (cirrus_vga_enabled) { |
| 613 | 636 | if (pci_enabled) { |
| 614 | 637 | pci_cirrus_vga_init(pci_bus, |
| 615 | - ds, phys_ram_base + ram_size, ram_size, | |
| 616 | - vga_ram_size); | |
| 638 | + ds, phys_ram_base + vga_ram_addr, | |
| 639 | + vga_ram_addr, vga_ram_size); | |
| 617 | 640 | } else { |
| 618 | - isa_cirrus_vga_init(ds, phys_ram_base + ram_size, ram_size, | |
| 619 | - vga_ram_size); | |
| 641 | + isa_cirrus_vga_init(ds, phys_ram_base + vga_ram_addr, | |
| 642 | + vga_ram_addr, vga_ram_size); | |
| 620 | 643 | } |
| 621 | 644 | } else { |
| 622 | 645 | if (pci_enabled) { |
| 623 | - pci_vga_init(pci_bus, ds, phys_ram_base + ram_size, ram_size, | |
| 624 | - vga_ram_size, 0, 0); | |
| 646 | + pci_vga_init(pci_bus, ds, phys_ram_base + vga_ram_addr, | |
| 647 | + vga_ram_addr, vga_ram_size, 0, 0); | |
| 625 | 648 | } else { |
| 626 | - isa_vga_init(ds, phys_ram_base + ram_size, ram_size, | |
| 627 | - vga_ram_size); | |
| 649 | + isa_vga_init(ds, phys_ram_base + vga_ram_addr, | |
| 650 | + vga_ram_addr, vga_ram_size); | |
| 628 | 651 | } |
| 629 | 652 | } |
| 630 | 653 | ... | ... |
vl.c
| ... | ... | @@ -125,7 +125,6 @@ BlockDriverState *bs_table[MAX_DISKS + 1], *fd_table[MAX_FD]; |
| 125 | 125 | /* point to the block driver where the snapshots are managed */ |
| 126 | 126 | BlockDriverState *bs_snapshots; |
| 127 | 127 | int vga_ram_size; |
| 128 | -int bios_size; | |
| 129 | 128 | static DisplayState display_state; |
| 130 | 129 | int nographic; |
| 131 | 130 | const char* keyboard_layout = NULL; |
| ... | ... | @@ -6564,7 +6563,6 @@ int main(int argc, char **argv) |
| 6564 | 6563 | hd_filename[i] = NULL; |
| 6565 | 6564 | ram_size = DEFAULT_RAM_SIZE * 1024 * 1024; |
| 6566 | 6565 | vga_ram_size = VGA_RAM_SIZE; |
| 6567 | - bios_size = BIOS_SIZE; | |
| 6568 | 6566 | #ifdef CONFIG_GDBSTUB |
| 6569 | 6567 | use_gdbstub = 0; |
| 6570 | 6568 | gdbstub_port = DEFAULT_GDBSTUB_PORT; |
| ... | ... | @@ -7078,16 +7076,7 @@ int main(int argc, char **argv) |
| 7078 | 7076 | #endif |
| 7079 | 7077 | |
| 7080 | 7078 | /* init the memory */ |
| 7081 | - phys_ram_size = ram_size + vga_ram_size + bios_size; | |
| 7082 | - | |
| 7083 | - for (i = 0; i < nb_option_roms; i++) { | |
| 7084 | - int ret = get_image_size(option_rom[i]); | |
| 7085 | - if (ret == -1) { | |
| 7086 | - fprintf(stderr, "Could not load option rom '%s'\n", option_rom[i]); | |
| 7087 | - exit(1); | |
| 7088 | - } | |
| 7089 | - phys_ram_size += ret; | |
| 7090 | - } | |
| 7079 | + phys_ram_size = ram_size + vga_ram_size + MAX_BIOS_SIZE; | |
| 7091 | 7080 | |
| 7092 | 7081 | phys_ram_base = qemu_vmalloc(phys_ram_size); |
| 7093 | 7082 | if (!phys_ram_base) { | ... | ... |
vl.h
| ... | ... | @@ -165,12 +165,11 @@ extern const char *option_rom[MAX_OPTION_ROMS]; |
| 165 | 165 | extern int nb_option_roms; |
| 166 | 166 | |
| 167 | 167 | /* XXX: make it dynamic */ |
| 168 | +#define MAX_BIOS_SIZE (4 * 1024 * 1024) | |
| 168 | 169 | #if defined (TARGET_PPC) || defined (TARGET_SPARC64) |
| 169 | 170 | #define BIOS_SIZE ((512 + 32) * 1024) |
| 170 | 171 | #elif defined(TARGET_MIPS) |
| 171 | 172 | #define BIOS_SIZE (4 * 1024 * 1024) |
| 172 | -#else | |
| 173 | -#define BIOS_SIZE ((256 + 64) * 1024) | |
| 174 | 173 | #endif |
| 175 | 174 | |
| 176 | 175 | /* keyboard/mouse support */ | ... | ... |