aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2012-10-25 00:07:16 -0700
committerKeir Fraser <keir@xen.org>2012-10-25 00:07:16 -0700
commitfe0f4baccbec6eedef517ab98a0f14970697d06c (patch)
tree438472adac96d8614b86a56400257717fe866a4e /tools/firmware
parent95c286c6309f312eac98de95c0c5eaf61514b685 (diff)
downloadxen-fe0f4baccbec6eedef517ab98a0f14970697d06c.tar.gz
xen-fe0f4baccbec6eedef517ab98a0f14970697d06c.tar.bz2
xen-fe0f4baccbec6eedef517ab98a0f14970697d06c.zip
hvmloader: Reserve FE700000-FE800000 in physical memory map for guest use.
Xen platform promises never to use this physical address region, and will always mark it as reserved in the physical memory map presented to the OS (preventing its use by generic OS services such as BAR remapping). Linux will use this region for mapping the shared-info page. Signed-off-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'tools/firmware')
-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;
}