From: Hari Bathini <hbathini@linux.vnet.ibm.com>
To: Kexec-ml <kexec@lists.infradead.org>,
Tachibana-san <tachibana@mxm.nes.nec.co.jp>,
Atsushi Kumagai <kumagai-atsushi@mxc.nes.nec.co.jp>,
Ken'ichi <oomichi@mxs.nes.nec.co.jp>
Subject: [PATCH v3 2/2] makedumpfile: vtop address translation support for vmalloc region in PPC64 arch
Date: Fri, 08 Aug 2014 18:53:36 +0530 [thread overview]
Message-ID: <20140808132336.11571.79373.stgit@localhost.localdomain> (raw)
In-Reply-To: <20140808132231.11571.34725.stgit@localhost.localdomain>
This patch adds virtual to physical address translation support
for vmalloc region in PPC64 architecture.
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
---
arch/ppc64.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++-------
makedumpfile.c | 2 +
makedumpfile.h | 3 ++
3 files changed, 91 insertions(+), 12 deletions(-)
diff --git a/arch/ppc64.c b/arch/ppc64.c
index 8c7eaa7..89a7f05 100644
--- a/arch/ppc64.c
+++ b/arch/ppc64.c
@@ -224,6 +224,83 @@ ppc64_vmemmap_to_phys(unsigned long vaddr)
return paddr;
}
+static unsigned long long
+ppc64_vtop_level4(unsigned long vaddr)
+{
+ ulong *level4, *level4_dir;
+ ulong *page_dir, *page_middle;
+ ulong *page_table;
+ unsigned long long level4_pte, pgd_pte;
+ unsigned long long pmd_pte, pte;
+ unsigned long long paddr = NOT_PADDR;
+
+ if (info->page_buf == NULL) {
+ /*
+ * This is the first vmalloc address translation request
+ */
+ info->page_buf = (char *)calloc(1, PAGESIZE());
+ if (info->page_buf == NULL) {
+ ERRMSG("Can't allocate memory to read page tables. %s\n",
+ strerror(errno));
+ return NOT_PADDR;
+ }
+ }
+
+ level4 = (ulong *)info->kernel_pgd;
+ level4_dir = (ulong *)((ulong *)level4 + L4_OFFSET(vaddr));
+ if (!readmem(VADDR, PAGEBASE(level4), info->page_buf, PAGESIZE())) {
+ ERRMSG("Can't read level4 page: 0x%llx\n", PAGEBASE(level4));
+ return NOT_PADDR;
+ }
+ level4_pte = ULONG((info->page_buf + PAGEOFFSET(level4_dir)));
+ if (!level4_pte)
+ return NOT_PADDR;
+
+ /*
+ * Sometimes we don't have level3 pagetable entries
+ */
+ if (info->l3_index_size != 0) {
+ page_dir = (ulong *)((ulong *)level4_pte + PGD_OFFSET_L4(vaddr));
+ if (!readmem(VADDR, PAGEBASE(level4_pte), info->page_buf, PAGESIZE())) {
+ ERRMSG("Can't read PGD page: 0x%llx\n", PAGEBASE(level4_pte));
+ return NOT_PADDR;
+ }
+ pgd_pte = ULONG((info->page_buf + PAGEOFFSET(page_dir)));
+ if (!pgd_pte)
+ return NOT_PADDR;
+ } else {
+ pgd_pte = level4_pte;
+ }
+
+ page_middle = (ulong *)((ulong *)pgd_pte + PMD_OFFSET_L4(vaddr));
+ if (!readmem(VADDR, PAGEBASE(pgd_pte), info->page_buf, PAGESIZE())) {
+ ERRMSG("Can't read PMD page: 0x%llx\n", PAGEBASE(pgd_pte));
+ return NOT_PADDR;
+ }
+ pmd_pte = ULONG((info->page_buf + PAGEOFFSET(page_middle)));
+ if (!(pmd_pte))
+ return NOT_PADDR;
+
+ page_table = (ulong *)(pmd_pte & ~(info->l2_masked_bits))
+ + (BTOP(vaddr) & (info->ptrs_per_l1 - 1));
+ if (!readmem(VADDR, PAGEBASE(pmd_pte), info->page_buf, PAGESIZE())) {
+ ERRMSG("Can't read page table: 0x%llx\n", PAGEBASE(pmd_pte));
+ return NOT_PADDR;
+ }
+ pte = ULONG((info->page_buf + PAGEOFFSET(page_table)));
+ if (!(pte & _PAGE_PRESENT)) {
+ ERRMSG("Page not present!\n");
+ return NOT_PADDR;
+ }
+
+ if (!pte)
+ return NOT_PADDR;
+
+ paddr = PAGEBASE(PTOB(pte >> info->pte_shift)) + PAGEOFFSET(vaddr);
+
+ return paddr;
+}
+
int
set_ppc64_max_physmem_bits(void)
{
@@ -347,10 +424,18 @@ vaddr_to_paddr_ppc64(unsigned long vaddr)
{
unsigned long long paddr;
+ if ((info->flag_vmemmap)
+ && (vaddr >= info->vmemmap_start)) {
+ return ppc64_vmemmap_to_phys(vaddr);
+ }
+
paddr = vaddr_to_paddr_general(vaddr);
if (paddr != NOT_PADDR)
return paddr;
+ if (!is_vmalloc_addr_ppc64(vaddr))
+ return (vaddr - info->kernel_start);
+
if ((SYMBOL(vmap_area_list) == NOT_FOUND_SYMBOL)
|| (OFFSET(vmap_area.va_start) == NOT_FOUND_STRUCTURE)
|| (OFFSET(vmap_area.list) == NOT_FOUND_STRUCTURE)) {
@@ -360,19 +445,8 @@ vaddr_to_paddr_ppc64(unsigned long vaddr)
return NOT_PADDR;
}
}
- if (!is_vmalloc_addr_ppc64(vaddr))
- return (vaddr - info->kernel_start);
- if ((info->flag_vmemmap)
- && (vaddr >= info->vmemmap_start)) {
- return ppc64_vmemmap_to_phys(vaddr);
- }
-
- /*
- * TODO: Support vmalloc translation.
- */
- ERRMSG("This makedumpfile does not support vmalloc translation.\n");
- return NOT_PADDR;
+ return ppc64_vtop_level4(vaddr);
}
#endif /* powerpc64 */
diff --git a/makedumpfile.c b/makedumpfile.c
index f54ff8f..11cd473 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -9297,6 +9297,8 @@ out:
free(info->splitting_info);
if (info->p2m_mfn_frame_list != NULL)
free(info->p2m_mfn_frame_list);
+ if (info->page_buf != NULL)
+ free(info->page_buf);
free(info);
}
free_elf_info();
diff --git a/makedumpfile.h b/makedumpfile.h
index 33794f5..eba9798 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -158,6 +158,9 @@ isAnon(unsigned long mapping)
return ((unsigned long)mapping & PAGE_MAPPING_ANON) != 0;
}
+#define PTOB(X) (((unsigned long long)(X)) << PAGESHIFT())
+#define BTOP(X) (((unsigned long long)(X)) >> PAGESHIFT())
+
#define PAGESIZE() (info->page_size)
#define PAGESHIFT() (info->page_shift)
#define PAGEOFFSET(X) (((unsigned long long)(X)) & (PAGESIZE() - 1))
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
next prev parent reply other threads:[~2014-08-08 13:24 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-08 13:23 [PATCH v3 0/2] PPC64: Add virtual to physical address translation support for vmalloc region Hari Bathini
2014-08-08 13:23 ` [PATCH v3 1/2] makedumpfile: Initialize for vmalloc address translation support in PPC64 arch Hari Bathini
2014-08-08 13:23 ` Hari Bathini [this message]
2014-08-13 10:29 ` [PATCH v3 0/2] PPC64: Add virtual to physical address translation support for vmalloc region Atsushi Kumagai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140808132336.11571.79373.stgit@localhost.localdomain \
--to=hbathini@linux.vnet.ibm.com \
--cc=kexec@lists.infradead.org \
--cc=kumagai-atsushi@mxc.nes.nec.co.jp \
--cc=oomichi@mxs.nes.nec.co.jp \
--cc=tachibana@mxm.nes.nec.co.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox