[makedumpfile PATCH] sadump: Fix a problem of PTI enabled kernel
Hatayama, Daisuke
d.hatayama at jp.fujitsu.com
Thu Jan 25 17:10:55 PST 2018
> -----Original Message-----
> From: kexec [mailto:kexec-bounces at lists.infradead.org] On Behalf Of Takao
> Indoh
> Sent: Friday, January 26, 2018 9:22 AM
> To: ats-kumagai at wm.jp.nec.com; Hatayama, Daisuke
> <d.hatayama at jp.fujitsu.com>
> Cc: kexec at lists.infradead.org
> Subject: [makedumpfile PATCH] sadump: Fix a problem of PTI enabled kernel
>
> This patch fixes a problme that a dumpfile of sadump cannot be handled by
> makedumpfile when Page Table Isolation(PTI) is enabled.
>
> When PTI is enabled, bit 12 of CR3 register is used to split user space and
> kernel space. Also bit 11:0 is used for Process Context IDentifiers(PCID). To
> open a dump file of sadump, a value of CR3 is used to calculate KASLR offset
> and
> phys_base, therefore this patch fixes to mask CR3 register value collectly for
> PTI enabled kernel.
>
> Signed-off-by: Takao Indoh <indou.takao at jp.fujitsu.com>
> ---
> makedumpfile.c | 2 ++
> makedumpfile.h | 2 ++
> sadump_info.c | 9 ++++++++-
> 3 files changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/makedumpfile.c b/makedumpfile.c
> index 64b404a..247a056 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -1557,6 +1557,8 @@ get_symbol_info(void)
> SYMBOL_INIT(divide_error, "divide_error");
> SYMBOL_INIT(idt_table, "idt_table");
> SYMBOL_INIT(saved_command_line, "saved_command_line");
> + SYMBOL_INIT(pti_init, "pti_init");
> + SYMBOL_INIT(kaiser_init, "kaiser_init");
>
> return TRUE;
> }
> diff --git a/makedumpfile.h b/makedumpfile.h
> index 57cf4d9..8ee4d29 100644
> --- a/makedumpfile.h
> +++ b/makedumpfile.h
> @@ -1608,6 +1608,8 @@ struct symbol_table {
> unsigned long long divide_error;
> unsigned long long idt_table;
> unsigned long long saved_command_line;
> + unsigned long long pti_init;
> + unsigned long long kaiser_init;
>
> /*
> * symbols on ppc64 arch
> diff --git a/sadump_info.c b/sadump_info.c
> index 148d4ba..dd50d48 100644
> --- a/sadump_info.c
> +++ b/sadump_info.c
> @@ -1362,6 +1362,9 @@ finish:
> * kernel. Retrieve vmcoreinfo from address of "elfcorehdr=" and
> * get kaslr_offset and phys_base from vmcoreinfo.
> */
> +#define PTI_USER_PGTABLE_BIT (info->page_shift)
> +#define PTI_USER_PGTABLE_MASK (1 << PTI_USER_PGTABLE_BIT)
> +#define CR3_PCID_MASK 0xFFFull
> int
> calc_kaslr_offset(void)
> {
> @@ -1389,7 +1392,11 @@ calc_kaslr_offset(void)
> }
>
> idtr = ((uint64_t)smram.IdtUpper)<<32 | (uint64_t)smram.IdtLower;
> - cr3 = smram.Cr3;
> + if ((SYMBOL(pti_init) != NOT_FOUND_SYMBOL) ||
> + (SYMBOL(kaiser_init) != NOT_FOUND_SYMBOL))
> + cr3 = smram.Cr3 & ~(CR3_PCID_MASK|PTI_USER_PGTABLE_MASK);
> + else
> + cr3 = smram.Cr3 & ~CR3_PCID_MASK;
>
> /* Convert virtual address of IDT table to physical address */
> if ((idtr_paddr = vtop4_x86_64_pagetable(idtr, cr3)) == NOT_PADDR)
Looks good to me.
Thanks for your work.
Kumagai-san, could you merge this patch?
Thanks.
HATAYAMA, Daisuke
More information about the kexec
mailing list