[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] hvmloader: write extra memory in CMOS



Some firmware, such as OVMF relies on this value to get the size of
extra memory above 4GB.

Seabios in Xen doesn't need this as it gets e820 directly from Xen.
Rombios doesn't read this value.

Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
 tools/firmware/hvmloader/hvmloader.c |   15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/tools/firmware/hvmloader/hvmloader.c 
b/tools/firmware/hvmloader/hvmloader.c
index 1cc8cf2..327dffd 100644
--- a/tools/firmware/hvmloader/hvmloader.c
+++ b/tools/firmware/hvmloader/hvmloader.c
@@ -146,6 +146,7 @@ static void init_hypercalls(void)
 static void cmos_write_memory_size(void)
 {
     uint32_t base_mem = 640, ext_mem, alt_mem;
+    uint64_t extra_mem = 0;
 
     alt_mem = ext_mem = hvm_info->low_mem_pgend << PAGE_SHIFT;
     ext_mem = (ext_mem > 0x0100000) ? (ext_mem - 0x0100000) >> 10 : 0;
@@ -153,6 +154,15 @@ static void cmos_write_memory_size(void)
         ext_mem = 0xffff;
     alt_mem = (alt_mem > 0x1000000) ? (alt_mem - 0x1000000) >> 16 : 0;
 
+    /* According to hvm_info:
+     *  0x100000000 to page_to_phys(high_mem_pgend)-1:
+     *   RAM above 4GB
+     * extra_mem written to CMOS is represented as 64kb chunks
+     */
+    extra_mem = hvm_info->high_mem_pgend;
+    extra_mem = (extra_mem > 0x100000) ?
+        (((extra_mem - 0x100000) << PAGE_SHIFT) >> 16) : 0;
+
     /* All BIOSes: conventional memory (CMOS *always* reports 640kB). */
     cmos_outb(0x15, (uint8_t)(base_mem >> 0));
     cmos_outb(0x16, (uint8_t)(base_mem >> 8));
@@ -166,6 +176,11 @@ static void cmos_write_memory_size(void)
     /* Some BIOSes: alternative extended memory (64kB chunks above 16MB). */
     cmos_outb(0x34, (uint8_t)( alt_mem >> 0));
     cmos_outb(0x35, (uint8_t)( alt_mem >> 8));
+
+    /* Some BIOSes: extra memory (64kB chunks above 4GB) */
+    cmos_outb(0x5d, (uint8_t)( extra_mem >> 16));
+    cmos_outb(0x5c, (uint8_t)( extra_mem >> 8));
+    cmos_outb(0x5b, (uint8_t)( extra_mem >> 0));
 }
 
 /*
-- 
1.7.10.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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