[Crash-utility] [PATCH v5 0/3] Improve kaslr_offset detection

HAGIO KAZUHITO(萩尾 一仁) k-hagio-ab at nec.com
Wed Nov 11 05:17:00 UTC 2020


Hi Alexey,

-----Original Message-----
> v5 change: added ack by Lianbo Jiang.
> 
> v4 changes: fixed GCC warnings reported by Kazu.

Thanks for the update.

> 
> Alexey Makhalov (3):
>   calc_kaslr_offset: try all CPUs
>   calc_kaslr_offset: 5-level paging support

I tested the patchset on a qemu memory dump with 5-level paging (la57)
and crash failed during starting session:

  crash: read error: physical address: 125a0c000  type: "p4d page"

It seems that it needs something like:

diff --git a/kaslr_helper.c b/kaslr_helper.c
index f13b7ff0850b..b9fef825a290 100644
--- a/kaslr_helper.c
+++ b/kaslr_helper.c
@@ -671,6 +671,8 @@ calc_kaslr_offset(ulong *ko, ulong *pb)
                        machdep->machspec->physical_mask_shift = __PHYSICAL_MASK_SHIFT_5LEVEL;
                        machdep->machspec->pgdir_shift = PGDIR_SHIFT_5LEVEL;
                        machdep->machspec->ptrs_per_pgd = PTRS_PER_PGD_5LEVEL;
+                       if ((machdep->machspec->p4d = (char *)malloc(PAGESIZE())) == NULL)
+                               error(FATAL, "cannot malloc p4d space.");
                } else {
                        machdep->machspec->physical_mask_shift = __PHYSICAL_MASK_SHIFT_2_6;
                        machdep->machspec->pgdir_shift = PGDIR_SHIFT;
diff --git a/x86_64.c b/x86_64.c
index 0acef2b04faf..939c8a9fddd4 100644
--- a/x86_64.c
+++ b/x86_64.c
@@ -356,9 +356,11 @@ x86_64_init(int when)
                        machdep->machspec->physical_mask_shift = __PHYSICAL_MASK_SHIFT_5LEVEL;
                        machdep->machspec->pgdir_shift = PGDIR_SHIFT_5LEVEL;
                        machdep->machspec->ptrs_per_pgd = PTRS_PER_PGD_5LEVEL;
-                       if ((machdep->machspec->p4d = (char *)malloc(PAGESIZE())) == NULL)
-                               error(FATAL, "cannot malloc p4d space.");
-                       machdep->machspec->last_p4d_read = 0;
+                       if (!machdep->machspec->p4d) {
+                               if ((machdep->machspec->p4d = (char *)malloc(PAGESIZE())) == NULL)
+                                       error(FATAL, "cannot malloc p4d space.");
+                               machdep->machspec->last_p4d_read = 0;
+                       }
                        machdep->uvtop = x86_64_uvtop_level4;  /* 5-level is optional per-task */
                        machdep->kvbase = (ulong)PAGE_OFFSET;
                        machdep->identity_map_base = (ulong)PAGE_OFFSET;

With this, tested OK.
If this looks good, I can fix 2/3 when merging, or you can repost.

Thanks,
Kazu

>   kaslr: get offset by walking page tree
> 
>  defs.h         |   8 +-
>  diskdump.c     |   6 +
>  kaslr_helper.c | 434 ++++++++++++++++++++++++++++++++++++++++++---------------
>  netdump.c      |   6 +
>  sadump.c       |  37 +----
>  symbols.c      |   5 +-
>  vmware_vmss.c  |  15 +-
>  7 files changed, 359 insertions(+), 152 deletions(-)
> 
> --
> 2.11.0





More information about the Crash-utility mailing list