Fix for the 32-bit ARM virtual-to-physical address translation of

unity-mapped kernel virtual addresses in kernels configured with
CONFIG_ARM_LPAE if the system's phys_base exceeds 4GB.
(sdu.liu@huawei.com)
This commit is contained in:
Dave Anderson 2014-12-18 09:37:02 -05:00
parent 1cab03a298
commit da66825399

20
arm.c
View File

@ -1095,6 +1095,18 @@ arm_lpae_vtop(ulong vaddr, ulong *pgd, physaddr_t *paddr, int verbose)
pmd_t pmd_pte;
pte_t pte;
if (!vt->vmalloc_start) {
*paddr = LPAE_VTOP(vaddr);
return TRUE;
}
if (!IS_VMALLOC_ADDR(vaddr)) {
*paddr = LPAE_VTOP(vaddr);
if (!verbose)
return TRUE;
}
if (verbose)
fprintf(fp, "PAGE DIRECTORY: %lx\n", (ulong)pgd);
@ -1231,6 +1243,11 @@ arm_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbose)
if (!IS_KVADDR(kvaddr))
return FALSE;
if (machdep->flags & PAE)
return arm_lpae_vtop(kvaddr, (ulong *)vt->kernel_pgd[0],
paddr, verbose);
if (!vt->vmalloc_start) {
*paddr = VTOP(kvaddr);
return TRUE;
@ -1242,9 +1259,6 @@ arm_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbose)
return TRUE;
}
if (machdep->flags & PAE)
return arm_lpae_vtop(kvaddr, (ulong *)vt->kernel_pgd[0],
paddr, verbose);
return arm_vtop(kvaddr, (ulong *)vt->kernel_pgd[0], paddr, verbose);
}