[makedumpfile PATCH] sadump: Fix a problem of PTI enabled kernel
Atsushi Kumagai
ats-kumagai at wm.jp.nec.com
Thu Jan 25 17:31:29 PST 2018
>> 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?
Sure, it will be merged into v1.6.4 since v1.6.3 is almost ready for release.
Thanks,
Atsushi Kumagai
More information about the kexec
mailing list