* [PATCH 0/4] Makedumpfile: Add 5-level paging support
@ 2018-03-02 5:48 Baoquan He
2018-03-02 5:48 ` [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables Baoquan He
` (4 more replies)
0 siblings, 5 replies; 16+ messages in thread
From: Baoquan He @ 2018-03-02 5:48 UTC (permalink / raw)
To: kexec; +Cc: douly.fnst, indou.takao, mas-hayashi, Baoquan He, mas-tachibana
Kernel has 5-level paging support and now can support boot-time
switching between 4/5-level paging mode. This patchset is used to add
5-level paging support in makedumpfile.
A kernel fix is posted to export 'pgtable_l5_enabled' to tell if
the corrupted kernel is in 5-level paging mode.
https://patchwork.kernel.org/patch/10253399/
Patch 0001 and 0004 were made by Dou Liyang. While it doesn't work on
the latest 5-level code. So add patch 0002 to introduce 'pgtable_l5_enabled'.
Change and take out the function check_5level_paging() from dou's old
patch and add it into patch 0003. Except of these, don't touch other
part of dou's patches.
Thanks, dou, for the effort!
Baoquan He (2):
Makedumpfile: Add pgtable_l5_enabled to number_table
Makedumpfile: Add a new function check_5level_paging()
Dou Liyang (2):
arch/x86_64: Cleanup the address translation of the 4-level page
tables
arch/x86_64: Add 5-level paging support
arch/x86_64.c | 130 +++++++++++++++++++++++++++++++++++++++++----------------
makedumpfile.c | 3 ++
makedumpfile.h | 39 +++++++++++------
3 files changed, 123 insertions(+), 49 deletions(-)
--
2.13.6
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables
2018-03-02 5:48 [PATCH 0/4] Makedumpfile: Add 5-level paging support Baoquan He
@ 2018-03-02 5:48 ` Baoquan He
2018-05-07 7:19 ` Masaki Tachibana
2018-03-02 5:48 ` [PATCH 2/4] Makedumpfile: Add pgtable_l5_enabled to number_table Baoquan He
` (3 subsequent siblings)
4 siblings, 1 reply; 16+ messages in thread
From: Baoquan He @ 2018-03-02 5:48 UTC (permalink / raw)
To: kexec; +Cc: douly.fnst, indou.takao, mas-hayashi, mas-tachibana
From: Dou Liyang <douly.fnst@cn.fujitsu.com>
Due to the changing of 4-level page tables implementation in kernel, makedumpfile
left behind some of the redundant macros. this make the translation not clear and
hard to expand the code to support 5-level page tables.
Remove the PML4* and PGDIR_* and unify the macro to get the index of PGD.
Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com>
---
arch/x86_64.c | 59 +++++++++++++++++++++++++++++++++++-----------------------
makedumpfile.h | 21 +++++++++------------
2 files changed, 45 insertions(+), 35 deletions(-)
diff --git a/arch/x86_64.c b/arch/x86_64.c
index 1f24415..cbe45c2 100644
--- a/arch/x86_64.c
+++ b/arch/x86_64.c
@@ -257,7 +257,7 @@ get_versiondep_info_x86_64(void)
unsigned long long
__vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
{
- unsigned long page_dir, pml4, pgd_paddr, pgd_pte, pmd_paddr, pmd_pte;
+ unsigned long page_dir, pgd, pud_paddr, pud_pte, pmd_paddr, pmd_pte;
unsigned long pte_paddr, pte;
/*
@@ -269,43 +269,43 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
if (page_dir == NOT_PADDR)
return NOT_PADDR;
}
- page_dir += pml4_index(vaddr) * sizeof(unsigned long);
- if (!readmem(PADDR, page_dir, &pml4, sizeof pml4)) {
- ERRMSG("Can't get pml4 (page_dir:%lx).\n", page_dir);
+ page_dir += pgd_index(vaddr) * sizeof(unsigned long);
+ if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) {
+ ERRMSG("Can't get pgd (page_dir:%lx).\n", page_dir);
return NOT_PADDR;
}
if (info->vaddr_for_vtop == vaddr)
- MSG(" PGD : %16lx => %16lx\n", page_dir, pml4);
+ MSG(" PGD : %16lx => %16lx\n", page_dir, pgd);
- if (!(pml4 & _PAGE_PRESENT)) {
- ERRMSG("Can't get a valid pml4.\n");
+ if (!(pgd & _PAGE_PRESENT)) {
+ ERRMSG("Can't get a valid pgd.\n");
return NOT_PADDR;
}
/*
* Get PUD.
*/
- pgd_paddr = pml4 & ENTRY_MASK;
- pgd_paddr += pgd_index(vaddr) * sizeof(unsigned long);
- if (!readmem(PADDR, pgd_paddr, &pgd_pte, sizeof pgd_pte)) {
- ERRMSG("Can't get pgd_pte (pgd_paddr:%lx).\n", pgd_paddr);
+ pud_paddr = pgd & ENTRY_MASK;
+ pud_paddr += pud_index(vaddr) * sizeof(unsigned long);
+ if (!readmem(PADDR, pud_paddr, &pud_pte, sizeof pud_pte)) {
+ ERRMSG("Can't get pud_pte (pud_paddr:%lx).\n", pud_paddr);
return NOT_PADDR;
}
if (info->vaddr_for_vtop == vaddr)
- MSG(" PUD : %16lx => %16lx\n", pgd_paddr, pgd_pte);
+ MSG(" PUD : %16lx => %16lx\n", pud_paddr, pud_pte);
- if (!(pgd_pte & _PAGE_PRESENT)) {
- ERRMSG("Can't get a valid pgd_pte.\n");
+ if (!(pud_pte & _PAGE_PRESENT)) {
+ ERRMSG("Can't get a valid pud_pte.\n");
return NOT_PADDR;
}
- if (pgd_pte & _PAGE_PSE) /* 1GB pages */
- return (pgd_pte & ENTRY_MASK & PGDIR_MASK) +
- (vaddr & ~PGDIR_MASK);
+ if (pud_pte & _PAGE_PSE) /* 1GB pages */
+ return (pud_pte & ENTRY_MASK & PUD_MASK) +
+ (vaddr & ~PUD_MASK);
/*
* Get PMD.
*/
- pmd_paddr = pgd_pte & ENTRY_MASK;
+ pmd_paddr = pud_pte & ENTRY_MASK;
pmd_paddr += pmd_index(vaddr) * sizeof(unsigned long);
if (!readmem(PADDR, pmd_paddr, &pmd_pte, sizeof pmd_pte)) {
ERRMSG("Can't get pmd_pte (pmd_paddr:%lx).\n", pmd_paddr);
@@ -391,15 +391,22 @@ kvtop_xen_x86_64(unsigned long kvaddr)
if ((dirp = kvtop_xen_x86_64(SYMBOL(pgd_l4))) == NOT_PADDR)
return NOT_PADDR;
- dirp += pml4_index(kvaddr) * sizeof(unsigned long long);
+
+ /*
+ * Get PGD.
+ */
+ dirp += pgd_index(kvaddr) * sizeof(unsigned long long);
if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
return NOT_PADDR;
if (!(entry & _PAGE_PRESENT))
return NOT_PADDR;
+ /*
+ * Get PUD.
+ */
dirp = entry & ENTRY_MASK;
- dirp += pgd_index(kvaddr) * sizeof(unsigned long long);
+ dirp += pud_index(kvaddr) * sizeof(unsigned long long);
if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
return NOT_PADDR;
@@ -407,9 +414,12 @@ kvtop_xen_x86_64(unsigned long kvaddr)
return NOT_PADDR;
if (entry & _PAGE_PSE) /* 1GB pages */
- return (entry & ENTRY_MASK & PGDIR_MASK) +
- (kvaddr & ~PGDIR_MASK);
+ return (entry & ENTRY_MASK & PUD_MASK) +
+ (kvaddr & ~PUD_MASK);
+ /*
+ * Get PMD.
+ */
dirp = entry & ENTRY_MASK;
dirp += pmd_index(kvaddr) * sizeof(unsigned long long);
if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
@@ -422,6 +432,9 @@ kvtop_xen_x86_64(unsigned long kvaddr)
return (entry & ENTRY_MASK & PMD_MASK) +
(kvaddr & ~PMD_MASK);
+ /*
+ * Get PTE.
+ */
dirp = entry & ENTRY_MASK;
dirp += pte_index(kvaddr) * sizeof(unsigned long long);
if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
@@ -596,7 +609,7 @@ find_vmemmap_x86_64()
* for max_paddr >> 12 page structures
*/
high_pfn = max_paddr >> 12;
- pgd_index = pgd4_index(vaddr_base);
+ pgd_index = pgd_index(vaddr_base);
pgd_addr = vaddr_to_paddr(init_level4_pgt); /* address of pgd */
pgd_addr += pgd_index * sizeof(unsigned long);
page_structs_per_pud = (PTRS_PER_PUD * PTRS_PER_PMD * info->page_size) /
diff --git a/makedumpfile.h b/makedumpfile.h
index 01eece2..088dfc3 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -602,25 +602,22 @@ unsigned long get_kvbase_arm64(void);
/*
* 4 Levels paging
*/
-#define PML4_SHIFT (39)
-#define PTRS_PER_PML4 (512)
-#define PGDIR_SHIFT (30)
-#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
-#define PGDIR_MASK (~(PGDIR_SIZE - 1))
-#define PTRS_PER_PGD (512)
#define PGD_SHIFT (39)
#define PUD_SHIFT (30)
#define PMD_SHIFT (21)
-#define PMD_SIZE (1UL << PMD_SHIFT)
-#define PMD_MASK (~(PMD_SIZE - 1))
+#define PTE_SHIFT (12)
+
+#define PTRS_PER_PGD (512)
#define PTRS_PER_PUD (512)
#define PTRS_PER_PMD (512)
#define PTRS_PER_PTE (512)
-#define PTE_SHIFT (12)
-#define pml4_index(address) (((address) >> PML4_SHIFT) & (PTRS_PER_PML4 - 1))
-#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1))
-#define pgd4_index(address) (((address) >> PGD_SHIFT) & (PTRS_PER_PGD - 1))
+#define PUD_SIZE (1UL << PUD_SHIFT)
+#define PUD_MASK (~(PUD_SHIFT - 1))
+#define PMD_SIZE (1UL << PMD_SHIFT)
+#define PMD_MASK (~(PMD_SIZE - 1))
+
+#define pgd_index(address) (((address) >> PGD_SHIFT) & (PTRS_PER_PGD - 1))
#define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD - 1))
#define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
#define pte_index(address) (((address) >> PTE_SHIFT) & (PTRS_PER_PTE - 1))
--
2.13.6
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 2/4] Makedumpfile: Add pgtable_l5_enabled to number_table
2018-03-02 5:48 [PATCH 0/4] Makedumpfile: Add 5-level paging support Baoquan He
2018-03-02 5:48 ` [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables Baoquan He
@ 2018-03-02 5:48 ` Baoquan He
2018-05-07 7:20 ` Masaki Tachibana
2018-03-02 5:48 ` [PATCH 3/4] Makedumpfile: Add a new function check_5level_paging() Baoquan He
` (2 subsequent siblings)
4 siblings, 1 reply; 16+ messages in thread
From: Baoquan He @ 2018-03-02 5:48 UTC (permalink / raw)
To: kexec; +Cc: douly.fnst, indou.takao, mas-hayashi, Baoquan He, mas-tachibana
This is in preparation for later 5-level supporting.
Signed-off-by: Baoquan He <bhe@redhat.com>
---
makedumpfile.c | 3 +++
makedumpfile.h | 1 +
2 files changed, 4 insertions(+)
diff --git a/makedumpfile.c b/makedumpfile.c
index ed138d3..c1e893a 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -1723,6 +1723,7 @@ get_structure_info(void)
ENUM_NUMBER_INIT(NR_FREE_PAGES, "NR_FREE_PAGES");
ENUM_NUMBER_INIT(N_ONLINE, "N_ONLINE");
+ ENUM_NUMBER_INIT(N_ONLINE, "pgtable_l5_enabled");
ENUM_NUMBER_INIT(PG_lru, "PG_lru");
ENUM_NUMBER_INIT(PG_private, "PG_private");
@@ -2251,6 +2252,7 @@ write_vmcoreinfo_data(void)
WRITE_NUMBER("NR_FREE_PAGES", NR_FREE_PAGES);
WRITE_NUMBER("N_ONLINE", N_ONLINE);
+ WRITE_NUMBER("N_ONLINE", pgtable_l5_enabled);
WRITE_NUMBER("PG_lru", PG_lru);
WRITE_NUMBER("PG_private", PG_private);
@@ -2645,6 +2647,7 @@ read_vmcoreinfo(void)
READ_NUMBER("NR_FREE_PAGES", NR_FREE_PAGES);
READ_NUMBER("N_ONLINE", N_ONLINE);
+ READ_NUMBER("pgtable_l5_enabled", pgtable_l5_enabled);
READ_NUMBER("PG_lru", PG_lru);
READ_NUMBER("PG_private", PG_private);
diff --git a/makedumpfile.h b/makedumpfile.h
index 088dfc3..a0d1c13 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -1856,6 +1856,7 @@ struct array_table {
struct number_table {
long NR_FREE_PAGES;
long N_ONLINE;
+ long pgtable_l5_enabled;
/*
* Page flags
--
2.13.6
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 3/4] Makedumpfile: Add a new function check_5level_paging()
2018-03-02 5:48 [PATCH 0/4] Makedumpfile: Add 5-level paging support Baoquan He
2018-03-02 5:48 ` [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables Baoquan He
2018-03-02 5:48 ` [PATCH 2/4] Makedumpfile: Add pgtable_l5_enabled to number_table Baoquan He
@ 2018-03-02 5:48 ` Baoquan He
2018-05-07 7:21 ` Masaki Tachibana
2018-03-02 5:48 ` [PATCH 4/4] arch/x86_64: Add 5-level paging support Baoquan He
2018-04-12 2:45 ` [PATCH 0/4] Makedumpfile: " Baoquan He
4 siblings, 1 reply; 16+ messages in thread
From: Baoquan He @ 2018-03-02 5:48 UTC (permalink / raw)
To: kexec; +Cc: douly.fnst, indou.takao, mas-hayashi, Baoquan He, mas-tachibana
Use it to check if the corrupted kernel is in 5-level paging.
Signed-off-by: Baoquan He <bhe@redhat.com>
---
arch/x86_64.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/arch/x86_64.c b/arch/x86_64.c
index cbe45c2..e88ee0b 100644
--- a/arch/x86_64.c
+++ b/arch/x86_64.c
@@ -33,6 +33,15 @@ get_xen_p2m_mfn(void)
return NOT_FOUND_LONG_VALUE;
}
+static int
+check_5level_paging(void)
+{
+ if (NUMBER(pgtable_l5_enabled) != 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
unsigned long
get_kaslr_offset_x86_64(unsigned long vaddr)
{
--
2.13.6
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 4/4] arch/x86_64: Add 5-level paging support
2018-03-02 5:48 [PATCH 0/4] Makedumpfile: Add 5-level paging support Baoquan He
` (2 preceding siblings ...)
2018-03-02 5:48 ` [PATCH 3/4] Makedumpfile: Add a new function check_5level_paging() Baoquan He
@ 2018-03-02 5:48 ` Baoquan He
2018-05-07 7:22 ` Masaki Tachibana
2018-04-12 2:45 ` [PATCH 0/4] Makedumpfile: " Baoquan He
4 siblings, 1 reply; 16+ messages in thread
From: Baoquan He @ 2018-03-02 5:48 UTC (permalink / raw)
To: kexec; +Cc: douly.fnst, indou.takao, mas-hayashi, mas-tachibana
From: Dou Liyang <douly.fnst@cn.fujitsu.com>
Now, kernel can use 5-level page tables in x86_64 system.
Add the 5-level paging support for makedumpfile.
Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com>
---
arch/x86_64.c | 76 ++++++++++++++++++++++++++++++++++++++++++----------------
makedumpfile.h | 17 +++++++++++++
2 files changed, 72 insertions(+), 21 deletions(-)
diff --git a/arch/x86_64.c b/arch/x86_64.c
index e88ee0b..b242f36 100644
--- a/arch/x86_64.c
+++ b/arch/x86_64.c
@@ -112,6 +112,8 @@ get_page_offset_x86_64(void)
if (info->kernel_version < KERNEL_VERSION(2, 6, 27)) {
info->page_offset = __PAGE_OFFSET_ORIG;
+ } else if(check_5level_paging()) {
+ info->page_offset = __PAGE_OFFSET_5LEVEL;
} else {
info->page_offset = __PAGE_OFFSET_2_6_27;
}
@@ -243,6 +245,8 @@ get_versiondep_info_x86_64(void)
info->max_physmem_bits = _MAX_PHYSMEM_BITS_ORIG;
else if (info->kernel_version < KERNEL_VERSION(2, 6, 31))
info->max_physmem_bits = _MAX_PHYSMEM_BITS_2_6_26;
+ else if(check_5level_paging())
+ info->max_physmem_bits = _MAX_PHYSMEM_BITS_5LEVEL;
else
info->max_physmem_bits = _MAX_PHYSMEM_BITS_2_6_31;
@@ -252,6 +256,9 @@ get_versiondep_info_x86_64(void)
if (info->kernel_version < KERNEL_VERSION(2, 6, 31)) {
info->vmemmap_start = VMEMMAP_START_ORIG;
info->vmemmap_end = VMEMMAP_END_ORIG;
+ } else if(check_5level_paging()) {
+ info->vmemmap_start = VMEMMAP_START_5LEVEL;
+ info->vmemmap_end = VMEMMAP_END_5LEVEL;
} else {
info->vmemmap_start = VMEMMAP_START_2_6_31;
info->vmemmap_end = VMEMMAP_END_2_6_31;
@@ -268,6 +275,7 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
{
unsigned long page_dir, pgd, pud_paddr, pud_pte, pmd_paddr, pmd_pte;
unsigned long pte_paddr, pte;
+ unsigned long p4d_paddr, p4d_pte;
/*
* Get PGD.
@@ -278,23 +286,56 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
if (page_dir == NOT_PADDR)
return NOT_PADDR;
}
- page_dir += pgd_index(vaddr) * sizeof(unsigned long);
- if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) {
- ERRMSG("Can't get pgd (page_dir:%lx).\n", page_dir);
- return NOT_PADDR;
- }
- if (info->vaddr_for_vtop == vaddr)
- MSG(" PGD : %16lx => %16lx\n", page_dir, pgd);
- if (!(pgd & _PAGE_PRESENT)) {
- ERRMSG("Can't get a valid pgd.\n");
- return NOT_PADDR;
+ if (check_5level_paging()) {
+ page_dir += pgd5_index(vaddr) * sizeof(unsigned long);
+ if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) {
+ ERRMSG("Can't get pgd (page_dir:%lx).\n", page_dir);
+ return NOT_PADDR;
+ }
+ if (info->vaddr_for_vtop == vaddr)
+ MSG(" PGD : %16lx => %16lx\n", page_dir, pgd);
+
+ if (!(pgd & _PAGE_PRESENT)) {
+ ERRMSG("Can't get a valid pgd.\n");
+ return NOT_PADDR;
+ }
+ /*
+ * Get P4D.
+ */
+ p4d_paddr = pgd & ENTRY_MASK;
+ p4d_paddr += p4d_index(vaddr) * sizeof(unsigned long);
+ if (!readmem(PADDR, p4d_paddr, &p4d_pte, sizeof p4d_pte)) {
+ ERRMSG("Can't get p4d_pte (p4d_paddr:%lx).\n", p4d_paddr);
+ return NOT_PADDR;
+ }
+ if (info->vaddr_for_vtop == vaddr)
+ MSG(" P4D : %16lx => %16lx\n", p4d_paddr, p4d_pte);
+
+ if (!(p4d_pte & _PAGE_PRESENT)) {
+ ERRMSG("Can't get a valid p4d_pte.\n");
+ return NOT_PADDR;
+ }
+ pud_paddr = p4d_pte & ENTRY_MASK;
+ }else {
+ page_dir += pgd_index(vaddr) * sizeof(unsigned long);
+ if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) {
+ ERRMSG("Can't get pgd (page_dir:%lx).\n", page_dir);
+ return NOT_PADDR;
+ }
+ if (info->vaddr_for_vtop == vaddr)
+ MSG(" PGD : %16lx => %16lx\n", page_dir, pgd);
+
+ if (!(pgd & _PAGE_PRESENT)) {
+ ERRMSG("Can't get a valid pgd.\n");
+ return NOT_PADDR;
+ }
+ pud_paddr = pgd & ENTRY_MASK;
}
/*
* Get PUD.
*/
- pud_paddr = pgd & ENTRY_MASK;
pud_paddr += pud_index(vaddr) * sizeof(unsigned long);
if (!readmem(PADDR, pud_paddr, &pud_pte, sizeof pud_pte)) {
ERRMSG("Can't get pud_pte (pud_paddr:%lx).\n", pud_paddr);
@@ -361,12 +402,7 @@ vtop4_x86_64(unsigned long vaddr)
else if (SYMBOL(init_top_pgt) != NOT_FOUND_SYMBOL)
init_level4_pgt = SYMBOL(init_top_pgt);
else {
- ERRMSG("Can't get the symbol of init_level4_pgt.\n");
- return NOT_PADDR;
- }
-
- if (SYMBOL(level4_kernel_pgt) != NOT_FOUND_SYMBOL) {
- ERRMSG("Kernel is built with 5-level page tables\n");
+ ERRMSG("Can't get the symbol of init_level4_pgt/init_top_pgt.\n");
return NOT_PADDR;
}
@@ -605,10 +641,6 @@ find_vmemmap_x86_64()
return FAILED;
}
- if (SYMBOL(level4_kernel_pgt) != NOT_FOUND_SYMBOL) {
- ERRMSG("kernel is configured for 5-level page tables\n");
- return FAILED;
- }
pagestructsize = size_table.page;
hugepagesize = PTRS_PER_PMD * info->page_size;
vaddr_base = info->vmemmap_start;
@@ -630,12 +662,14 @@ find_vmemmap_x86_64()
/* outer loop is for pud entries in the pgd */
for (pgdindex = 0, pgdp = (unsigned long *)pgd_addr; pgdindex < num_puds;
pgdindex++, pgdp++) {
+
/* read the pgd one word at a time, into pud_addr */
if (!readmem(PADDR, (unsigned long long)pgdp, (void *)&pud_addr,
sizeof(unsigned long))) {
ERRMSG("Can't get pgd entry for slot %d.\n", pgd_index);
return FAILED;
}
+
/* mask the pgd entry for the address of the pud page */
pud_addr &= PMASK;
if (pud_addr == 0)
diff --git a/makedumpfile.h b/makedumpfile.h
index a0d1c13..d26c30b 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -581,16 +581,21 @@ unsigned long get_kvbase_arm64(void);
#ifdef __x86_64__
#define __PAGE_OFFSET_ORIG (0xffff810000000000) /* 2.6.26, or former */
#define __PAGE_OFFSET_2_6_27 (0xffff880000000000) /* 2.6.27, or later */
+#define __PAGE_OFFSET_5LEVEL (0xff10000000000000) /* 5-level page table */
#define VMALLOC_START_ORIG (0xffffc20000000000) /* 2.6.30, or former */
#define VMALLOC_START_2_6_31 (0xffffc90000000000) /* 2.6.31, or later */
+#define VMALLOC_START_5LEVEL (0xffa0000000000000) /* 5-level page table */
#define VMALLOC_END_ORIG (0xffffe1ffffffffff) /* 2.6.30, or former */
#define VMALLOC_END_2_6_31 (0xffffe8ffffffffff) /* 2.6.31, or later */
+#define VMALLOC_END_5LEVEL (0xffd1ffffffffffff) /* 5-level page table */
#define VMEMMAP_START_ORIG (0xffffe20000000000) /* 2.6.30, or former */
#define VMEMMAP_START_2_6_31 (0xffffea0000000000) /* 2.6.31, or later */
+#define VMEMMAP_START_5LEVEL (0xffd4000000000000) /* 5-level page table */
#define VMEMMAP_END_ORIG (0xffffe2ffffffffff) /* 2.6.30, or former */
#define VMEMMAP_END_2_6_31 (0xffffeaffffffffff) /* 2.6.31, or later */
+#define VMEMMAP_END_5LEVEL (0xffd5ffffffffffff) /* 5-level page table */
#define __START_KERNEL_map (0xffffffff80000000)
#define KVBASE PAGE_OFFSET
@@ -598,6 +603,7 @@ unsigned long get_kvbase_arm64(void);
#define _MAX_PHYSMEM_BITS_ORIG (40)
#define _MAX_PHYSMEM_BITS_2_6_26 (44)
#define _MAX_PHYSMEM_BITS_2_6_31 (46)
+#define _MAX_PHYSMEM_BITS_5LEVEL (52)
/*
* 4 Levels paging
@@ -617,7 +623,18 @@ unsigned long get_kvbase_arm64(void);
#define PMD_SIZE (1UL << PMD_SHIFT)
#define PMD_MASK (~(PMD_SIZE - 1))
+/*
+ * 5 Levels paging
+ */
+#define PGD_SHIFT_5LEVEL (48)
+#define P4D_SHIFT (39)
+
+#define PTRS_PER_PGD_5LEVEL (512)
+#define PTRS_PER_P4D (512)
+
+#define pgd5_index(address) (((address) >> PGD_SHIFT_5LEVEL) & (PTRS_PER_PGD_5LEVEL - 1))
#define pgd_index(address) (((address) >> PGD_SHIFT) & (PTRS_PER_PGD - 1))
+#define p4d_index(address) (((address) >> P4D_SHIFT) & (PTRS_PER_P4D - 1))
#define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD - 1))
#define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
#define pte_index(address) (((address) >> PTE_SHIFT) & (PTRS_PER_PTE - 1))
--
2.13.6
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 0/4] Makedumpfile: Add 5-level paging support
2018-03-02 5:48 [PATCH 0/4] Makedumpfile: Add 5-level paging support Baoquan He
` (3 preceding siblings ...)
2018-03-02 5:48 ` [PATCH 4/4] arch/x86_64: Add 5-level paging support Baoquan He
@ 2018-04-12 2:45 ` Baoquan He
2018-04-12 4:42 ` Masaki Tachibana
4 siblings, 1 reply; 16+ messages in thread
From: Baoquan He @ 2018-04-12 2:45 UTC (permalink / raw)
To: mas-tachibana, mas-hayashi, Takuya Nakayama
Cc: douly.fnst, indou.takao, kexec
Hi Tachibana, Nakayama,
Ping!
Now 5-level suport on x86 64 has been merged into 4.16, do we have plan
to merge this patchset? Or defer to a certain phase?
Thanks
Baoquan
On 03/02/18 at 01:48pm, Baoquan He wrote:
> Kernel has 5-level paging support and now can support boot-time
> switching between 4/5-level paging mode. This patchset is used to add
> 5-level paging support in makedumpfile.
>
> A kernel fix is posted to export 'pgtable_l5_enabled' to tell if
> the corrupted kernel is in 5-level paging mode.
> https://patchwork.kernel.org/patch/10253399/
>
> Patch 0001 and 0004 were made by Dou Liyang. While it doesn't work on
> the latest 5-level code. So add patch 0002 to introduce 'pgtable_l5_enabled'.
> Change and take out the function check_5level_paging() from dou's old
> patch and add it into patch 0003. Except of these, don't touch other
> part of dou's patches.
>
> Thanks, dou, for the effort!
>
> Baoquan He (2):
> Makedumpfile: Add pgtable_l5_enabled to number_table
> Makedumpfile: Add a new function check_5level_paging()
>
> Dou Liyang (2):
> arch/x86_64: Cleanup the address translation of the 4-level page
> tables
> arch/x86_64: Add 5-level paging support
>
> arch/x86_64.c | 130 +++++++++++++++++++++++++++++++++++++++++----------------
> makedumpfile.c | 3 ++
> makedumpfile.h | 39 +++++++++++------
> 3 files changed, 123 insertions(+), 49 deletions(-)
>
> --
> 2.13.6
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 0/4] Makedumpfile: Add 5-level paging support
2018-04-12 2:45 ` [PATCH 0/4] Makedumpfile: " Baoquan He
@ 2018-04-12 4:42 ` Masaki Tachibana
2018-04-12 4:55 ` Baoquan He
0 siblings, 1 reply; 16+ messages in thread
From: Masaki Tachibana @ 2018-04-12 4:42 UTC (permalink / raw)
To: Baoquan He; +Cc: douly.fnst, indou.takao, kexec, Keiichi Nakamura
Hi Baoquan,
Sorry for the late reply.
I'll merge the patches into V1.6.4.
However, I need time to acknowledge formally.
Please wait some weeks.
Thanks
Tachibana
> -----Original Message-----
> From: Baoquan He [mailto:bhe@redhat.com]
> Sent: Thursday, April 12, 2018 11:45 AM
> To: Tachibana Masaki() <mas-tachibana@vf.jp.nec.com>; Hayashi Masahiko() <mas-hayashi@tg.jp.nec.com>;
> Nakayama Takuya() <tak-nakayama@tg.jp.nec.com>
> Cc: douly.fnst@cn.fujitsu.com; indou.takao@jp.fujitsu.com; kexec@lists.infradead.org
> Subject: Re: [PATCH 0/4] Makedumpfile: Add 5-level paging support
>
> Hi Tachibana, Nakayama,
>
> Ping!
>
> Now 5-level suport on x86 64 has been merged into 4.16, do we have plan
> to merge this patchset? Or defer to a certain phase?
>
> Thanks
> Baoquan
>
> On 03/02/18 at 01:48pm, Baoquan He wrote:
> > Kernel has 5-level paging support and now can support boot-time
> > switching between 4/5-level paging mode. This patchset is used to add
> > 5-level paging support in makedumpfile.
> >
> > A kernel fix is posted to export 'pgtable_l5_enabled' to tell if
> > the corrupted kernel is in 5-level paging mode.
> > https://patchwork.kernel.org/patch/10253399/
> >
> > Patch 0001 and 0004 were made by Dou Liyang. While it doesn't work on
> > the latest 5-level code. So add patch 0002 to introduce 'pgtable_l5_enabled'.
> > Change and take out the function check_5level_paging() from dou's old
> > patch and add it into patch 0003. Except of these, don't touch other
> > part of dou's patches.
> >
> > Thanks, dou, for the effort!
> >
> > Baoquan He (2):
> > Makedumpfile: Add pgtable_l5_enabled to number_table
> > Makedumpfile: Add a new function check_5level_paging()
> >
> > Dou Liyang (2):
> > arch/x86_64: Cleanup the address translation of the 4-level page
> > tables
> > arch/x86_64: Add 5-level paging support
> >
> > arch/x86_64.c | 130 +++++++++++++++++++++++++++++++++++++++++----------------
> > makedumpfile.c | 3 ++
> > makedumpfile.h | 39 +++++++++++------
> > 3 files changed, 123 insertions(+), 49 deletions(-)
> >
> > --
> > 2.13.6
> >
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 0/4] Makedumpfile: Add 5-level paging support
2018-04-12 4:42 ` Masaki Tachibana
@ 2018-04-12 4:55 ` Baoquan He
0 siblings, 0 replies; 16+ messages in thread
From: Baoquan He @ 2018-04-12 4:55 UTC (permalink / raw)
To: Masaki Tachibana; +Cc: douly.fnst, indou.takao, kexec, Keiichi Nakamura
On 04/12/18 at 04:42am, Masaki Tachibana wrote:
> Hi Baoquan,
>
> Sorry for the late reply.
> I'll merge the patches into V1.6.4.
That's great, thanks.
> However, I need time to acknowledge formally.
> Please wait some weeks.
Sure, it's not very urgent.
Thanks
Baoquan
>
> > -----Original Message-----
> > From: Baoquan He [mailto:bhe@redhat.com]
> > Sent: Thursday, April 12, 2018 11:45 AM
> > To: Tachibana Masaki() <mas-tachibana@vf.jp.nec.com>; Hayashi Masahiko() <mas-hayashi@tg.jp.nec.com>;
> > Nakayama Takuya() <tak-nakayama@tg.jp.nec.com>
> > Cc: douly.fnst@cn.fujitsu.com; indou.takao@jp.fujitsu.com; kexec@lists.infradead.org
> > Subject: Re: [PATCH 0/4] Makedumpfile: Add 5-level paging support
> >
> > Hi Tachibana, Nakayama,
> >
> > Ping!
> >
> > Now 5-level suport on x86 64 has been merged into 4.16, do we have plan
> > to merge this patchset? Or defer to a certain phase?
> >
> > Thanks
> > Baoquan
> >
> > On 03/02/18 at 01:48pm, Baoquan He wrote:
> > > Kernel has 5-level paging support and now can support boot-time
> > > switching between 4/5-level paging mode. This patchset is used to add
> > > 5-level paging support in makedumpfile.
> > >
> > > A kernel fix is posted to export 'pgtable_l5_enabled' to tell if
> > > the corrupted kernel is in 5-level paging mode.
> > > https://patchwork.kernel.org/patch/10253399/
> > >
> > > Patch 0001 and 0004 were made by Dou Liyang. While it doesn't work on
> > > the latest 5-level code. So add patch 0002 to introduce 'pgtable_l5_enabled'.
> > > Change and take out the function check_5level_paging() from dou's old
> > > patch and add it into patch 0003. Except of these, don't touch other
> > > part of dou's patches.
> > >
> > > Thanks, dou, for the effort!
> > >
> > > Baoquan He (2):
> > > Makedumpfile: Add pgtable_l5_enabled to number_table
> > > Makedumpfile: Add a new function check_5level_paging()
> > >
> > > Dou Liyang (2):
> > > arch/x86_64: Cleanup the address translation of the 4-level page
> > > tables
> > > arch/x86_64: Add 5-level paging support
> > >
> > > arch/x86_64.c | 130 +++++++++++++++++++++++++++++++++++++++++----------------
> > > makedumpfile.c | 3 ++
> > > makedumpfile.h | 39 +++++++++++------
> > > 3 files changed, 123 insertions(+), 49 deletions(-)
> > >
> > > --
> > > 2.13.6
> > >
>
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables
2018-03-02 5:48 ` [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables Baoquan He
@ 2018-05-07 7:19 ` Masaki Tachibana
2018-05-07 7:30 ` Dou Liyang
2018-05-07 7:31 ` Baoquan He
0 siblings, 2 replies; 16+ messages in thread
From: Masaki Tachibana @ 2018-05-07 7:19 UTC (permalink / raw)
To: Baoquan He; +Cc: douly.fnst, indou.takao, kexec, Keiichi Nakamura
Hi Baoquan,
Sorry for the late reply.
> +#define PUD_SIZE (1UL << PUD_SHIFT)
> +#define PUD_MASK (~(PUD_SHIFT - 1))
Is this (~(PUD_SIZE - 1)) ?
If so, I will correct this.
> +#define PMD_SIZE (1UL << PMD_SHIFT)
> +#define PMD_MASK (~(PMD_SIZE - 1))
Thanks
Tachibana
> -----Original Message-----
> From: kexec [mailto:kexec-bounces@lists.infradead.org] On Behalf Of Baoquan He
> Sent: Friday, March 02, 2018 2:49 PM
> To: kexec@lists.infradead.org
> Cc: douly.fnst@cn.fujitsu.com; indou.takao@jp.fujitsu.com; Hayashi Masahiko() <mas-hayashi@tg.jp.nec.com>;
> Tachibana Masaki() <mas-tachibana@vf.jp.nec.com>
> Subject: [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables
>
> From: Dou Liyang <douly.fnst@cn.fujitsu.com>
>
> Due to the changing of 4-level page tables implementation in kernel, makedumpfile
> left behind some of the redundant macros. this make the translation not clear and
> hard to expand the code to support 5-level page tables.
>
> Remove the PML4* and PGDIR_* and unify the macro to get the index of PGD.
>
> Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com>
> ---
> arch/x86_64.c | 59 +++++++++++++++++++++++++++++++++++-----------------------
> makedumpfile.h | 21 +++++++++------------
> 2 files changed, 45 insertions(+), 35 deletions(-)
>
> diff --git a/arch/x86_64.c b/arch/x86_64.c
> index 1f24415..cbe45c2 100644
> --- a/arch/x86_64.c
> +++ b/arch/x86_64.c
> @@ -257,7 +257,7 @@ get_versiondep_info_x86_64(void)
> unsigned long long
> __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
> {
> - unsigned long page_dir, pml4, pgd_paddr, pgd_pte, pmd_paddr, pmd_pte;
> + unsigned long page_dir, pgd, pud_paddr, pud_pte, pmd_paddr, pmd_pte;
> unsigned long pte_paddr, pte;
>
> /*
> @@ -269,43 +269,43 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
> if (page_dir == NOT_PADDR)
> return NOT_PADDR;
> }
> - page_dir += pml4_index(vaddr) * sizeof(unsigned long);
> - if (!readmem(PADDR, page_dir, &pml4, sizeof pml4)) {
> - ERRMSG("Can't get pml4 (page_dir:%lx).\n", page_dir);
> + page_dir += pgd_index(vaddr) * sizeof(unsigned long);
> + if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) {
> + ERRMSG("Can't get pgd (page_dir:%lx).\n", page_dir);
> return NOT_PADDR;
> }
> if (info->vaddr_for_vtop == vaddr)
> - MSG(" PGD : %16lx => %16lx\n", page_dir, pml4);
> + MSG(" PGD : %16lx => %16lx\n", page_dir, pgd);
>
> - if (!(pml4 & _PAGE_PRESENT)) {
> - ERRMSG("Can't get a valid pml4.\n");
> + if (!(pgd & _PAGE_PRESENT)) {
> + ERRMSG("Can't get a valid pgd.\n");
> return NOT_PADDR;
> }
>
> /*
> * Get PUD.
> */
> - pgd_paddr = pml4 & ENTRY_MASK;
> - pgd_paddr += pgd_index(vaddr) * sizeof(unsigned long);
> - if (!readmem(PADDR, pgd_paddr, &pgd_pte, sizeof pgd_pte)) {
> - ERRMSG("Can't get pgd_pte (pgd_paddr:%lx).\n", pgd_paddr);
> + pud_paddr = pgd & ENTRY_MASK;
> + pud_paddr += pud_index(vaddr) * sizeof(unsigned long);
> + if (!readmem(PADDR, pud_paddr, &pud_pte, sizeof pud_pte)) {
> + ERRMSG("Can't get pud_pte (pud_paddr:%lx).\n", pud_paddr);
> return NOT_PADDR;
> }
> if (info->vaddr_for_vtop == vaddr)
> - MSG(" PUD : %16lx => %16lx\n", pgd_paddr, pgd_pte);
> + MSG(" PUD : %16lx => %16lx\n", pud_paddr, pud_pte);
>
> - if (!(pgd_pte & _PAGE_PRESENT)) {
> - ERRMSG("Can't get a valid pgd_pte.\n");
> + if (!(pud_pte & _PAGE_PRESENT)) {
> + ERRMSG("Can't get a valid pud_pte.\n");
> return NOT_PADDR;
> }
> - if (pgd_pte & _PAGE_PSE) /* 1GB pages */
> - return (pgd_pte & ENTRY_MASK & PGDIR_MASK) +
> - (vaddr & ~PGDIR_MASK);
> + if (pud_pte & _PAGE_PSE) /* 1GB pages */
> + return (pud_pte & ENTRY_MASK & PUD_MASK) +
> + (vaddr & ~PUD_MASK);
>
> /*
> * Get PMD.
> */
> - pmd_paddr = pgd_pte & ENTRY_MASK;
> + pmd_paddr = pud_pte & ENTRY_MASK;
> pmd_paddr += pmd_index(vaddr) * sizeof(unsigned long);
> if (!readmem(PADDR, pmd_paddr, &pmd_pte, sizeof pmd_pte)) {
> ERRMSG("Can't get pmd_pte (pmd_paddr:%lx).\n", pmd_paddr);
> @@ -391,15 +391,22 @@ kvtop_xen_x86_64(unsigned long kvaddr)
>
> if ((dirp = kvtop_xen_x86_64(SYMBOL(pgd_l4))) == NOT_PADDR)
> return NOT_PADDR;
> - dirp += pml4_index(kvaddr) * sizeof(unsigned long long);
> +
> + /*
> + * Get PGD.
> + */
> + dirp += pgd_index(kvaddr) * sizeof(unsigned long long);
> if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
> return NOT_PADDR;
>
> if (!(entry & _PAGE_PRESENT))
> return NOT_PADDR;
>
> + /*
> + * Get PUD.
> + */
> dirp = entry & ENTRY_MASK;
> - dirp += pgd_index(kvaddr) * sizeof(unsigned long long);
> + dirp += pud_index(kvaddr) * sizeof(unsigned long long);
> if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
> return NOT_PADDR;
>
> @@ -407,9 +414,12 @@ kvtop_xen_x86_64(unsigned long kvaddr)
> return NOT_PADDR;
>
> if (entry & _PAGE_PSE) /* 1GB pages */
> - return (entry & ENTRY_MASK & PGDIR_MASK) +
> - (kvaddr & ~PGDIR_MASK);
> + return (entry & ENTRY_MASK & PUD_MASK) +
> + (kvaddr & ~PUD_MASK);
>
> + /*
> + * Get PMD.
> + */
> dirp = entry & ENTRY_MASK;
> dirp += pmd_index(kvaddr) * sizeof(unsigned long long);
> if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
> @@ -422,6 +432,9 @@ kvtop_xen_x86_64(unsigned long kvaddr)
> return (entry & ENTRY_MASK & PMD_MASK) +
> (kvaddr & ~PMD_MASK);
>
> + /*
> + * Get PTE.
> + */
> dirp = entry & ENTRY_MASK;
> dirp += pte_index(kvaddr) * sizeof(unsigned long long);
> if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
> @@ -596,7 +609,7 @@ find_vmemmap_x86_64()
> * for max_paddr >> 12 page structures
> */
> high_pfn = max_paddr >> 12;
> - pgd_index = pgd4_index(vaddr_base);
> + pgd_index = pgd_index(vaddr_base);
> pgd_addr = vaddr_to_paddr(init_level4_pgt); /* address of pgd */
> pgd_addr += pgd_index * sizeof(unsigned long);
> page_structs_per_pud = (PTRS_PER_PUD * PTRS_PER_PMD * info->page_size) /
> diff --git a/makedumpfile.h b/makedumpfile.h
> index 01eece2..088dfc3 100644
> --- a/makedumpfile.h
> +++ b/makedumpfile.h
> @@ -602,25 +602,22 @@ unsigned long get_kvbase_arm64(void);
> /*
> * 4 Levels paging
> */
> -#define PML4_SHIFT (39)
> -#define PTRS_PER_PML4 (512)
> -#define PGDIR_SHIFT (30)
> -#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
> -#define PGDIR_MASK (~(PGDIR_SIZE - 1))
> -#define PTRS_PER_PGD (512)
> #define PGD_SHIFT (39)
> #define PUD_SHIFT (30)
> #define PMD_SHIFT (21)
> -#define PMD_SIZE (1UL << PMD_SHIFT)
> -#define PMD_MASK (~(PMD_SIZE - 1))
> +#define PTE_SHIFT (12)
> +
> +#define PTRS_PER_PGD (512)
> #define PTRS_PER_PUD (512)
> #define PTRS_PER_PMD (512)
> #define PTRS_PER_PTE (512)
> -#define PTE_SHIFT (12)
>
> -#define pml4_index(address) (((address) >> PML4_SHIFT) & (PTRS_PER_PML4 - 1))
> -#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1))
> -#define pgd4_index(address) (((address) >> PGD_SHIFT) & (PTRS_PER_PGD - 1))
> +#define PUD_SIZE (1UL << PUD_SHIFT)
> +#define PUD_MASK (~(PUD_SHIFT - 1))
> +#define PMD_SIZE (1UL << PMD_SHIFT)
> +#define PMD_MASK (~(PMD_SIZE - 1))
> +
> +#define pgd_index(address) (((address) >> PGD_SHIFT) & (PTRS_PER_PGD - 1))
> #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD - 1))
> #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
> #define pte_index(address) (((address) >> PTE_SHIFT) & (PTRS_PER_PTE - 1))
> --
> 2.13.6
>
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 2/4] Makedumpfile: Add pgtable_l5_enabled to number_table
2018-03-02 5:48 ` [PATCH 2/4] Makedumpfile: Add pgtable_l5_enabled to number_table Baoquan He
@ 2018-05-07 7:20 ` Masaki Tachibana
2018-05-07 7:33 ` Dou Liyang
0 siblings, 1 reply; 16+ messages in thread
From: Masaki Tachibana @ 2018-05-07 7:20 UTC (permalink / raw)
To: Baoquan He; +Cc: douly.fnst, indou.takao, kexec, Keiichi Nakamura
Hi Baoquan,
Sorry for the late reply.
> + ENUM_NUMBER_INIT(N_ONLINE, "pgtable_l5_enabled");
Is this ENUM_NUMBER_INIT(pgtable_l5_enabled, "pgtable_l5_enabled"); ?
> + WRITE_NUMBER("N_ONLINE", pgtable_l5_enabled);
Is this WRITE_NUMBER("pgtable_l5_enabled", pgtable_l5_enabled); ?
If so, I will correct these.
Thanks
Tachibana
> -----Original Message-----
> From: kexec [mailto:kexec-bounces@lists.infradead.org] On Behalf Of Baoquan He
> Sent: Friday, March 02, 2018 2:49 PM
> To: kexec@lists.infradead.org
> Cc: douly.fnst@cn.fujitsu.com; indou.takao@jp.fujitsu.com; Hayashi Masahiko() <mas-hayashi@tg.jp.nec.com>;
> Baoquan He <bhe@redhat.com>; Tachibana Masaki() <mas-tachibana@vf.jp.nec.com>
> Subject: [PATCH 2/4] Makedumpfile: Add pgtable_l5_enabled to number_table
>
> This is in preparation for later 5-level supporting.
>
> Signed-off-by: Baoquan He <bhe@redhat.com>
> ---
> makedumpfile.c | 3 +++
> makedumpfile.h | 1 +
> 2 files changed, 4 insertions(+)
>
> diff --git a/makedumpfile.c b/makedumpfile.c
> index ed138d3..c1e893a 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -1723,6 +1723,7 @@ get_structure_info(void)
>
> ENUM_NUMBER_INIT(NR_FREE_PAGES, "NR_FREE_PAGES");
> ENUM_NUMBER_INIT(N_ONLINE, "N_ONLINE");
> + ENUM_NUMBER_INIT(N_ONLINE, "pgtable_l5_enabled");
>
> ENUM_NUMBER_INIT(PG_lru, "PG_lru");
> ENUM_NUMBER_INIT(PG_private, "PG_private");
> @@ -2251,6 +2252,7 @@ write_vmcoreinfo_data(void)
>
> WRITE_NUMBER("NR_FREE_PAGES", NR_FREE_PAGES);
> WRITE_NUMBER("N_ONLINE", N_ONLINE);
> + WRITE_NUMBER("N_ONLINE", pgtable_l5_enabled);
>
> WRITE_NUMBER("PG_lru", PG_lru);
> WRITE_NUMBER("PG_private", PG_private);
> @@ -2645,6 +2647,7 @@ read_vmcoreinfo(void)
>
> READ_NUMBER("NR_FREE_PAGES", NR_FREE_PAGES);
> READ_NUMBER("N_ONLINE", N_ONLINE);
> + READ_NUMBER("pgtable_l5_enabled", pgtable_l5_enabled);
>
> READ_NUMBER("PG_lru", PG_lru);
> READ_NUMBER("PG_private", PG_private);
> diff --git a/makedumpfile.h b/makedumpfile.h
> index 088dfc3..a0d1c13 100644
> --- a/makedumpfile.h
> +++ b/makedumpfile.h
> @@ -1856,6 +1856,7 @@ struct array_table {
> struct number_table {
> long NR_FREE_PAGES;
> long N_ONLINE;
> + long pgtable_l5_enabled;
>
> /*
> * Page flags
> --
> 2.13.6
>
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 3/4] Makedumpfile: Add a new function check_5level_paging()
2018-03-02 5:48 ` [PATCH 3/4] Makedumpfile: Add a new function check_5level_paging() Baoquan He
@ 2018-05-07 7:21 ` Masaki Tachibana
2018-05-07 8:03 ` Baoquan He
0 siblings, 1 reply; 16+ messages in thread
From: Masaki Tachibana @ 2018-05-07 7:21 UTC (permalink / raw)
To: Baoquan He; +Cc: douly.fnst, indou.takao, kexec, Keiichi Nakamura
Hi Baoquan,
Sorry for the late reply.
> +check_5level_paging(void)
> +{
> + if (NUMBER(pgtable_l5_enabled) != 0)
Is this if (NUMBER(pgtable_l5_enabled) != NOT_FOUND_NUMBER && NUMBER(pgtable_l5_enabled) != 0) ?
If so, I will correct this.
> + return TRUE;
Thanks
Tachibana
> -----Original Message-----
> From: kexec [mailto:kexec-bounces@lists.infradead.org] On Behalf Of Baoquan He
> Sent: Friday, March 02, 2018 2:49 PM
> To: kexec@lists.infradead.org
> Cc: douly.fnst@cn.fujitsu.com; indou.takao@jp.fujitsu.com; Hayashi Masahiko() <mas-hayashi@tg.jp.nec.com>;
> Baoquan He <bhe@redhat.com>; Tachibana Masaki() <mas-tachibana@vf.jp.nec.com>
> Subject: [PATCH 3/4] Makedumpfile: Add a new function check_5level_paging()
>
> Use it to check if the corrupted kernel is in 5-level paging.
>
> Signed-off-by: Baoquan He <bhe@redhat.com>
> ---
> arch/x86_64.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/arch/x86_64.c b/arch/x86_64.c
> index cbe45c2..e88ee0b 100644
> --- a/arch/x86_64.c
> +++ b/arch/x86_64.c
> @@ -33,6 +33,15 @@ get_xen_p2m_mfn(void)
> return NOT_FOUND_LONG_VALUE;
> }
>
> +static int
> +check_5level_paging(void)
> +{
> + if (NUMBER(pgtable_l5_enabled) != 0)
> + return TRUE;
> + else
> + return FALSE;
> +}
> +
> unsigned long
> get_kaslr_offset_x86_64(unsigned long vaddr)
> {
> --
> 2.13.6
>
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 4/4] arch/x86_64: Add 5-level paging support
2018-03-02 5:48 ` [PATCH 4/4] arch/x86_64: Add 5-level paging support Baoquan He
@ 2018-05-07 7:22 ` Masaki Tachibana
0 siblings, 0 replies; 16+ messages in thread
From: Masaki Tachibana @ 2018-05-07 7:22 UTC (permalink / raw)
To: Baoquan He; +Cc: douly.fnst, indou.takao, kexec, Keiichi Nakamura
Hi Baoquan,
Sorry for the late reply.
The patch looks good.
Thanks
Tachibana
> -----Original Message-----
> From: kexec [mailto:kexec-bounces@lists.infradead.org] On Behalf Of Baoquan He
> Sent: Friday, March 02, 2018 2:49 PM
> To: kexec@lists.infradead.org
> Cc: douly.fnst@cn.fujitsu.com; indou.takao@jp.fujitsu.com; Hayashi Masahiko() <mas-hayashi@tg.jp.nec.com>;
> Tachibana Masaki() <mas-tachibana@vf.jp.nec.com>
> Subject: [PATCH 4/4] arch/x86_64: Add 5-level paging support
>
> From: Dou Liyang <douly.fnst@cn.fujitsu.com>
>
> Now, kernel can use 5-level page tables in x86_64 system.
>
> Add the 5-level paging support for makedumpfile.
>
> Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com>
> ---
> arch/x86_64.c | 76 ++++++++++++++++++++++++++++++++++++++++++----------------
> makedumpfile.h | 17 +++++++++++++
> 2 files changed, 72 insertions(+), 21 deletions(-)
>
> diff --git a/arch/x86_64.c b/arch/x86_64.c
> index e88ee0b..b242f36 100644
> --- a/arch/x86_64.c
> +++ b/arch/x86_64.c
> @@ -112,6 +112,8 @@ get_page_offset_x86_64(void)
>
> if (info->kernel_version < KERNEL_VERSION(2, 6, 27)) {
> info->page_offset = __PAGE_OFFSET_ORIG;
> + } else if(check_5level_paging()) {
> + info->page_offset = __PAGE_OFFSET_5LEVEL;
> } else {
> info->page_offset = __PAGE_OFFSET_2_6_27;
> }
> @@ -243,6 +245,8 @@ get_versiondep_info_x86_64(void)
> info->max_physmem_bits = _MAX_PHYSMEM_BITS_ORIG;
> else if (info->kernel_version < KERNEL_VERSION(2, 6, 31))
> info->max_physmem_bits = _MAX_PHYSMEM_BITS_2_6_26;
> + else if(check_5level_paging())
> + info->max_physmem_bits = _MAX_PHYSMEM_BITS_5LEVEL;
> else
> info->max_physmem_bits = _MAX_PHYSMEM_BITS_2_6_31;
>
> @@ -252,6 +256,9 @@ get_versiondep_info_x86_64(void)
> if (info->kernel_version < KERNEL_VERSION(2, 6, 31)) {
> info->vmemmap_start = VMEMMAP_START_ORIG;
> info->vmemmap_end = VMEMMAP_END_ORIG;
> + } else if(check_5level_paging()) {
> + info->vmemmap_start = VMEMMAP_START_5LEVEL;
> + info->vmemmap_end = VMEMMAP_END_5LEVEL;
> } else {
> info->vmemmap_start = VMEMMAP_START_2_6_31;
> info->vmemmap_end = VMEMMAP_END_2_6_31;
> @@ -268,6 +275,7 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
> {
> unsigned long page_dir, pgd, pud_paddr, pud_pte, pmd_paddr, pmd_pte;
> unsigned long pte_paddr, pte;
> + unsigned long p4d_paddr, p4d_pte;
>
> /*
> * Get PGD.
> @@ -278,23 +286,56 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
> if (page_dir == NOT_PADDR)
> return NOT_PADDR;
> }
> - page_dir += pgd_index(vaddr) * sizeof(unsigned long);
> - if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) {
> - ERRMSG("Can't get pgd (page_dir:%lx).\n", page_dir);
> - return NOT_PADDR;
> - }
> - if (info->vaddr_for_vtop == vaddr)
> - MSG(" PGD : %16lx => %16lx\n", page_dir, pgd);
>
> - if (!(pgd & _PAGE_PRESENT)) {
> - ERRMSG("Can't get a valid pgd.\n");
> - return NOT_PADDR;
> + if (check_5level_paging()) {
> + page_dir += pgd5_index(vaddr) * sizeof(unsigned long);
> + if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) {
> + ERRMSG("Can't get pgd (page_dir:%lx).\n", page_dir);
> + return NOT_PADDR;
> + }
> + if (info->vaddr_for_vtop == vaddr)
> + MSG(" PGD : %16lx => %16lx\n", page_dir, pgd);
> +
> + if (!(pgd & _PAGE_PRESENT)) {
> + ERRMSG("Can't get a valid pgd.\n");
> + return NOT_PADDR;
> + }
> + /*
> + * Get P4D.
> + */
> + p4d_paddr = pgd & ENTRY_MASK;
> + p4d_paddr += p4d_index(vaddr) * sizeof(unsigned long);
> + if (!readmem(PADDR, p4d_paddr, &p4d_pte, sizeof p4d_pte)) {
> + ERRMSG("Can't get p4d_pte (p4d_paddr:%lx).\n", p4d_paddr);
> + return NOT_PADDR;
> + }
> + if (info->vaddr_for_vtop == vaddr)
> + MSG(" P4D : %16lx => %16lx\n", p4d_paddr, p4d_pte);
> +
> + if (!(p4d_pte & _PAGE_PRESENT)) {
> + ERRMSG("Can't get a valid p4d_pte.\n");
> + return NOT_PADDR;
> + }
> + pud_paddr = p4d_pte & ENTRY_MASK;
> + }else {
> + page_dir += pgd_index(vaddr) * sizeof(unsigned long);
> + if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) {
> + ERRMSG("Can't get pgd (page_dir:%lx).\n", page_dir);
> + return NOT_PADDR;
> + }
> + if (info->vaddr_for_vtop == vaddr)
> + MSG(" PGD : %16lx => %16lx\n", page_dir, pgd);
> +
> + if (!(pgd & _PAGE_PRESENT)) {
> + ERRMSG("Can't get a valid pgd.\n");
> + return NOT_PADDR;
> + }
> + pud_paddr = pgd & ENTRY_MASK;
> }
>
> /*
> * Get PUD.
> */
> - pud_paddr = pgd & ENTRY_MASK;
> pud_paddr += pud_index(vaddr) * sizeof(unsigned long);
> if (!readmem(PADDR, pud_paddr, &pud_pte, sizeof pud_pte)) {
> ERRMSG("Can't get pud_pte (pud_paddr:%lx).\n", pud_paddr);
> @@ -361,12 +402,7 @@ vtop4_x86_64(unsigned long vaddr)
> else if (SYMBOL(init_top_pgt) != NOT_FOUND_SYMBOL)
> init_level4_pgt = SYMBOL(init_top_pgt);
> else {
> - ERRMSG("Can't get the symbol of init_level4_pgt.\n");
> - return NOT_PADDR;
> - }
> -
> - if (SYMBOL(level4_kernel_pgt) != NOT_FOUND_SYMBOL) {
> - ERRMSG("Kernel is built with 5-level page tables\n");
> + ERRMSG("Can't get the symbol of init_level4_pgt/init_top_pgt.\n");
> return NOT_PADDR;
> }
>
> @@ -605,10 +641,6 @@ find_vmemmap_x86_64()
> return FAILED;
> }
>
> - if (SYMBOL(level4_kernel_pgt) != NOT_FOUND_SYMBOL) {
> - ERRMSG("kernel is configured for 5-level page tables\n");
> - return FAILED;
> - }
> pagestructsize = size_table.page;
> hugepagesize = PTRS_PER_PMD * info->page_size;
> vaddr_base = info->vmemmap_start;
> @@ -630,12 +662,14 @@ find_vmemmap_x86_64()
> /* outer loop is for pud entries in the pgd */
> for (pgdindex = 0, pgdp = (unsigned long *)pgd_addr; pgdindex < num_puds;
> pgdindex++, pgdp++) {
> +
> /* read the pgd one word at a time, into pud_addr */
> if (!readmem(PADDR, (unsigned long long)pgdp, (void *)&pud_addr,
> sizeof(unsigned long))) {
> ERRMSG("Can't get pgd entry for slot %d.\n", pgd_index);
> return FAILED;
> }
> +
> /* mask the pgd entry for the address of the pud page */
> pud_addr &= PMASK;
> if (pud_addr == 0)
> diff --git a/makedumpfile.h b/makedumpfile.h
> index a0d1c13..d26c30b 100644
> --- a/makedumpfile.h
> +++ b/makedumpfile.h
> @@ -581,16 +581,21 @@ unsigned long get_kvbase_arm64(void);
> #ifdef __x86_64__
> #define __PAGE_OFFSET_ORIG (0xffff810000000000) /* 2.6.26, or former */
> #define __PAGE_OFFSET_2_6_27 (0xffff880000000000) /* 2.6.27, or later */
> +#define __PAGE_OFFSET_5LEVEL (0xff10000000000000) /* 5-level page table */
>
> #define VMALLOC_START_ORIG (0xffffc20000000000) /* 2.6.30, or former */
> #define VMALLOC_START_2_6_31 (0xffffc90000000000) /* 2.6.31, or later */
> +#define VMALLOC_START_5LEVEL (0xffa0000000000000) /* 5-level page table */
> #define VMALLOC_END_ORIG (0xffffe1ffffffffff) /* 2.6.30, or former */
> #define VMALLOC_END_2_6_31 (0xffffe8ffffffffff) /* 2.6.31, or later */
> +#define VMALLOC_END_5LEVEL (0xffd1ffffffffffff) /* 5-level page table */
>
> #define VMEMMAP_START_ORIG (0xffffe20000000000) /* 2.6.30, or former */
> #define VMEMMAP_START_2_6_31 (0xffffea0000000000) /* 2.6.31, or later */
> +#define VMEMMAP_START_5LEVEL (0xffd4000000000000) /* 5-level page table */
> #define VMEMMAP_END_ORIG (0xffffe2ffffffffff) /* 2.6.30, or former */
> #define VMEMMAP_END_2_6_31 (0xffffeaffffffffff) /* 2.6.31, or later */
> +#define VMEMMAP_END_5LEVEL (0xffd5ffffffffffff) /* 5-level page table */
>
> #define __START_KERNEL_map (0xffffffff80000000)
> #define KVBASE PAGE_OFFSET
> @@ -598,6 +603,7 @@ unsigned long get_kvbase_arm64(void);
> #define _MAX_PHYSMEM_BITS_ORIG (40)
> #define _MAX_PHYSMEM_BITS_2_6_26 (44)
> #define _MAX_PHYSMEM_BITS_2_6_31 (46)
> +#define _MAX_PHYSMEM_BITS_5LEVEL (52)
>
> /*
> * 4 Levels paging
> @@ -617,7 +623,18 @@ unsigned long get_kvbase_arm64(void);
> #define PMD_SIZE (1UL << PMD_SHIFT)
> #define PMD_MASK (~(PMD_SIZE - 1))
>
> +/*
> + * 5 Levels paging
> + */
> +#define PGD_SHIFT_5LEVEL (48)
> +#define P4D_SHIFT (39)
> +
> +#define PTRS_PER_PGD_5LEVEL (512)
> +#define PTRS_PER_P4D (512)
> +
> +#define pgd5_index(address) (((address) >> PGD_SHIFT_5LEVEL) & (PTRS_PER_PGD_5LEVEL - 1))
> #define pgd_index(address) (((address) >> PGD_SHIFT) & (PTRS_PER_PGD - 1))
> +#define p4d_index(address) (((address) >> P4D_SHIFT) & (PTRS_PER_P4D - 1))
> #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD - 1))
> #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
> #define pte_index(address) (((address) >> PTE_SHIFT) & (PTRS_PER_PTE - 1))
> --
> 2.13.6
>
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables
2018-05-07 7:19 ` Masaki Tachibana
@ 2018-05-07 7:30 ` Dou Liyang
2018-05-07 7:31 ` Baoquan He
1 sibling, 0 replies; 16+ messages in thread
From: Dou Liyang @ 2018-05-07 7:30 UTC (permalink / raw)
To: Masaki Tachibana, Baoquan He; +Cc: kexec, indou.takao, Keiichi Nakamura
Hi Masaki-san,
At 05/07/2018 03:19 PM, Masaki Tachibana wrote:
> Hi Baoquan,
>
> Sorry for the late reply.
>
>
>> +#define PUD_SIZE (1UL << PUD_SHIFT)
>> +#define PUD_MASK (~(PUD_SHIFT - 1))
> Is this (~(PUD_SIZE - 1)) ?
> If so, I will correct this.
>
Oops! my mistake, go ahead!
Thanks,
dou
>> +#define PMD_SIZE (1UL << PMD_SHIFT)
>> +#define PMD_MASK (~(PMD_SIZE - 1))
>
>
> Thanks
> Tachibana
>
>
>> -----Original Message-----
>> From: kexec [mailto:kexec-bounces@lists.infradead.org] On Behalf Of Baoquan He
>> Sent: Friday, March 02, 2018 2:49 PM
>> To: kexec@lists.infradead.org
>> Cc: douly.fnst@cn.fujitsu.com; indou.takao@jp.fujitsu.com; Hayashi Masahiko() <mas-hayashi@tg.jp.nec.com>;
>> Tachibana Masaki() <mas-tachibana@vf.jp.nec.com>
>> Subject: [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables
>>
>> From: Dou Liyang <douly.fnst@cn.fujitsu.com>
>>
>> Due to the changing of 4-level page tables implementation in kernel, makedumpfile
>> left behind some of the redundant macros. this make the translation not clear and
>> hard to expand the code to support 5-level page tables.
>>
>> Remove the PML4* and PGDIR_* and unify the macro to get the index of PGD.
>>
>> Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com>
>> ---
>> arch/x86_64.c | 59 +++++++++++++++++++++++++++++++++++-----------------------
>> makedumpfile.h | 21 +++++++++------------
>> 2 files changed, 45 insertions(+), 35 deletions(-)
>>
>> diff --git a/arch/x86_64.c b/arch/x86_64.c
>> index 1f24415..cbe45c2 100644
>> --- a/arch/x86_64.c
>> +++ b/arch/x86_64.c
>> @@ -257,7 +257,7 @@ get_versiondep_info_x86_64(void)
>> unsigned long long
>> __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
>> {
>> - unsigned long page_dir, pml4, pgd_paddr, pgd_pte, pmd_paddr, pmd_pte;
>> + unsigned long page_dir, pgd, pud_paddr, pud_pte, pmd_paddr, pmd_pte;
>> unsigned long pte_paddr, pte;
>>
>> /*
>> @@ -269,43 +269,43 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
>> if (page_dir == NOT_PADDR)
>> return NOT_PADDR;
>> }
>> - page_dir += pml4_index(vaddr) * sizeof(unsigned long);
>> - if (!readmem(PADDR, page_dir, &pml4, sizeof pml4)) {
>> - ERRMSG("Can't get pml4 (page_dir:%lx).\n", page_dir);
>> + page_dir += pgd_index(vaddr) * sizeof(unsigned long);
>> + if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) {
>> + ERRMSG("Can't get pgd (page_dir:%lx).\n", page_dir);
>> return NOT_PADDR;
>> }
>> if (info->vaddr_for_vtop == vaddr)
>> - MSG(" PGD : %16lx => %16lx\n", page_dir, pml4);
>> + MSG(" PGD : %16lx => %16lx\n", page_dir, pgd);
>>
>> - if (!(pml4 & _PAGE_PRESENT)) {
>> - ERRMSG("Can't get a valid pml4.\n");
>> + if (!(pgd & _PAGE_PRESENT)) {
>> + ERRMSG("Can't get a valid pgd.\n");
>> return NOT_PADDR;
>> }
>>
>> /*
>> * Get PUD.
>> */
>> - pgd_paddr = pml4 & ENTRY_MASK;
>> - pgd_paddr += pgd_index(vaddr) * sizeof(unsigned long);
>> - if (!readmem(PADDR, pgd_paddr, &pgd_pte, sizeof pgd_pte)) {
>> - ERRMSG("Can't get pgd_pte (pgd_paddr:%lx).\n", pgd_paddr);
>> + pud_paddr = pgd & ENTRY_MASK;
>> + pud_paddr += pud_index(vaddr) * sizeof(unsigned long);
>> + if (!readmem(PADDR, pud_paddr, &pud_pte, sizeof pud_pte)) {
>> + ERRMSG("Can't get pud_pte (pud_paddr:%lx).\n", pud_paddr);
>> return NOT_PADDR;
>> }
>> if (info->vaddr_for_vtop == vaddr)
>> - MSG(" PUD : %16lx => %16lx\n", pgd_paddr, pgd_pte);
>> + MSG(" PUD : %16lx => %16lx\n", pud_paddr, pud_pte);
>>
>> - if (!(pgd_pte & _PAGE_PRESENT)) {
>> - ERRMSG("Can't get a valid pgd_pte.\n");
>> + if (!(pud_pte & _PAGE_PRESENT)) {
>> + ERRMSG("Can't get a valid pud_pte.\n");
>> return NOT_PADDR;
>> }
>> - if (pgd_pte & _PAGE_PSE) /* 1GB pages */
>> - return (pgd_pte & ENTRY_MASK & PGDIR_MASK) +
>> - (vaddr & ~PGDIR_MASK);
>> + if (pud_pte & _PAGE_PSE) /* 1GB pages */
>> + return (pud_pte & ENTRY_MASK & PUD_MASK) +
>> + (vaddr & ~PUD_MASK);
>>
>> /*
>> * Get PMD.
>> */
>> - pmd_paddr = pgd_pte & ENTRY_MASK;
>> + pmd_paddr = pud_pte & ENTRY_MASK;
>> pmd_paddr += pmd_index(vaddr) * sizeof(unsigned long);
>> if (!readmem(PADDR, pmd_paddr, &pmd_pte, sizeof pmd_pte)) {
>> ERRMSG("Can't get pmd_pte (pmd_paddr:%lx).\n", pmd_paddr);
>> @@ -391,15 +391,22 @@ kvtop_xen_x86_64(unsigned long kvaddr)
>>
>> if ((dirp = kvtop_xen_x86_64(SYMBOL(pgd_l4))) == NOT_PADDR)
>> return NOT_PADDR;
>> - dirp += pml4_index(kvaddr) * sizeof(unsigned long long);
>> +
>> + /*
>> + * Get PGD.
>> + */
>> + dirp += pgd_index(kvaddr) * sizeof(unsigned long long);
>> if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
>> return NOT_PADDR;
>>
>> if (!(entry & _PAGE_PRESENT))
>> return NOT_PADDR;
>>
>> + /*
>> + * Get PUD.
>> + */
>> dirp = entry & ENTRY_MASK;
>> - dirp += pgd_index(kvaddr) * sizeof(unsigned long long);
>> + dirp += pud_index(kvaddr) * sizeof(unsigned long long);
>> if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
>> return NOT_PADDR;
>>
>> @@ -407,9 +414,12 @@ kvtop_xen_x86_64(unsigned long kvaddr)
>> return NOT_PADDR;
>>
>> if (entry & _PAGE_PSE) /* 1GB pages */
>> - return (entry & ENTRY_MASK & PGDIR_MASK) +
>> - (kvaddr & ~PGDIR_MASK);
>> + return (entry & ENTRY_MASK & PUD_MASK) +
>> + (kvaddr & ~PUD_MASK);
>>
>> + /*
>> + * Get PMD.
>> + */
>> dirp = entry & ENTRY_MASK;
>> dirp += pmd_index(kvaddr) * sizeof(unsigned long long);
>> if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
>> @@ -422,6 +432,9 @@ kvtop_xen_x86_64(unsigned long kvaddr)
>> return (entry & ENTRY_MASK & PMD_MASK) +
>> (kvaddr & ~PMD_MASK);
>>
>> + /*
>> + * Get PTE.
>> + */
>> dirp = entry & ENTRY_MASK;
>> dirp += pte_index(kvaddr) * sizeof(unsigned long long);
>> if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
>> @@ -596,7 +609,7 @@ find_vmemmap_x86_64()
>> * for max_paddr >> 12 page structures
>> */
>> high_pfn = max_paddr >> 12;
>> - pgd_index = pgd4_index(vaddr_base);
>> + pgd_index = pgd_index(vaddr_base);
>> pgd_addr = vaddr_to_paddr(init_level4_pgt); /* address of pgd */
>> pgd_addr += pgd_index * sizeof(unsigned long);
>> page_structs_per_pud = (PTRS_PER_PUD * PTRS_PER_PMD * info->page_size) /
>> diff --git a/makedumpfile.h b/makedumpfile.h
>> index 01eece2..088dfc3 100644
>> --- a/makedumpfile.h
>> +++ b/makedumpfile.h
>> @@ -602,25 +602,22 @@ unsigned long get_kvbase_arm64(void);
>> /*
>> * 4 Levels paging
>> */
>> -#define PML4_SHIFT (39)
>> -#define PTRS_PER_PML4 (512)
>> -#define PGDIR_SHIFT (30)
>> -#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
>> -#define PGDIR_MASK (~(PGDIR_SIZE - 1))
>> -#define PTRS_PER_PGD (512)
>> #define PGD_SHIFT (39)
>> #define PUD_SHIFT (30)
>> #define PMD_SHIFT (21)
>> -#define PMD_SIZE (1UL << PMD_SHIFT)
>> -#define PMD_MASK (~(PMD_SIZE - 1))
>> +#define PTE_SHIFT (12)
>> +
>> +#define PTRS_PER_PGD (512)
>> #define PTRS_PER_PUD (512)
>> #define PTRS_PER_PMD (512)
>> #define PTRS_PER_PTE (512)
>> -#define PTE_SHIFT (12)
>>
>> -#define pml4_index(address) (((address) >> PML4_SHIFT) & (PTRS_PER_PML4 - 1))
>> -#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1))
>> -#define pgd4_index(address) (((address) >> PGD_SHIFT) & (PTRS_PER_PGD - 1))
>> +#define PUD_SIZE (1UL << PUD_SHIFT)
>> +#define PUD_MASK (~(PUD_SHIFT - 1))
>> +#define PMD_SIZE (1UL << PMD_SHIFT)
>> +#define PMD_MASK (~(PMD_SIZE - 1))
>> +
>> +#define pgd_index(address) (((address) >> PGD_SHIFT) & (PTRS_PER_PGD - 1))
>> #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD - 1))
>> #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
>> #define pte_index(address) (((address) >> PTE_SHIFT) & (PTRS_PER_PTE - 1))
>> --
>> 2.13.6
>>
>>
>> _______________________________________________
>> kexec mailing list
>> kexec@lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/kexec
>
>
>
>
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables
2018-05-07 7:19 ` Masaki Tachibana
2018-05-07 7:30 ` Dou Liyang
@ 2018-05-07 7:31 ` Baoquan He
1 sibling, 0 replies; 16+ messages in thread
From: Baoquan He @ 2018-05-07 7:31 UTC (permalink / raw)
To: douly.fnst, Masaki Tachibana; +Cc: kexec, indou.takao, Keiichi Nakamura
On 05/07/18 at 07:19am, Masaki Tachibana wrote:
> Hi Baoquan,
>
> Sorry for the late reply.
>
>
> > +#define PUD_SIZE (1UL << PUD_SHIFT)
> > +#define PUD_MASK (~(PUD_SHIFT - 1))
> Is this (~(PUD_SIZE - 1)) ?
> If so, I will correct this.
This patch is from Dou, while I think you are right. Please help change
it directly.
>
> > +#define PMD_SIZE (1UL << PMD_SHIFT)
> > +#define PMD_MASK (~(PMD_SIZE - 1))
>
>
> Thanks
> Tachibana
>
>
> > -----Original Message-----
> > From: kexec [mailto:kexec-bounces@lists.infradead.org] On Behalf Of Baoquan He
> > Sent: Friday, March 02, 2018 2:49 PM
> > To: kexec@lists.infradead.org
> > Cc: douly.fnst@cn.fujitsu.com; indou.takao@jp.fujitsu.com; Hayashi Masahiko() <mas-hayashi@tg.jp.nec.com>;
> > Tachibana Masaki() <mas-tachibana@vf.jp.nec.com>
> > Subject: [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables
> >
> > From: Dou Liyang <douly.fnst@cn.fujitsu.com>
> >
> > Due to the changing of 4-level page tables implementation in kernel, makedumpfile
> > left behind some of the redundant macros. this make the translation not clear and
> > hard to expand the code to support 5-level page tables.
> >
> > Remove the PML4* and PGDIR_* and unify the macro to get the index of PGD.
> >
> > Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com>
> > ---
> > arch/x86_64.c | 59 +++++++++++++++++++++++++++++++++++-----------------------
> > makedumpfile.h | 21 +++++++++------------
> > 2 files changed, 45 insertions(+), 35 deletions(-)
> >
> > diff --git a/arch/x86_64.c b/arch/x86_64.c
> > index 1f24415..cbe45c2 100644
> > --- a/arch/x86_64.c
> > +++ b/arch/x86_64.c
> > @@ -257,7 +257,7 @@ get_versiondep_info_x86_64(void)
> > unsigned long long
> > __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
> > {
> > - unsigned long page_dir, pml4, pgd_paddr, pgd_pte, pmd_paddr, pmd_pte;
> > + unsigned long page_dir, pgd, pud_paddr, pud_pte, pmd_paddr, pmd_pte;
> > unsigned long pte_paddr, pte;
> >
> > /*
> > @@ -269,43 +269,43 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
> > if (page_dir == NOT_PADDR)
> > return NOT_PADDR;
> > }
> > - page_dir += pml4_index(vaddr) * sizeof(unsigned long);
> > - if (!readmem(PADDR, page_dir, &pml4, sizeof pml4)) {
> > - ERRMSG("Can't get pml4 (page_dir:%lx).\n", page_dir);
> > + page_dir += pgd_index(vaddr) * sizeof(unsigned long);
> > + if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) {
> > + ERRMSG("Can't get pgd (page_dir:%lx).\n", page_dir);
> > return NOT_PADDR;
> > }
> > if (info->vaddr_for_vtop == vaddr)
> > - MSG(" PGD : %16lx => %16lx\n", page_dir, pml4);
> > + MSG(" PGD : %16lx => %16lx\n", page_dir, pgd);
> >
> > - if (!(pml4 & _PAGE_PRESENT)) {
> > - ERRMSG("Can't get a valid pml4.\n");
> > + if (!(pgd & _PAGE_PRESENT)) {
> > + ERRMSG("Can't get a valid pgd.\n");
> > return NOT_PADDR;
> > }
> >
> > /*
> > * Get PUD.
> > */
> > - pgd_paddr = pml4 & ENTRY_MASK;
> > - pgd_paddr += pgd_index(vaddr) * sizeof(unsigned long);
> > - if (!readmem(PADDR, pgd_paddr, &pgd_pte, sizeof pgd_pte)) {
> > - ERRMSG("Can't get pgd_pte (pgd_paddr:%lx).\n", pgd_paddr);
> > + pud_paddr = pgd & ENTRY_MASK;
> > + pud_paddr += pud_index(vaddr) * sizeof(unsigned long);
> > + if (!readmem(PADDR, pud_paddr, &pud_pte, sizeof pud_pte)) {
> > + ERRMSG("Can't get pud_pte (pud_paddr:%lx).\n", pud_paddr);
> > return NOT_PADDR;
> > }
> > if (info->vaddr_for_vtop == vaddr)
> > - MSG(" PUD : %16lx => %16lx\n", pgd_paddr, pgd_pte);
> > + MSG(" PUD : %16lx => %16lx\n", pud_paddr, pud_pte);
> >
> > - if (!(pgd_pte & _PAGE_PRESENT)) {
> > - ERRMSG("Can't get a valid pgd_pte.\n");
> > + if (!(pud_pte & _PAGE_PRESENT)) {
> > + ERRMSG("Can't get a valid pud_pte.\n");
> > return NOT_PADDR;
> > }
> > - if (pgd_pte & _PAGE_PSE) /* 1GB pages */
> > - return (pgd_pte & ENTRY_MASK & PGDIR_MASK) +
> > - (vaddr & ~PGDIR_MASK);
> > + if (pud_pte & _PAGE_PSE) /* 1GB pages */
> > + return (pud_pte & ENTRY_MASK & PUD_MASK) +
> > + (vaddr & ~PUD_MASK);
> >
> > /*
> > * Get PMD.
> > */
> > - pmd_paddr = pgd_pte & ENTRY_MASK;
> > + pmd_paddr = pud_pte & ENTRY_MASK;
> > pmd_paddr += pmd_index(vaddr) * sizeof(unsigned long);
> > if (!readmem(PADDR, pmd_paddr, &pmd_pte, sizeof pmd_pte)) {
> > ERRMSG("Can't get pmd_pte (pmd_paddr:%lx).\n", pmd_paddr);
> > @@ -391,15 +391,22 @@ kvtop_xen_x86_64(unsigned long kvaddr)
> >
> > if ((dirp = kvtop_xen_x86_64(SYMBOL(pgd_l4))) == NOT_PADDR)
> > return NOT_PADDR;
> > - dirp += pml4_index(kvaddr) * sizeof(unsigned long long);
> > +
> > + /*
> > + * Get PGD.
> > + */
> > + dirp += pgd_index(kvaddr) * sizeof(unsigned long long);
> > if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
> > return NOT_PADDR;
> >
> > if (!(entry & _PAGE_PRESENT))
> > return NOT_PADDR;
> >
> > + /*
> > + * Get PUD.
> > + */
> > dirp = entry & ENTRY_MASK;
> > - dirp += pgd_index(kvaddr) * sizeof(unsigned long long);
> > + dirp += pud_index(kvaddr) * sizeof(unsigned long long);
> > if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
> > return NOT_PADDR;
> >
> > @@ -407,9 +414,12 @@ kvtop_xen_x86_64(unsigned long kvaddr)
> > return NOT_PADDR;
> >
> > if (entry & _PAGE_PSE) /* 1GB pages */
> > - return (entry & ENTRY_MASK & PGDIR_MASK) +
> > - (kvaddr & ~PGDIR_MASK);
> > + return (entry & ENTRY_MASK & PUD_MASK) +
> > + (kvaddr & ~PUD_MASK);
> >
> > + /*
> > + * Get PMD.
> > + */
> > dirp = entry & ENTRY_MASK;
> > dirp += pmd_index(kvaddr) * sizeof(unsigned long long);
> > if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
> > @@ -422,6 +432,9 @@ kvtop_xen_x86_64(unsigned long kvaddr)
> > return (entry & ENTRY_MASK & PMD_MASK) +
> > (kvaddr & ~PMD_MASK);
> >
> > + /*
> > + * Get PTE.
> > + */
> > dirp = entry & ENTRY_MASK;
> > dirp += pte_index(kvaddr) * sizeof(unsigned long long);
> > if (!readmem(PADDR, dirp, &entry, sizeof(entry)))
> > @@ -596,7 +609,7 @@ find_vmemmap_x86_64()
> > * for max_paddr >> 12 page structures
> > */
> > high_pfn = max_paddr >> 12;
> > - pgd_index = pgd4_index(vaddr_base);
> > + pgd_index = pgd_index(vaddr_base);
> > pgd_addr = vaddr_to_paddr(init_level4_pgt); /* address of pgd */
> > pgd_addr += pgd_index * sizeof(unsigned long);
> > page_structs_per_pud = (PTRS_PER_PUD * PTRS_PER_PMD * info->page_size) /
> > diff --git a/makedumpfile.h b/makedumpfile.h
> > index 01eece2..088dfc3 100644
> > --- a/makedumpfile.h
> > +++ b/makedumpfile.h
> > @@ -602,25 +602,22 @@ unsigned long get_kvbase_arm64(void);
> > /*
> > * 4 Levels paging
> > */
> > -#define PML4_SHIFT (39)
> > -#define PTRS_PER_PML4 (512)
> > -#define PGDIR_SHIFT (30)
> > -#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
> > -#define PGDIR_MASK (~(PGDIR_SIZE - 1))
> > -#define PTRS_PER_PGD (512)
> > #define PGD_SHIFT (39)
> > #define PUD_SHIFT (30)
> > #define PMD_SHIFT (21)
> > -#define PMD_SIZE (1UL << PMD_SHIFT)
> > -#define PMD_MASK (~(PMD_SIZE - 1))
> > +#define PTE_SHIFT (12)
> > +
> > +#define PTRS_PER_PGD (512)
> > #define PTRS_PER_PUD (512)
> > #define PTRS_PER_PMD (512)
> > #define PTRS_PER_PTE (512)
> > -#define PTE_SHIFT (12)
> >
> > -#define pml4_index(address) (((address) >> PML4_SHIFT) & (PTRS_PER_PML4 - 1))
> > -#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1))
> > -#define pgd4_index(address) (((address) >> PGD_SHIFT) & (PTRS_PER_PGD - 1))
> > +#define PUD_SIZE (1UL << PUD_SHIFT)
> > +#define PUD_MASK (~(PUD_SHIFT - 1))
> > +#define PMD_SIZE (1UL << PMD_SHIFT)
> > +#define PMD_MASK (~(PMD_SIZE - 1))
> > +
> > +#define pgd_index(address) (((address) >> PGD_SHIFT) & (PTRS_PER_PGD - 1))
> > #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD - 1))
> > #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
> > #define pte_index(address) (((address) >> PTE_SHIFT) & (PTRS_PER_PTE - 1))
> > --
> > 2.13.6
> >
> >
> > _______________________________________________
> > kexec mailing list
> > kexec@lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/kexec
>
>
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/4] Makedumpfile: Add pgtable_l5_enabled to number_table
2018-05-07 7:20 ` Masaki Tachibana
@ 2018-05-07 7:33 ` Dou Liyang
0 siblings, 0 replies; 16+ messages in thread
From: Dou Liyang @ 2018-05-07 7:33 UTC (permalink / raw)
To: Masaki Tachibana, Baoquan He; +Cc: kexec, indou.takao, Keiichi Nakamura
Hi Tachibana,
At 05/07/2018 03:20 PM, Masaki Tachibana wrote:
> Hi Baoquan,
>
> Sorry for the late reply.
>
>> + ENUM_NUMBER_INIT(N_ONLINE, "pgtable_l5_enabled");
> Is this ENUM_NUMBER_INIT(pgtable_l5_enabled, "pgtable_l5_enabled"); ?
>
>> + WRITE_NUMBER("N_ONLINE", pgtable_l5_enabled);
> Is this WRITE_NUMBER("pgtable_l5_enabled", pgtable_l5_enabled); ?
>
> If so, I will correct these.
>
Yes, I agree with you.
Thanks,
dou.
> Thanks
> Tachibana
>
>
>> -----Original Message-----
>> From: kexec [mailto:kexec-bounces@lists.infradead.org] On Behalf Of Baoquan He
>> Sent: Friday, March 02, 2018 2:49 PM
>> To: kexec@lists.infradead.org
>> Cc: douly.fnst@cn.fujitsu.com; indou.takao@jp.fujitsu.com; Hayashi Masahiko() <mas-hayashi@tg.jp.nec.com>;
>> Baoquan He <bhe@redhat.com>; Tachibana Masaki() <mas-tachibana@vf.jp.nec.com>
>> Subject: [PATCH 2/4] Makedumpfile: Add pgtable_l5_enabled to number_table
>>
>> This is in preparation for later 5-level supporting.
>>
>> Signed-off-by: Baoquan He <bhe@redhat.com>
>> ---
>> makedumpfile.c | 3 +++
>> makedumpfile.h | 1 +
>> 2 files changed, 4 insertions(+)
>>
>> diff --git a/makedumpfile.c b/makedumpfile.c
>> index ed138d3..c1e893a 100644
>> --- a/makedumpfile.c
>> +++ b/makedumpfile.c
>> @@ -1723,6 +1723,7 @@ get_structure_info(void)
>>
>> ENUM_NUMBER_INIT(NR_FREE_PAGES, "NR_FREE_PAGES");
>> ENUM_NUMBER_INIT(N_ONLINE, "N_ONLINE");
>> + ENUM_NUMBER_INIT(N_ONLINE, "pgtable_l5_enabled");
>>
>> ENUM_NUMBER_INIT(PG_lru, "PG_lru");
>> ENUM_NUMBER_INIT(PG_private, "PG_private");
>> @@ -2251,6 +2252,7 @@ write_vmcoreinfo_data(void)
>>
>> WRITE_NUMBER("NR_FREE_PAGES", NR_FREE_PAGES);
>> WRITE_NUMBER("N_ONLINE", N_ONLINE);
>> + WRITE_NUMBER("N_ONLINE", pgtable_l5_enabled);
>>
>> WRITE_NUMBER("PG_lru", PG_lru);
>> WRITE_NUMBER("PG_private", PG_private);
>> @@ -2645,6 +2647,7 @@ read_vmcoreinfo(void)
>>
>> READ_NUMBER("NR_FREE_PAGES", NR_FREE_PAGES);
>> READ_NUMBER("N_ONLINE", N_ONLINE);
>> + READ_NUMBER("pgtable_l5_enabled", pgtable_l5_enabled);
>>
>> READ_NUMBER("PG_lru", PG_lru);
>> READ_NUMBER("PG_private", PG_private);
>> diff --git a/makedumpfile.h b/makedumpfile.h
>> index 088dfc3..a0d1c13 100644
>> --- a/makedumpfile.h
>> +++ b/makedumpfile.h
>> @@ -1856,6 +1856,7 @@ struct array_table {
>> struct number_table {
>> long NR_FREE_PAGES;
>> long N_ONLINE;
>> + long pgtable_l5_enabled;
>>
>> /*
>> * Page flags
>> --
>> 2.13.6
>>
>>
>> _______________________________________________
>> kexec mailing list
>> kexec@lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/kexec
>
>
>
>
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 3/4] Makedumpfile: Add a new function check_5level_paging()
2018-05-07 7:21 ` Masaki Tachibana
@ 2018-05-07 8:03 ` Baoquan He
0 siblings, 0 replies; 16+ messages in thread
From: Baoquan He @ 2018-05-07 8:03 UTC (permalink / raw)
To: Masaki Tachibana; +Cc: douly.fnst, indou.takao, kexec, Keiichi Nakamura
On 05/07/18 at 07:21am, Masaki Tachibana wrote:
> Hi Baoquan,
>
> Sorry for the late reply.
>
> > +check_5level_paging(void)
> > +{
> > + if (NUMBER(pgtable_l5_enabled) != 0)
> Is this if (NUMBER(pgtable_l5_enabled) != NOT_FOUND_NUMBER && NUMBER(pgtable_l5_enabled) != 0) ?
> If so, I will correct this.
Yes, you are right. For kernel which includes 5-level code, it export
pgtable_l5_enabled as 0 or 1, however for kernel w/o 5-level code,
should be NOT_FOUND_NUMBER. Please help correct it.
Thanks
Baoquan
>
> > -----Original Message-----
> > From: kexec [mailto:kexec-bounces@lists.infradead.org] On Behalf Of Baoquan He
> > Sent: Friday, March 02, 2018 2:49 PM
> > To: kexec@lists.infradead.org
> > Cc: douly.fnst@cn.fujitsu.com; indou.takao@jp.fujitsu.com; Hayashi Masahiko() <mas-hayashi@tg.jp.nec.com>;
> > Baoquan He <bhe@redhat.com>; Tachibana Masaki() <mas-tachibana@vf.jp.nec.com>
> > Subject: [PATCH 3/4] Makedumpfile: Add a new function check_5level_paging()
> >
> > Use it to check if the corrupted kernel is in 5-level paging.
> >
> > Signed-off-by: Baoquan He <bhe@redhat.com>
> > ---
> > arch/x86_64.c | 9 +++++++++
> > 1 file changed, 9 insertions(+)
> >
> > diff --git a/arch/x86_64.c b/arch/x86_64.c
> > index cbe45c2..e88ee0b 100644
> > --- a/arch/x86_64.c
> > +++ b/arch/x86_64.c
> > @@ -33,6 +33,15 @@ get_xen_p2m_mfn(void)
> > return NOT_FOUND_LONG_VALUE;
> > }
> >
> > +static int
> > +check_5level_paging(void)
> > +{
> > + if (NUMBER(pgtable_l5_enabled) != 0)
> > + return TRUE;
> > + else
> > + return FALSE;
> > +}
> > +
> > unsigned long
> > get_kaslr_offset_x86_64(unsigned long vaddr)
> > {
> > --
> > 2.13.6
> >
> >
> > _______________________________________________
> > kexec mailing list
> > kexec@lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/kexec
>
>
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2018-05-07 8:04 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-02 5:48 [PATCH 0/4] Makedumpfile: Add 5-level paging support Baoquan He
2018-03-02 5:48 ` [PATCH 1/4] arch/x86_64: Cleanup the address translation of the 4-level page tables Baoquan He
2018-05-07 7:19 ` Masaki Tachibana
2018-05-07 7:30 ` Dou Liyang
2018-05-07 7:31 ` Baoquan He
2018-03-02 5:48 ` [PATCH 2/4] Makedumpfile: Add pgtable_l5_enabled to number_table Baoquan He
2018-05-07 7:20 ` Masaki Tachibana
2018-05-07 7:33 ` Dou Liyang
2018-03-02 5:48 ` [PATCH 3/4] Makedumpfile: Add a new function check_5level_paging() Baoquan He
2018-05-07 7:21 ` Masaki Tachibana
2018-05-07 8:03 ` Baoquan He
2018-03-02 5:48 ` [PATCH 4/4] arch/x86_64: Add 5-level paging support Baoquan He
2018-05-07 7:22 ` Masaki Tachibana
2018-04-12 2:45 ` [PATCH 0/4] Makedumpfile: " Baoquan He
2018-04-12 4:42 ` Masaki Tachibana
2018-04-12 4:55 ` Baoquan He
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.