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
|