[PATCH 2/2] ARM: don't depend on vmalloc_start

Mika Westerberg ext-mika.1.westerberg at nokia.com
Thu Nov 4 04:15:17 EDT 2010


In ARM, modules are placed in vmalloc'ed area right above user stack and the
rest of the vmalloc area is somewhere after high_memory (this can be different
on different platforms). Since this value is not stored in vmcoreinfo, we have
no means to find out the correct value for vmalloc_start.

So we assume that all V->P translations are within the kernel direct mapped
memory and use translation tables only when '--vtop' option is passed.

Signed-off-by: Mika Westerberg <ext-mika.1.westerberg at nokia.com>
---
 arm.c |   40 +++++++++++++++++++---------------------
 1 files changed, 19 insertions(+), 21 deletions(-)

diff --git a/arm.c b/arm.c
index 3ea450a..6469f03 100644
--- a/arm.c
+++ b/arm.c
@@ -86,6 +86,9 @@ get_machdep_info_arm(void)
 	info->kernel_start = SYMBOL(_stext);
 	info->section_size_bits = _SECTION_SIZE_BITS;
 
+	DEBUG_MSG("page_offset  : %lx\n", info->page_offset);
+	DEBUG_MSG("kernel_start : %lx\n", info->kernel_start);
+
 	/*
 	 * For the compatibility, makedumpfile should run without the symbol
 	 * vmlist and the offset of vm_struct.addr if they are not necessary.
@@ -95,31 +98,28 @@ get_machdep_info_arm(void)
 		return TRUE;
 	}
 
+	/*
+	 * In ARM the VMALLOC_START can be redefined per platform and we have no
+	 * means to read that from the vmcore (there is currently no vmcoreinfo
+	 * which specifies that), so we are not going to use vmalloc_start for
+	 * anything.
+	 */
 	if (!readmem(VADDR, SYMBOL(vmlist), &vmlist, sizeof(vmlist))) {
 		ERRMSG("Can't get vmlist.\n");
-		return FALSE;
+		return TRUE;
 	}
 	if (!readmem(VADDR, vmlist + OFFSET(vm_struct.addr), &vmalloc_start,
 		     sizeof(vmalloc_start))) {
 		ERRMSG("Can't get vmalloc_start.\n");
-		return FALSE;
+		return TRUE;
 	}
 
 	info->vmalloc_start = vmalloc_start;
-
-	DEBUG_MSG("page_offset  : %lx\n", info->page_offset);
-	DEBUG_MSG("kernel_start : %lx\n", info->kernel_start);
 	DEBUG_MSG("vmalloc_start: %lx\n", vmalloc_start);
 
 	return TRUE;
 }
 
-static int
-is_vmalloc_addr_arm(unsigned long vaddr)
-{
-	return (info->vmalloc_start && vaddr >= info->vmalloc_start);
-}
-
 /*
  * vtop_arm() - translate arbitrary virtual address to physical
  * @vaddr: virtual address to translate
@@ -184,17 +184,15 @@ vtop_arm(unsigned long vaddr)
 unsigned long long
 vaddr_to_paddr_arm(unsigned long vaddr)
 {
-	unsigned long long paddr = vaddr_to_paddr_general(vaddr);
-
-	if (paddr != NOT_PADDR)
-		return paddr;
-
-	if (is_vmalloc_addr_arm(vaddr))
-		paddr = vtop_arm(vaddr);
-	else
-		paddr = __pa(vaddr);
+	/*
+	 * Only use translation tables when user has explicitly requested us to
+	 * perform translation for a given address. Otherwise we assume that the
+	 * translation is done within the kernel direct mapped region.
+	 */
+	if (info->vaddr_for_vtop == vaddr)
+		return vtop_arm(vaddr);
 
-	return paddr;
+	return __pa(vaddr);
 }
 
 #endif /* __arm__ */
-- 
1.5.6.5




More information about the kexec mailing list