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

[Xen-changelog] [xen-unstable] hvmloader: New functions mem_hole_alloc() and mem_hole_populate_ram().



# HG changeset patch
# User Keir Fraser <keir@xxxxxxx>
# Date 1311410627 -3600
# Node ID 815ef5cf02613b9d21e2c9837760278516a69965
# Parent  88847c424eec8c5d5df79fc5e961660fe31d83ec
hvmloader: New functions mem_hole_alloc() and mem_hole_populate_ram().

These can be used by BIOS-specific handlers to set up memory regions
as required by their firmware payload.

Use mem_hole_alloc() to allocate properly reserved space for the
shared-info-page mapping. The old location conflicts with space
required for the OVMF BIOS (support for which is work in progress).

Signed-off-by: Keir Fraser <keir@xxxxxxx>
---


diff -r 88847c424eec -r 815ef5cf0261 tools/firmware/hvmloader/util.c
--- a/tools/firmware/hvmloader/util.c   Sat Jul 23 08:58:37 2011 +0100
+++ b/tools/firmware/hvmloader/util.c   Sat Jul 23 09:43:47 2011 +0100
@@ -303,29 +303,14 @@
     *p = '\0';
 }
 
-void *mem_alloc(uint32_t size, uint32_t align)
+void mem_hole_populate_ram(xen_pfn_t mfn, uint32_t nr_mfns)
 {
-    static uint32_t reserve = RESERVED_MEMBASE - 1;
     static int over_allocated;
     struct xen_add_to_physmap xatp;
     struct xen_memory_reservation xmr;
-    xen_pfn_t mfn;
-    uint32_t s, e;
 
-    /* Align to at least 16 bytes. */
-    if ( align < 16 )
-        align = 16;
-
-    s = (reserve + align) & ~(align - 1);
-    e = s + size - 1;
-
-    BUG_ON((e < s) || (e >> PAGE_SHIFT) >= hvm_info->reserved_mem_pgstart);
-
-    while ( (reserve >> PAGE_SHIFT) != (e >> PAGE_SHIFT) )
+    for ( ; nr_mfns-- != 0; mfn++ )
     {
-        reserve += PAGE_SIZE;
-        mfn = reserve >> PAGE_SHIFT;
-
         /* Try to allocate a brand new page in the reserved area. */
         if ( !over_allocated )
         {
@@ -356,6 +341,35 @@
         if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
             BUG();
     }
+}
+
+static uint32_t reserve = RESERVED_MEMBASE - 1;
+
+xen_pfn_t mem_hole_alloc(uint32_t nr_mfns)
+{
+    hvm_info->reserved_mem_pgstart -= nr_mfns;
+    BUG_ON(hvm_info->reserved_mem_pgstart <= (reserve >> PAGE_SHIFT));
+    return hvm_info->reserved_mem_pgstart;
+}
+
+void *mem_alloc(uint32_t size, uint32_t align)
+{
+    uint32_t s, e;
+
+    /* Align to at least 16 bytes. */
+    if ( align < 16 )
+        align = 16;
+
+    s = (reserve + align) & ~(align - 1);
+    e = s + size - 1;
+
+    BUG_ON((e < s) || (e >> PAGE_SHIFT) >= hvm_info->reserved_mem_pgstart);
+
+    while ( (reserve >> PAGE_SHIFT) != (e >> PAGE_SHIFT) )
+    {
+        reserve += PAGE_SIZE;
+        mem_hole_populate_ram(reserve >> PAGE_SHIFT, 1);
+    }
 
     reserve = e;
 
@@ -635,7 +649,7 @@
     xatp.domid = DOMID_SELF;
     xatp.space = XENMAPSPACE_shared_info;
     xatp.idx   = 0;
-    xatp.gpfn  = 0xfffffu;
+    xatp.gpfn  = mem_hole_alloc(1);
     shared_info = (struct shared_info *)(xatp.gpfn << PAGE_SHIFT);
     if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
         BUG();
diff -r 88847c424eec -r 815ef5cf0261 tools/firmware/hvmloader/util.h
--- a/tools/firmware/hvmloader/util.h   Sat Jul 23 08:58:37 2011 +0100
+++ b/tools/firmware/hvmloader/util.h   Sat Jul 23 09:43:47 2011 +0100
@@ -3,6 +3,7 @@
 
 #include <stdarg.h>
 #include <stdint.h>
+#include <xen/xen.h>
 #include <xen/hvm/hvm_info_table.h>
 
 #define __STR(...) #__VA_ARGS__
@@ -164,6 +165,12 @@
 int printf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
 int vprintf(const char *fmt, va_list ap);
 
+/* Populate specified memory hole with RAM. */
+void mem_hole_populate_ram(xen_pfn_t mfn, uint32_t nr_mfns);
+
+/* Allocate a memory hole below 4GB. */
+xen_pfn_t mem_hole_alloc(uint32_t nr_mfns);
+
 /* Allocate memory in a reserved region below 4GB. */
 void *mem_alloc(uint32_t size, uint32_t align);
 #define virt_to_phys(v) ((unsigned long)(v))

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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