Commit 7587cf44019d593bb12703e7046bd7738996c55c
1 parent
70867490
accept bigger PC BIOSes
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@946 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
45 additions
and
8 deletions
hw/pc.c
| ... | ... | @@ -322,6 +322,8 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device, |
| 322 | 322 | { |
| 323 | 323 | char buf[1024]; |
| 324 | 324 | int ret, linux_boot, initrd_size, i, nb_nics1, fd; |
| 325 | + unsigned long bios_offset, vga_bios_offset; | |
| 326 | + int bios_size, isa_bios_size; | |
| 325 | 327 | |
| 326 | 328 | linux_boot = (kernel_filename != NULL); |
| 327 | 329 | |
| ... | ... | @@ -329,25 +331,47 @@ void pc_init(int ram_size, int vga_ram_size, int boot_device, |
| 329 | 331 | cpu_register_physical_memory(0, ram_size, 0); |
| 330 | 332 | |
| 331 | 333 | /* BIOS load */ |
| 334 | + bios_offset = ram_size + vga_ram_size; | |
| 335 | + vga_bios_offset = bios_offset + 256 * 1024; | |
| 336 | + | |
| 332 | 337 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, BIOS_FILENAME); |
| 333 | - ret = load_image(buf, phys_ram_base + 0x000f0000); | |
| 334 | - if (ret != 0x10000) { | |
| 338 | + bios_size = get_image_size(buf); | |
| 339 | + if (bios_size <= 0 || | |
| 340 | + (bios_size % 65536) != 0 || | |
| 341 | + bios_size > (256 * 1024)) { | |
| 342 | + goto bios_error; | |
| 343 | + } | |
| 344 | + ret = load_image(buf, phys_ram_base + bios_offset); | |
| 345 | + if (ret != bios_size) { | |
| 346 | + bios_error: | |
| 335 | 347 | fprintf(stderr, "qemu: could not load PC bios '%s'\n", buf); |
| 336 | 348 | exit(1); |
| 337 | 349 | } |
| 338 | - | |
| 350 | + | |
| 339 | 351 | /* VGA BIOS load */ |
| 340 | 352 | if (cirrus_vga_enabled) { |
| 341 | 353 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_CIRRUS_FILENAME); |
| 342 | 354 | } else { |
| 343 | 355 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_FILENAME); |
| 344 | 356 | } |
| 345 | - ret = load_image(buf, phys_ram_base + 0x000c0000); | |
| 357 | + ret = load_image(buf, phys_ram_base + vga_bios_offset); | |
| 346 | 358 | |
| 347 | 359 | /* setup basic memory access */ |
| 348 | - cpu_register_physical_memory(0xc0000, 0x10000, 0xc0000 | IO_MEM_ROM); | |
| 349 | - cpu_register_physical_memory(0xd0000, 0x20000, IO_MEM_UNASSIGNED); | |
| 350 | - cpu_register_physical_memory(0xf0000, 0x10000, 0xf0000 | IO_MEM_ROM); | |
| 360 | + cpu_register_physical_memory(0xc0000, 0x10000, | |
| 361 | + vga_bios_offset | IO_MEM_ROM); | |
| 362 | + | |
| 363 | + /* map the last 128KB of the BIOS in ISA space */ | |
| 364 | + isa_bios_size = bios_size; | |
| 365 | + if (isa_bios_size > (128 * 1024)) | |
| 366 | + isa_bios_size = 128 * 1024; | |
| 367 | + cpu_register_physical_memory(0xd0000, (192 * 1024) - isa_bios_size, | |
| 368 | + IO_MEM_UNASSIGNED); | |
| 369 | + cpu_register_physical_memory(0x100000 - isa_bios_size, | |
| 370 | + isa_bios_size, | |
| 371 | + (bios_offset + bios_size - isa_bios_size) | IO_MEM_ROM); | |
| 372 | + /* map all the bios at the top of memory */ | |
| 373 | + cpu_register_physical_memory((uint32_t)(-bios_size), | |
| 374 | + bios_size, bios_offset | IO_MEM_ROM); | |
| 351 | 375 | |
| 352 | 376 | bochs_bios_init(); |
| 353 | 377 | ... | ... |
vl.c
| ... | ... | @@ -291,6 +291,18 @@ char *pstrcat(char *buf, int buf_size, const char *s) |
| 291 | 291 | } |
| 292 | 292 | |
| 293 | 293 | /* return the size or -1 if error */ |
| 294 | +int get_image_size(const char *filename) | |
| 295 | +{ | |
| 296 | + int fd, size; | |
| 297 | + fd = open(filename, O_RDONLY | O_BINARY); | |
| 298 | + if (fd < 0) | |
| 299 | + return -1; | |
| 300 | + size = lseek(fd, 0, SEEK_END); | |
| 301 | + close(fd); | |
| 302 | + return size; | |
| 303 | +} | |
| 304 | + | |
| 305 | +/* return the size or -1 if error */ | |
| 294 | 306 | int load_image(const char *filename, uint8_t *addr) |
| 295 | 307 | { |
| 296 | 308 | int fd, size; | ... | ... |
vl.h
| ... | ... | @@ -209,6 +209,7 @@ uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c); |
| 209 | 209 | |
| 210 | 210 | void hw_error(const char *fmt, ...); |
| 211 | 211 | |
| 212 | +int get_image_size(const char *filename); | |
| 212 | 213 | int load_image(const char *filename, uint8_t *addr); |
| 213 | 214 | extern const char *bios_dir; |
| 214 | 215 | |
| ... | ... | @@ -243,7 +244,7 @@ extern int cirrus_vga_enabled; |
| 243 | 244 | #if defined (TARGET_PPC) |
| 244 | 245 | #define BIOS_SIZE (512 * 1024) |
| 245 | 246 | #else |
| 246 | -#define BIOS_SIZE 0 | |
| 247 | +#define BIOS_SIZE ((256 + 64) * 1024) | |
| 247 | 248 | #endif |
| 248 | 249 | |
| 249 | 250 | /* keyboard/mouse support */ | ... | ... |