diff --git a/linux-ramdump-parser-v2/mm.py b/linux-ramdump-parser-v2/mm.py
index df8503012ca165840decb5d8c8291658c42c6115..09e648461dfbd000de1cab41e114d07df44f0b28 100755
--- a/linux-ramdump-parser-v2/mm.py
+++ b/linux-ramdump-parser-v2/mm.py
@@ -9,6 +9,8 @@
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 
+import bitops
+
 
 def page_buddy(ramdump, page):
     mapcount_offset = ramdump.field_offset('struct page', '_mapcount')
@@ -127,20 +129,37 @@ def page_to_pfn_sparse(ramdump, page):
     # divide by struct page size for division fun
     return (page - addr) / sizeof_page
 
-# Yes, we are hard coding the vmemmap. This isn't very likely to change unless
-# the rest of the addresses start changing as well. When that happens, the
-# entire parser will probably be broken in many other ways so a better solution
-# can be derived then.
+
+def get_vmemmap(ramdump):
+    # See: include/asm-generic/pgtable-nopud.h,
+    # arch/arm64/include/asm/pgtable-hwdef.h,
+    # arch/arm64/include/asm/pgtable.h
+    nlevels = int(ramdump.get_config_val("CONFIG_ARM64_PGTABLE_LEVELS"))
+    if ramdump.is_config_defined("CONFIG_ARM64_64K_PAGES"):
+        page_shift = 16
+    else:
+        page_shift = 12
+    pgdir_shift = ((page_shift - 3) * nlevels) + 3
+    pud_shift = pgdir_shift
+    pud_size = 1 << pud_shift
+    va_bits = int(ramdump.get_config_val("CONFIG_ARM64_VA_BITS"))
+    spsize = ramdump.sizeof('struct page')
+    vmemmap_size = bitops.align((1 << (va_bits - page_shift)) * spsize,
+                                pud_size)
+    vmalloc_end = ramdump.page_offset - pud_size - vmemmap_size
+    return vmalloc_end
+
+
 def page_to_pfn_vmemmap(ramdump, page):
-    mem_map = 0xffffffbc00000000
+    vmemmap = get_vmemmap(ramdump)
     page_size = ramdump.sizeof('struct page')
-    return ((page - mem_map) / page_size)
+    return ((page - vmemmap) / page_size)
 
 
 def pfn_to_page_vmemmap(ramdump, pfn):
-    mem_map = 0xffffffbc00000000
+    vmemmap = get_vmemmap(ramdump)
     page_size = ramdump.sizeof('struct page')
-    return mem_map + (pfn * page_size)
+    return vmemmap + (pfn * page_size)
 
 
 def page_to_pfn_flat(ramdump, page):