Blame SOURCES/kexec-tools-2.0.15-makedumpfile-sadump-Fix-a-problem-of-PTI-enabled-kernel.patch

1d9674
From: Takao Indoh <indou.takao@jp.fujitsu.com>
1d9674
To: ats-kumagai@wm.jp.nec.com, d.hatayama@jp.fujitsu.com
1d9674
Subject: [makedumpfile PATCH] sadump: Fix a problem of PTI enabled kernel
1d9674
Date: Fri, 26 Jan 2018 09:22:26 +0900
1d9674
Cc: kexec@lists.infradead.org
1d9674
MIME-Version: 1.0
1d9674
Content-Transfer-Encoding: 8bit
1d9674
Content-Type: text/plain; charset=utf-8
1d9674
1d9674
This patch fixes a problme that a dumpfile of sadump cannot be handled by
1d9674
makedumpfile when Page Table Isolation(PTI) is enabled.
1d9674
1d9674
When PTI is enabled, bit 12 of CR3 register is used to split user space and
1d9674
kernel space. Also bit 11:0 is used for Process Context IDentifiers(PCID).  To
1d9674
open a dump file of sadump, a value of CR3 is used to calculate KASLR offset and
1d9674
phys_base, therefore this patch fixes to mask CR3 register value collectly for
1d9674
PTI enabled kernel.
1d9674
1d9674
Signed-off-by: Takao Indoh <indou.takao@jp.fujitsu.com>
1d9674
---
1d9674
 makedumpfile.c | 2 ++
1d9674
 makedumpfile.h | 2 ++
1d9674
 sadump_info.c  | 9 ++++++++-
1d9674
 3 files changed, 12 insertions(+), 1 deletion(-)
1d9674
1d9674
diff --git a/makedumpfile-1.6.2/makedumpfile.c b/makedumpfile-1.6.2/makedumpfile.c
1d9674
index 64b404a..247a056 100644
1d9674
--- a/makedumpfile-1.6.2/makedumpfile.c
1d9674
+++ b/makedumpfile-1.6.2/makedumpfile.c
1d9674
@@ -1557,6 +1557,8 @@ get_symbol_info(void)
1d9674
 	SYMBOL_INIT(divide_error, "divide_error");
1d9674
 	SYMBOL_INIT(idt_table, "idt_table");
1d9674
 	SYMBOL_INIT(saved_command_line, "saved_command_line");
1d9674
+	SYMBOL_INIT(pti_init, "pti_init");
1d9674
+	SYMBOL_INIT(kaiser_init, "kaiser_init");
1d9674
 
1d9674
 	return TRUE;
1d9674
 }
1d9674
diff --git a/makedumpfile-1.6.2/makedumpfile.h b/makedumpfile-1.6.2/makedumpfile.h
1d9674
index 57cf4d9..8ee4d29 100644
1d9674
--- a/makedumpfile-1.6.2/makedumpfile.h
1d9674
+++ b/makedumpfile-1.6.2/makedumpfile.h
1d9674
@@ -1608,6 +1608,8 @@ struct symbol_table {
1d9674
 	unsigned long long	divide_error;
1d9674
 	unsigned long long	idt_table;
1d9674
 	unsigned long long	saved_command_line;
1d9674
+	unsigned long long	pti_init;
1d9674
+	unsigned long long	kaiser_init;
1d9674
 
1d9674
 	/*
1d9674
 	 * symbols on ppc64 arch
1d9674
diff --git a/makedumpfile-1.6.2/sadump_info.c b/makedumpfile-1.6.2/sadump_info.c
1d9674
index 148d4ba..dd50d48 100644
1d9674
--- a/makedumpfile-1.6.2/sadump_info.c
1d9674
+++ b/makedumpfile-1.6.2/sadump_info.c
1d9674
@@ -1362,6 +1362,9 @@ finish:
1d9674
  *    kernel. Retrieve vmcoreinfo from address of "elfcorehdr=" and
1d9674
  *    get kaslr_offset and phys_base from vmcoreinfo.
1d9674
  */
1d9674
+#define PTI_USER_PGTABLE_BIT		(info->page_shift)
1d9674
+#define PTI_USER_PGTABLE_MASK		(1 << PTI_USER_PGTABLE_BIT)
1d9674
+#define CR3_PCID_MASK			0xFFFull
1d9674
 int
1d9674
 calc_kaslr_offset(void)
1d9674
 {
1d9674
@@ -1389,7 +1392,11 @@ calc_kaslr_offset(void)
1d9674
 	}
1d9674
 
1d9674
 	idtr = ((uint64_t)smram.IdtUpper)<<32 | (uint64_t)smram.IdtLower;
1d9674
-	cr3 = smram.Cr3;
1d9674
+	if ((SYMBOL(pti_init) != NOT_FOUND_SYMBOL) ||
1d9674
+	    (SYMBOL(kaiser_init) != NOT_FOUND_SYMBOL))
1d9674
+		cr3 = smram.Cr3 & ~(CR3_PCID_MASK|PTI_USER_PGTABLE_MASK);
1d9674
+	else
1d9674
+		cr3 = smram.Cr3 & ~CR3_PCID_MASK;
1d9674
 
1d9674
 	/* Convert virtual address of IDT table to physical address */
1d9674
 	if ((idtr_paddr = vtop4_x86_64_pagetable(idtr, cr3)) == NOT_PADDR)
1d9674
-- 
1d9674
1.8.3.1
1d9674
1d9674
1d9674
1d9674
_______________________________________________
1d9674
kexec mailing list
1d9674
kexec@lists.infradead.org
1d9674
http://lists.infradead.org/mailman/listinfo/kexec