diff options
-rw-r--r-- | tools/firmware/hvmloader/config.h | 12 | ||||
-rw-r--r-- | tools/firmware/hvmloader/util.c | 21 |
2 files changed, 22 insertions, 11 deletions
diff --git a/tools/firmware/hvmloader/config.h b/tools/firmware/hvmloader/config.h index bbf2993a34..3a4e145c6e 100644 --- a/tools/firmware/hvmloader/config.h +++ b/tools/firmware/hvmloader/config.h @@ -67,7 +67,17 @@ extern unsigned long pci_mem_start, pci_mem_end; #define RESERVED_MEMBASE 0xFC000000 /* NB. ACPI_INFO_PHYSICAL_ADDRESS *MUST* match definition in acpi/dsdt.asl! */ #define ACPI_INFO_PHYSICAL_ADDRESS 0xFC000000 -#define RESERVED_MEMORY_DYNAMIC 0xFC001000 +#define RESERVED_MEMORY_DYNAMIC_START 0xFC001000 +#define RESERVED_MEMORY_DYNAMIC_END 0xFE000000 +/* + * GUEST_RESERVED: Physical address space reserved for guest use. + * This is not dynamically advertised to guests, so this range must *never* + * be used for any purpose by us, in future. It must always be marked as + * reserved in the memory map (e.g., E820_RESERVED) so that mechanisms such + * as PCI BAR remapping do not allocate from this region. + */ +#define GUEST_RESERVED_START 0xFE700000 +#define GUEST_RESERVED_END 0xFE800000 extern unsigned long scratch_start; diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index 63690d0795..d5cd27735b 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -416,13 +416,14 @@ void mem_hole_populate_ram(xen_pfn_t mfn, uint32_t nr_mfns) } } -static uint32_t reserve = RESERVED_MEMORY_DYNAMIC - 1; +static uint32_t alloc_up = RESERVED_MEMORY_DYNAMIC_START - 1; +static uint32_t alloc_down = RESERVED_MEMORY_DYNAMIC_END; 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; + alloc_down -= nr_mfns << PAGE_SHIFT; + BUG_ON(alloc_up >= alloc_down); + return alloc_down >> PAGE_SHIFT; } void *mem_alloc(uint32_t size, uint32_t align) @@ -433,18 +434,18 @@ void *mem_alloc(uint32_t size, uint32_t align) if ( align < 16 ) align = 16; - s = (reserve + align) & ~(align - 1); + s = (alloc_up + align) & ~(align - 1); e = s + size - 1; - BUG_ON((e < s) || (e >> PAGE_SHIFT) >= hvm_info->reserved_mem_pgstart); + BUG_ON((e < s) || (e >= alloc_down)); - while ( (reserve >> PAGE_SHIFT) != (e >> PAGE_SHIFT) ) + while ( (alloc_up >> PAGE_SHIFT) != (e >> PAGE_SHIFT) ) { - reserve += PAGE_SIZE; - mem_hole_populate_ram(reserve >> PAGE_SHIFT, 1); + alloc_up += PAGE_SIZE; + mem_hole_populate_ram(alloc_up >> PAGE_SHIFT, 1); } - reserve = e; + alloc_up = e; return (void *)(unsigned long)s; } |