在 2020年11月11日 13:17, HAGIO KAZUHITO(萩尾 一仁) 写道:
 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"
  
Thank you for checking this error, Kazu.
I did not make the test for this patch because it was marked as Verified as below:
Patch #2: new patch. 5 level paging support. Verified.
Seems that making the test myself is a good way to check for errors ASAP.
Thanks.
Lianbo
 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