[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [Patch] Expand shadow memory area for using option ROM
Hi, This patch expands shadow memory of guest BIOS. Currently the shadow memory is 0xc0000 - 0xdffff. It is used by VGA, gPXE, option ROM, but the size of these ROMs is around 40k->64k, so the area is not enough. This patch is: - replace e820 table from 0xe0000 to 0xeb000. - expand shadowr from 0xc0000-0xdffff to 0xc0000-0xe8fff. - fix scan size of VGA BIOS. after this patch, BIOS map is below. BIOS map: c0000-c8fff: VGA BIOS c9000-d57ff: Etherboot ROM d5800-e0fff: PCI Option ROMs e9000-e919c: SMBIOS tables f0000-fffff: Main BIOS Signed-off-by: Akio Takebe <takebe_akio@xxxxxxxxxxxxxx> Ref: http://lists.xensource.com/archives/html/xen-devel/2008-12/msg00835.html Best Regards, Akio Takebe diff -r e2f36d066b7b tools/firmware/hvmloader/hvmloader.c --- a/tools/firmware/hvmloader/hvmloader.c Mon Dec 22 13:48:40 2008 +0000 +++ b/tools/firmware/hvmloader/hvmloader.c Fri Dec 26 13:33:15 2008 +0900 @@ -401,7 +401,7 @@ printf(" - Product name: %s\n", (char *)rom + pnph->product_name_offset); - if ( (dest + rom->rom_size * 512 + 1) > 0xe0000u ) + if ( (dest + rom->rom_size * 512 + 1) > 0xe9000u ) { printf("Option ROM size %x exceeds available space\n", rom->rom_size * 512); diff -r e2f36d066b7b tools/firmware/rombios/rombios.c --- a/tools/firmware/rombios/rombios.c Mon Dec 22 13:48:40 2008 +0000 +++ b/tools/firmware/rombios/rombios.c Fri Dec 26 13:33:15 2008 +0900 @@ -1411,8 +1411,8 @@ Bit32u base_mem; if (nr_entries > 32) nr_entries = 32; - write_word(0xe000, 0x8, nr_entries); - memcpyb(0xe000, 0x10, 0x9000, 0x2d0, nr_entries * 0x14); + write_word(0xeb00, 0x8, nr_entries); + memcpyb(0xeb00, 0x10, 0x9000, 0x2d0, nr_entries * 0x14); /* Report the proper base memory size at address 0x0413: otherwise * non-e820 code will clobber things if BASE_MEM_IN_K is bigger than * the first e820 entry. Get the size by reading the second 64bit @@ -4669,7 +4669,7 @@ { #ifdef HVMASSIST case 0x20: { - Bit16u e820_table_size = read_word(0xe000, 0x8) * 0x14; + Bit16u e820_table_size = read_word(0xeb00, 0x8) * 0x14; if (regs.u.r32.edx != 0x534D4150) /* SMAP */ goto int15_unimplemented; @@ -4677,7 +4677,7 @@ if ((regs.u.r16.bx / 0x14) * 0x14 == regs.u.r16.bx) { if (regs.u.r16.bx + 0x14 <= e820_table_size) memcpyb(ES, regs.u.r16.di, - 0xe000, 0x10 + regs.u.r16.bx, 0x14); + 0xeb00, 0x10 + regs.u.r16.bx, 0x14); regs.u.r32.ebx += 0x14; if ((regs.u.r32.ebx + 0x14 - 1) > e820_table_size) regs.u.r32.ebx = 0; @@ -4685,8 +4685,8 @@ Bit32u base, type; Bit16u off; for (off = 0; off < e820_table_size; off += 0x14) { - base = read_dword(0xe000, 0x10 + off); - type = read_dword(0xe000, 0x20 + off); + base = read_dword(0xeb00, 0x10 + off); + type = read_dword(0xeb00, 0x20 + off); if ((base >= 0x100000) && (type == 1)) break; } @@ -4694,7 +4694,7 @@ SET_CF(); break; } - memcpyb(ES, regs.u.r16.di, 0xe000, 0x10 + off, 0x14); + memcpyb(ES, regs.u.r16.di, 0xeb00, 0x10 + off, 0x14); regs.u.r32.ebx = 0; } else { /* AX=E820, DX=534D4150, BX unrecognized */ goto int15_unimplemented; @@ -4707,7 +4707,7 @@ } case 0x01: { - Bit16u off, e820_table_size = read_word(0xe000, 0x8) * 0x14; + Bit16u off, e820_table_size = read_word(0xeb00, 0x8) * 0x14; Bit32u base, type, size; // do we have any reason to fail here ? @@ -4723,8 +4723,8 @@ // Find first RAM E820 entry >= 1MB. for (off = 0; off < e820_table_size; off += 0x14) { - base = read_dword(0xe000, 0x10 + off); - type = read_dword(0xe000, 0x20 + off); + base = read_dword(0xeb00, 0x10 + off); + type = read_dword(0xeb00, 0x20 + off); if ((base >= 0x100000) && (type == 1)) break; } @@ -4732,7 +4732,7 @@ // If there is RAM above 16MB, return amount in 64kB chunks. regs.u.r16.dx = 0; if (off != e820_table_size) { - size = base + read_dword(0xe000, 0x18 + off); + size = base + read_dword(0xeb00, 0x18 + off); if (size > 0x1000000) { size -= 0x1000000; regs.u.r16.dx = (Bit16u)(size >> 16); @@ -10440,9 +10440,9 @@ rom_scan: ;; Scan for existence of valid expansion ROMS. - ;; Video ROM: from 0xC0000..0xC7FFF in 2k increments - ;; General ROM: from 0xC8000..0xDFFFF in 2k increments - ;; System ROM: only 0xE0000 + ;; Video ROM: from 0xC0000..0xC8FFF in 2k increments + ;; General ROM: from 0xC9000..0xE8FFF in 2k increments + ;; System ROM: only 0xE9000 ;; ;; Header: ;; Offset Value @@ -10964,7 +10964,7 @@ call post_init_pic mov cx, #0xc000 ;; init vga bios - mov ax, #0xc780 + mov ax, #0xc880 call rom_scan call _print_bios_banner @@ -11017,8 +11017,8 @@ call _init_boot_vectors - mov cx, #0xc800 ;; init option roms - mov ax, #0xe000 + mov cx, #0xc900 ;; init option roms + mov ax, #0xe900 call rom_scan #if BX_ELTORITO_BOOT _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |