[Crash-utility] [PATCH] s390x: Fix virtual address check for 5 level page tables
Dave Anderson
anderson at redhat.com
Thu May 11 19:54:42 UTC 2017
----- Original Message -----
> Hello Dave,
>
> I was talking about the users pace. The "vtop -u" or "rd -u" commands do
> not work for user space memory mapped above 8 PB. Memory is reported as
> not mapped. See the sample below:
Ok good -- the patch is queued for crash-7.2.0:
https://github.com/crash-utility/crash/commit/c30fbd7a43be118c9a342064180a2a8b15cc940a
Thanks,
Dave
>
> *crash> rd -u 0x60000000000000
> rd: invalid user virtual address: 60000000000000 type: "64-bit UVADDR"
> crash> vtop -u 0x60000000000000
> VIRTUAL PHYSICAL
> 60000000000000 (not mapped)
>
>
> VMA START END FLAGS FILE
> 62e5bde8 60000000000000 60000000001000 8100073
> *
>
> Thanks,
> Mikhail Zaslonko
>
>
> On 11.05.2017 20:26, Dave Anderson wrote:
> >
> > ----- Original Message -----
> >> Hello Dave,
> >>
> >> We have recently found that Crash is not capable of processing 5 level
> >> page tables virtual addresses (higher than 8 Petabytes). Please find the
> >> enclosed patch below.
> >>
> >> Thanks,
> >> Mikhail Zaslonko
> > Hi Mikhail,
> >
> > For the changelog, can you give an example of the symptoms of the
> > failure? Does it fail to handle kernel modules during session
> > initialization, or what?
> >
> > Thanks,
> > Dave
> >
> >
> >>
> >> [PATCH] s390x: Fix virtual address check for 5 level page tables
> >>
> >>
> >> The current validity check for virtual addresses fails for
> >> five level page tables because in that case it uses a 64 bit
> >> left-shift operation which is undefined in the C standard.
> >>
> >> Quote from C99 standard:
> >>
> >> If the value of the right operand is negative or is
> >> greater than or equal to the width of the promoted left operand,
> >> the behavior is undefined.
> >>
> >> To fix this, we just skip the validity check in case of highest
> >> page-level (level = 3) due to redundancy
> >>
> >> Signed-off-by: Mikhail Zaslonko <zaslonko at linux.vnet.ibm.com>
> >> ---
> >> s390x.c | 2 +-
> >> 1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/s390x.c b/s390x.c
> >> index e13bd59..96ce3dc 100644
> >> --- a/s390x.c
> >> +++ b/s390x.c
> >> @@ -688,7 +688,7 @@ int s390x_vtop(ulong table, ulong vaddr, physaddr_t
> >> *phys_addr, int verbose)
> >> /* Read the first entry to find the number of page table levels. */
> >> readmem(table, KVADDR, &entry, sizeof(entry), "entry",
> >> FAULT_ON_ERROR);
> >> level = (entry & 0xcULL) >> 2;
> >> - if ((vaddr >> (31 + 11*level)) != 0ULL) {
> >> + if ((level < 3) && (vaddr >> (31 + 11*level)) != 0ULL) {
> >> /* Address too big for the number of page table levels. */
> >> return FALSE;
> >> }
> >> --
> >> 2.10.2
> >>
> >>
>
>
More information about the Crash-utility
mailing list