physmem: keep physmem VA in 39-bit address space on x86_64
[vpp.git] / src / vppinfra / pmalloc.c
index 5662a36..dd772f3 100644 (file)
@@ -59,10 +59,11 @@ pmalloc_validate_numa_node (u32 * numa_node)
 }
 
 int
-clib_pmalloc_init (clib_pmalloc_main_t * pm, uword size)
+clib_pmalloc_init (clib_pmalloc_main_t * pm, uword base_addr, uword size)
 {
   uword off, pagesize;
   u64 *pt = 0;
+  int mmap_flags;
 
   ASSERT (pm->error == 0);
 
@@ -82,8 +83,13 @@ clib_pmalloc_init (clib_pmalloc_main_t * pm, uword size)
   pm->max_pages = size >> pm->def_log2_page_sz;
 
   /* reserve VA space for future growth */
-  pm->base = mmap (0, size + pagesize, PROT_NONE,
-                  MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+  mmap_flags = MAP_PRIVATE | MAP_ANONYMOUS;
+
+  if (base_addr)
+    mmap_flags |= MAP_FIXED;
+
+  pm->base = mmap (uword_to_pointer (base_addr, void *), size + pagesize,
+                  PROT_NONE, mmap_flags, -1, 0);
 
   if (pm->base == MAP_FAILED)
     {