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 */ | ... | ... |