[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.