From 5a2660891dbf24f6b5f829786ee5df56570ed1af Mon Sep 17 00:00:00 2001 From: Vinayak Menon Date: Fri, 17 Apr 2020 19:53:59 +0530 Subject: [PATCH 3/4] get CONFIG_ARM64_VA_BITS from config For ramdumps without vmcoreinfo, get CONFIG_ARM64_VA_BITS from config. Without this, vmemmap size is calculated incorrectly. --- arm64.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/arm64.c b/arm64.c index 7a05f2a..00e3869 100644 --- a/arm64.c +++ b/arm64.c @@ -4011,6 +4011,7 @@ arm64_calc_virtual_memory_ranges(void) struct machine_specific *ms = machdep->machspec; ulong value, vmemmap_start, vmemmap_end, vmemmap_size, vmalloc_end; char *string; + int ret; ulong PUD_SIZE = UNINITIALIZED; if (!machdep->machspec->CONFIG_ARM64_VA_BITS) { @@ -4018,6 +4019,10 @@ arm64_calc_virtual_memory_ranges(void) value = atol(string); free(string); machdep->machspec->CONFIG_ARM64_VA_BITS = value; + } else if (kt->ikconfig_flags & IKCONFIG_AVAIL) { + if ((ret = get_kernel_config("CONFIG_ARM64_VA_BITS", + &string)) == IKCONFIG_STR) + machdep->machspec->CONFIG_ARM64_VA_BITS = atol(string); } } @@ -4042,7 +4047,12 @@ arm64_calc_virtual_memory_ranges(void) #define STRUCT_PAGE_MAX_SHIFT 6 if (ms->VA_BITS_ACTUAL) { - vmemmap_size = (1UL) << (ms->CONFIG_ARM64_VA_BITS - machdep->pageshift - 1 + STRUCT_PAGE_MAX_SHIFT); + ulong va_bits_min = 48; + + if (machdep->machspec->CONFIG_ARM64_VA_BITS < 48) + va_bits_min = ms->CONFIG_ARM64_VA_BITS; + + vmemmap_size = (1UL) << (va_bits_min - machdep->pageshift - 1 + STRUCT_PAGE_MAX_SHIFT); vmalloc_end = (- PUD_SIZE - vmemmap_size - KILOBYTES(64)); vmemmap_start = (-vmemmap_size); ms->vmalloc_end = vmalloc_end - 1; --