aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/firmware/hvmloader/config.h12
-rw-r--r--tools/firmware/hvmloader/util.c21
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;
}