[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |