[PATCH] makedumpfile, sadump: fix failure of reading memory when 5-level paging is enabled

HAGIO KAZUHITO(萩尾 一仁) k-hagio-ab at nec.com
Wed Mar 29 19:25:43 PDT 2023


On 2023/03/29 21:44, Daisuke Hatayama (Fujitsu) wrote:
> makedumpfile fails as follows for memory dumps collected by sadump
> when 5-level paging is enabled on the corresponding systems:
> 
>      # makedumpfile -l -d 31 -x ./vmlinux ./dump.sadump dump.sadump-ld31
>      __vtop4_x86_64: Can't get a valid pgd.
>      ...snip...
>      __vtop4_x86_64: Can't get a valid pgd.
>      calc_kaslr_offset: failed to calculate kaslr_offset and phys_base; default to 0
>      __vtop4_x86_64: Can't get a valid pgd.
>      readmem: Can't convert a virtual address(ffffffff82fce960) to physical address.
>      readmem: type_addr: 0, addr:ffffffff82fce960, size:1024
>      cpu_online_mask_init: Can't read cpu_online_mask memory.
> 
>      makedumpfile Failed.
> 
> This is because 5-level paging support has not been done yet for
> sadump; the work of the 5-level paging support was done by the commit
> 30a3214a7193e94c551c0cebda5918a72a35c589 (PATCH 4/4 arch/x86_64: Add
> 5-level paging support) but that was focused on the core part only.
> 
> Having said that, most of things has already been finished in the
> commit. What needs to be newly added for sadump is just how to check
> if 5-level paging is enabled for a given memory dump.
> 
> For that purpose, let's refer to CR4.LA57, bit 12 of CR4, representing
> whether 5-level paging is enabled or not. We can do this because
> memory dumps collected by sadump have SMRAM as note information and
> they include CR4 together with the other control registers.
> 
> Signed-off-by: HATAYAMA Daisuke <d.hatayama at fujitsu.com>
> ---
>   sadump_info.c | 4 ++++
>   1 file changed, 4 insertions(+)
> 
> diff --git a/sadump_info.c b/sadump_info.c
> index adfa8dc..2c44068 100644
> --- a/sadump_info.c
> +++ b/sadump_info.c
> @@ -1362,6 +1362,7 @@ static int linux_banner_sanity_check(ulong cr3)
>   #define PTI_USER_PGTABLE_BIT		(info->page_shift)
>   #define PTI_USER_PGTABLE_MASK		(1 << PTI_USER_PGTABLE_BIT)
>   #define CR3_PCID_MASK			0xFFFull
> +#define CR4_LA57			(1 << 12)
>   int
>   calc_kaslr_offset(void)
>   {
> @@ -1397,6 +1398,8 @@ calc_kaslr_offset(void)
>   		else
>   			cr3 = smram.Cr3 & ~CR3_PCID_MASK;
>   
> +		NUMBER(pgtable_l5_enabled) = !!(smram.Cr4 & CR4_LA57);
> +
>   		/* Convert virtual address of IDT table to physical address */
>   		idtr_paddr = vtop4_x86_64_pagetable(idtr, cr3);
>   		if (idtr_paddr == NOT_PADDR) {
> @@ -1417,6 +1420,7 @@ calc_kaslr_offset(void)
>   
>   		DEBUG_MSG("sadump: idtr=%" PRIx64 "\n", idtr);
>   		DEBUG_MSG("sadump: cr3=%" PRIx64 "\n", cr3);
> +		DEBUG_MSG("sadump: cr4=%" PRIx32 "\n", smram.Cr4);
>   		DEBUG_MSG("sadump: idtr(phys)=%" PRIx64 "\n", idtr_paddr);
>   		DEBUG_MSG("sadump: devide_error(vmlinux)=%lx\n",
>   			  divide_error_vmlinux);

Thanks, applied.
https://github.com/makedumpfile/makedumpfile/commit/58553ad03187f0cf208d6c4a0dc026c6338e5edd

(oh, "devide" is there..)

Thanks,
Kazu


More information about the kexec mailing list