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:
*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(a)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
>
>