Skip to content

Commit

Permalink
[PATCH] sadump: fix failure of reading memory when 5-level paging is …
Browse files Browse the repository at this point in the history
…enabled

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
30a3214 (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@fujitsu.com>
  • Loading branch information
d-hatayama authored and k-hagio committed Mar 30, 2023
1 parent 5f17bdd commit 58553ad
Showing 1 changed file with 4 additions and 0 deletions.
4 changes: 4 additions & 0 deletions sadump_info.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
Expand Down

0 comments on commit 58553ad

Please sign in to comment.