在 2020年06月15日 22:18, HAGIO KAZUHITO(萩尾 一仁) 写道:
> -----Original Message-----
>> 在 2020年06月12日 00:00, crash-utility-requ...@redhat.com 写道:
>>> Looks good to me, thank you Li RongQing.  Please wait for another ack.
>>
>> The v2 looks good to me.
>>
>> Acked-by: Lianbo Jiang <liji...@redhat.com>
>>
>>>
>>> Acked-by: Kazuhito Hagio <k-hagio...@nec.com>
>>>
>>> If someone can comment or create a patch for Xen, please let us know.
>>> I cannot test it, but I think we can integrate it with this patch if any.
>>
>> Anyway, this is a draft patch, but not sure if the patch happens to work
>> on the Xen. I don't have the Xen environment to confirm it.
>>
>> If Xen engineers would like to verify the draft patch, that would be nice.
> 
> Thank you for your draft patch!
> If there is no response to the Xen patch until tomorrow morning, I think
> to apply only Li's patch separately for now.
> 
OK, sounds good.

> And one more thing, as we discussed internally, we'd like to introduce a
> title line to crash's commit log for --oneline readability and add helpful
> information more if available.  On the other hand, I also would like to
> maintain the crash changelog [0] and its format for searchability.
> 
Indeed, it makes reading and searching more convenient.

Thanks.
Lianbo

> [0] https://crash-utility.github.io/crash.changelog.html
> 
> So, for Li's patch, I'll merge it with something like:
> 
> [commit log]
> x86_64: Add support for 1GB huge pages to "vtop" command
> 
> Add support for 1GB huge page to "vtop" command on x86_64.  Without
> this patch, the command with a user virtual address corresponding to
> a 1GB huge page fails with the error message "vtop: seek error:
> physical address: <address>  type: "page table"".
> 
>   crash> vtop 7f6e40000000
>   VIRTUAL     PHYSICAL
>   vtop: seek error: physical address: 3f53f000f000  type: "page table"
> 
> [crash.changelog]
>          - Add support for 1GB huge page to "vtop" command on x86_64.  Without
>            this patch, the command with a user virtual address corresponding 
> to
>            a 1GB huge page fails with the error message "vtop: seek error:
>            physical address: &lt;address>  type: "page table"".
>            (lirongq...@baidu.com, chukaip...@foxmail.com)
> 
> If you have any problems, please let me know.
> 
> Thanks,
> Kazu
> 
>>
>> Thanks.
>> Lianbo
>>
>> diff --git a/x86_64.c b/x86_64.c
>> index fc05e8af5695..90361a7c39c8 100644
>> --- a/x86_64.c
>> +++ b/x86_64.c
>> @@ -2087,6 +2087,7 @@ x86_64_uvtop_level4_xen_wpt(struct task_context *tc, 
>> ulong uvaddr, physaddr_t *p
>>  {
>>      ulong pgd_pte;
>>      ulong pud_pte;
>> +    ulong pseudo_pud_pte;
>>      ulong pmd_pte;
>>      ulong pseudo_pmd_pte;
>>      ulong pte;
>> @@ -2110,6 +2111,38 @@ x86_64_uvtop_level4_xen_wpt(struct task_context *tc, 
>> ulong uvaddr, physaddr_t *p
>>      if (!(pud_pte & _PAGE_PRESENT))
>>              goto no_upage;
>>
>> +    if (pud_pte & _PAGE_PSE) {
>> +            if (verbose)
>> +                    fprintf(fp, "  PAGE: %lx  (1GB) [machine]\n",
>> +                            PAGEBASE(pud_pte) & PHYSICAL_PAGE_MASK);
>> +
>> +            pseudo_pud_pte = xen_m2p(PAGEBASE(pud_pte));
>> +
>> +            if (pseudo_pud_pte == XEN_MACHADDR_NOT_FOUND) {
>> +                    if (verbose)
>> +                            fprintf(fp, " PAGE: page not available\n");
>> +                    *paddr = PADDR_NOT_AVAILABLE;
>> +                    return FALSE;
>> +            }
>> +
>> +            pseudo_pud_pte |= PAGEOFFSET(pud_pte);
>> +
>> +            if (verbose) {
>> +                    fprintf(fp, " PAGE: %s  (1GB)\n\n",
>> +                            mkstring(buf, VADDR_PRLEN, RJUST|LONG_HEX,
>> +                            MKSTR(PAGEBASE(pseudo_pud_pte) &
>> +                            PHYSICAL_PAGE_MASK)));
>> +
>> +                    x86_64_translate_pte(pseudo_pud_pte, 0, 0);
>> +            }
>> +
>> +            physpage = (PAGEBASE(pseudo_pud_pte) & PHYSICAL_PAGE_MASK) +
>> +                    (uvaddr & ~_1GB_PAGE_MASK);
>> +
>> +            *paddr = physpage;
>> +            return TRUE;
>> +    }
>> +
>>      /*
>>           *  pmd = pmd_offset(pud, address);
>>       */
>> @@ -2504,8 +2537,9 @@ no_kpage:
>>  static int
>>  x86_64_kvtop_xen_wpt(struct task_context *tc, ulong kvaddr, physaddr_t 
>> *paddr, int verbose)
>>  {
>> -        ulong *pgd;
>> +    ulong *pgd;
>>      ulong pud_pte;
>> +    ulong pseudo_pud_pte;
>>      ulong pmd_pte;
>>      ulong pseudo_pmd_pte;
>>      ulong pte;
>> @@ -2524,6 +2558,36 @@ x86_64_kvtop_xen_wpt(struct task_context *tc, ulong 
>> kvaddr, physaddr_t *paddr, i
>>      if (!(pud_pte & _PAGE_PRESENT))
>>              goto no_kpage;
>>
>> +    if (pud_pte & _PAGE_PSE) {
>> +            if (verbose)
>> +                    fprintf(fp, "  PAGE: %lx  (1GB) [machine]\n",
>> +                            PAGEBASE(pud_pte) & PHYSICAL_PAGE_MASK);
>> +
>> +            pseudo_pud_pte = xen_m2p(PAGEBASE(pud_pte));
>> +
>> +            if (pseudo_pud_pte == XEN_MACHADDR_NOT_FOUND) {
>> +                    if (verbose)
>> +                            fprintf(fp, " PAGE: page not available\n");
>> +                    *paddr = PADDR_NOT_AVAILABLE;
>> +                    return FALSE;
>> +            }
>> +
>> +            pseudo_pud_pte |= PAGEOFFSET(pud_pte);
>> +            if (verbose) {
>> +                    fprintf(fp, " PAGE: %s  (1GB)\n\n",
>> +                            mkstring(buf, VADDR_PRLEN, RJUST|LONG_HEX,
>> +                            MKSTR(PAGEBASE(pseudo_pud_pte) &
>> +                            PHYSICAL_PAGE_MASK)));
>> +
>> +                    x86_64_translate_pte(pseudo_pud_pte, 0, 0);
>> +            }
>> +            physpage = (PAGEBASE(pseudo_pud_pte) & PHYSICAL_PAGE_MASK) +
>> +                    (kvaddr & ~_1GB_PAGE_MASK);
>> +
>> +            *paddr = physpage;
>> +            return TRUE;
>> +    }
>> +
>>      /*
>>       *  pmd = pmd_offset(pgd, addr);
>>       */
> 

--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility

Reply via email to