Currently arm_uvtop() calls arm_lpae_vtop() with the LPAE and it uses
LPAE_VTOP() also for a user virtual address, but it looks incorrect.
Without this patch, commands that use uvtop conversion such as "ps -a",
"gcore" fail as readmem() for a uvaddr returns a seek error:
crash> ps -a 357
...
ps: cannot access user stack address: bef2f97c
crash> gcore
gcore: seek error: physical address: 7ec56eab type: "fill_psinfo: pr_psargs"
Failed.
Fixes:
https://github.com/crash-utility/crash-extensions/issues/2
Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
---
arm.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/arm.c b/arm.c
index e52d29f04015..05324691da17 100644
--- a/arm.c
+++ b/arm.c
@@ -1125,17 +1125,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)
+ if (IS_KVADDR(vaddr)) {
+ 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);
--
1.8.3.1