[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