Applied, thanks.

On Fri, Nov 07, 2008 at 04:42:52PM +0800, Zhang, Xiantao wrote:
> Okay, Updated :)
> Xiantao
> 
> PATCH: Fix frametable_miss handling for HVM guests.
> 
> For hvm guests, hypervisor use mfn_valid to check mfn, but it will incur
> weird faults. It is becasue ipsr is saved in r29, but frametalbe miss assumes
> saved in r21.
> 
> Signed-off-by Xiantao Zhang <[EMAIL PROTECTED]> 
> 
> diff -r f6795589ef82 xen/arch/ia64/vmx/vmx_ivt.S
> --- a/xen/arch/ia64/vmx/vmx_ivt.S     Thu Nov 06 12:14:57 2008 +0900
> +++ b/xen/arch/ia64/vmx/vmx_ivt.S     Fri Nov 07 16:35:55 2008 +0800
> @@ -343,7 +343,7 @@ END(vmx_alt_itlb_miss)
>  // 0x1000 Entry 4 (size 64 bundles) Alt DTLB (7,46)
>  ENTRY(vmx_alt_dtlb_miss)
>      VMX_DBG_FAULT(4)
> -    mov r29=cr.ipsr
> +    mov r29=cr.ipsr  //frametable_miss needs ipsr is saved in r29.
>      mov r31=pr
>      adds r22=IA64_VCPU_MMU_MODE_OFFSET, r21
>      ;;
> @@ -356,7 +356,7 @@ vmx_alt_dtlb_miss_vmm:
>      // Test for the address of virtual frame_table
>      shr r22=r16,56;;
>      cmp.eq p8,p0=((VIRT_FRAME_TABLE_ADDR>>56)&0xff)-0x100,r22
> -(p8)br.cond.sptk frametable_miss ;;
> +(p8)br.cond.sptk frametable_miss ;; //Make sure ipsr is saved in r29
>  #endif
>      movl r17=PAGE_KERNEL
>      mov r20=cr.isr
> diff -r f6795589ef82 xen/arch/ia64/xen/ivt.S
> --- a/xen/arch/ia64/xen/ivt.S Thu Nov 06 12:14:57 2008 +0900
> +++ b/xen/arch/ia64/xen/ivt.S Fri Nov 07 16:35:55 2008 +0800
> @@ -184,10 +184,12 @@ late_alt_dtlb_miss:
>  late_alt_dtlb_miss:
>       mov r20=cr.isr
>       movl r17=PAGE_KERNEL
> -     mov r21=cr.ipsr
> +     mov r29=cr.ipsr // frametable_miss is shared by paravirtual and HVM 
> sides
> +                     // and it assumes ipsr is saved in r29. If change the
> +                     // registers usage here, please check both sides!   
>       movl r19=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff)
>       ;;
> -     extr.u r23=r21,IA64_PSR_CPL0_BIT,2      // extract psr.cpl
> +     extr.u r23=r29,IA64_PSR_CPL0_BIT,2      // extract psr.cpl
>       and r22=IA64_ISR_CODE_MASK,r20          // get the isr.code field
>       tbit.nz p6,p7=r20,IA64_ISR_SP_BIT       // is speculation bit on?
>       extr.u r18=r16,XEN_VIRT_UC_BIT,1        // extract UC bit
> @@ -234,7 +236,7 @@ late_alt_dtlb_miss:
>       br.cond.spnt page_fault
>       ;;
>  alt_dtlb_miss_identity_map:
> -     dep r21=-1,r21,IA64_PSR_ED_BIT,1
> +     dep r29=-1,r29,IA64_PSR_ED_BIT,1
>       or r19=r19,r17          // insert PTE control bits into r19
>       mov cr.itir=r20         // set itir with cleared key
>       ;;
> @@ -243,7 +245,7 @@ alt_dtlb_miss_identity_map:
>       cmp.eq.or p8,p0=0x18,r22        // Region 6 is UC for EFI
>       ;;
>  (p8) dep r19=-1,r19,4,1      // set bit 4 (uncached) if access to UC area
> -(p6) mov cr.ipsr=r21
> +(p6) mov cr.ipsr=r29
>       ;;
>  (p7) itc.d r19               // insert the TLB entry
>       mov pr=r31,-1
> @@ -288,17 +290,17 @@ GLOBAL_ENTRY(frametable_miss)
>       rfi
>  END(frametable_miss)
>  
> -ENTRY(frametable_fault)
> +ENTRY(frametable_fault)              //ipsr saved in r29 before coming here!
>       ssm psr.dt              // switch to using virtual data addressing
>       mov r18=cr.iip
>       movl r19=ia64_frametable_probe
>       ;;
>       cmp.eq p6,p7=r18,r19    // is faulting addrress ia64_frametable_probe?
>       mov r8=0                // assumes that 'probe.r' uses r8
> -     dep r21=-1,r21,IA64_PSR_RI_BIT+1,1 // return to next instruction in
> +     dep r29=-1,r29,IA64_PSR_RI_BIT+1,1 // return to next instruction in
>                                          //   bundle 2
>       ;;
> -(p6) mov cr.ipsr=r21
> +(p6) mov cr.ipsr=r29
>       mov r19=4               // FAULT(4)
>  (p7) br.spnt.few dispatch_to_fault_handler
>       ;;
> Isaku Yamahata wrote:
> > On Fri, Nov 07, 2008 at 03:47:10PM +0800, Zhang, Xiantao wrote:
> >> Hi, Isaku
> >>    Attached patch should fix the issue.  Paravirtualized ivt and HVM
> >> ivt share the code for frametable_miss handling, but they have
> >> different assumptions for registers useage. IPSR is savded in r21 at
> >> paravirtualized side, but r29 is used for HVM side. This patch
> >> uniform them to use r29 for ipsr save.   
> > 
> > Oh great! That explains why mfn_valid() didn't work and
> > the patch looks good.
> > Could you please add the comment above late_alt_dtlb_miss
> > why the r29 is used instead of r21 in ivt.S?
> > 
> > thanks,
> > 
> >> Thanks
> >> Xiantao
> >> 
> >> 
> >> PATCH: Fix frametable_miss handling for HVM guests.
> >> 
> >> For hvm guests, hypervisor use mfn_valid to check mfn, but it will
> >> incur 
> >> weird faults. It is becasue ipsr is saved in r29, but frametalbe
> >> miss assumes 
> >> saved in r21.
> >> 
> >> Signed-off-by Xiantao Zhang <[EMAIL PROTECTED]>
> >> 
> >> diff -r f6795589ef82 xen/arch/ia64/vmx/vmx_ivt.S
> >> --- a/xen/arch/ia64/vmx/vmx_ivt.S  Thu Nov 06 12:14:57 2008 +0900
> >> +++ b/xen/arch/ia64/vmx/vmx_ivt.S  Fri Nov 07 15:31:26 2008 +0800
> >> @@ -356,7 +356,7 @@ vmx_alt_dtlb_miss_vmm:
> >>      // Test for the address of virtual frame_table      shr
> >>      r22=r16,56;; cmp.eq
> >> p8,p0=((VIRT_FRAME_TABLE_ADDR>>56)&0xff)-0x100,r22 -(p8)br.cond.sptk
> >> frametable_miss ;; +(p8)br.cond.sptk frametable_miss ;; //Make sure
> >>      ipsr is saved in r29  #endif movl r17=PAGE_KERNEL
> >>      mov r20=cr.isr
> >> diff -r f6795589ef82 xen/arch/ia64/xen/ivt.S
> >> --- a/xen/arch/ia64/xen/ivt.S      Thu Nov 06 12:14:57 2008 +0900
> >> +++ b/xen/arch/ia64/xen/ivt.S      Fri Nov 07 15:31:26 2008 +0800
> >> @@ -184,10 +184,10 @@ late_alt_dtlb_miss:
> >>  late_alt_dtlb_miss:
> >>    mov r20=cr.isr
> >>    movl r17=PAGE_KERNEL
> >> -  mov r21=cr.ipsr
> >> +  mov r29=cr.ipsr
> >>    movl r19=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff)     ;;
> >> -  extr.u r23=r21,IA64_PSR_CPL0_BIT,2      // extract psr.cpl
> >> +  extr.u r23=r29,IA64_PSR_CPL0_BIT,2      // extract psr.cpl
> >>    and r22=IA64_ISR_CODE_MASK,r20          // get the isr.code field
> >>    tbit.nz p6,p7=r20,IA64_ISR_SP_BIT       // is speculation bit on?
> >>    extr.u r18=r16,XEN_VIRT_UC_BIT,1        // extract UC bit
> >> @@ -234,7 +234,7 @@ late_alt_dtlb_miss:
> >>    br.cond.spnt page_fault
> >>    ;;
> >>  alt_dtlb_miss_identity_map:
> >> -  dep r21=-1,r21,IA64_PSR_ED_BIT,1
> >> +  dep r29=-1,r29,IA64_PSR_ED_BIT,1
> >>    or r19=r19,r17          // insert PTE control bits into r19
> >>    mov cr.itir=r20         // set itir with cleared key
> >>    ;;
> >> @@ -243,7 +243,7 @@ alt_dtlb_miss_identity_map:
> >>    cmp.eq.or p8,p0=0x18,r22        // Region 6 is UC for EFI       ;;
> >>  (p8)      dep r19=-1,r19,4,1      // set bit 4 (uncached) if access to UC
> >> area -(p6) mov cr.ipsr=r21 +(p6)   mov cr.ipsr=r29
> >>    ;;
> >>  (p7)      itc.d r19               // insert the TLB entry
> >>    mov pr=r31,-1
> >> @@ -288,17 +288,17 @@ GLOBAL_ENTRY(frametable_miss)        rfi
> >>  END(frametable_miss)
> >> 
> >> -ENTRY(frametable_fault)
> >> +ENTRY(frametable_fault)           //ipsr saved in r29 before coming here!
> >>    ssm psr.dt              // switch to using virtual data addressing      
> >> mov
> >>    r18=cr.iip movl r19=ia64_frametable_probe
> >>    ;;
> >>    cmp.eq p6,p7=r18,r19    // is faulting addrress ia64_frametable_probe?
> >>    mov r8=0                // assumes that 'probe.r' uses r8
> >> -  dep r21=-1,r21,IA64_PSR_RI_BIT+1,1 // return to next instruction in
> >> +  dep r29=-1,r29,IA64_PSR_RI_BIT+1,1 // return to next instruction
> >>    in                                         //   bundle 2 ;;
> >> -(p6)      mov cr.ipsr=r21
> >> +(p6)      mov cr.ipsr=r29
> >>    mov r19=4               // FAULT(4)
> >>  (p7)      br.spnt.few dispatch_to_fault_handler
> >>    ;;
> >> 
> >> Isaku Yamahata wrote:
> >>> On Fri, Nov 07, 2008 at 11:33:43AM +0800, Zhang, Xiantao wrote:
> >>>> But another thing to meation, why mfn_valid with invalid parameter
> >>>> will incur the fault?  Seems mfn_valid has something wrong, I have
> >>>> no enough time to find the cause.  Is it a known issue ? Or
> >>>> mfn_valid has some limitation ?
> >>> 
> >>> mfn_valid() with invalid parameter shouldn't cause panic.
> >>> It may cause tlb miss fault, but the fault should be handled
> >>> specially by frametable_fault in ivt.S and should be recovered
> >>> resulting 
> >>> in mfn_valid() returning false.
> >>> 
> >>> I agree with you that there's something wrong in mfn_valid()
> >>> I haven't aware of the issue.
> >>> 
> >>> thanks,
> >>> 
> >>>> Thanks
> >>>> Xiantao
> >>>> 
> >>>> Zhang, Xiantao wrote:
> >>>>> Yes. Should be addressed.
> >>>>> 
> >>>>> -----Original Message-----
> >>>>> From: Isaku Yamahata [mailto:[EMAIL PROTECTED]
> >>>>> Sent: Friday, November 07, 2008 11:03 AM
> >>>>> To: Zhang, Xiantao
> >>>>> Cc: xen-ia64-devel@lists.xensource.com
> >>>>> Subject: Re: [Xen-ia64-devel] [PATCH] Fix vti guests broken issue.
> >>>>> 
> >>>>> Oh, my bad. Thank you for debugging.
> >>>>> I applied and pushed out.
> >>>>> Does this fixed the issue you repoted?
> >>>>> 
> >>>>> thanks,
> >>>>> 
> >>>>> On Fri, Nov 07, 2008 at 10:42:57AM +0800, Zhang, Xiantao wrote:
> >>>>>> PATCH : Fix vti guests broken issue.
> >>>>>> mfn_valid should use machine physical pfn, not guest physical
> >>>>>> pfn. 
> >>>>>> 
> >>>>>> Sign-off-by: Xiantao Zhang <[EMAIL PROTECTED]>
> >>>>>> 
> >>>>>> 
> >>>>>> diff -r f6795589ef82 xen/arch/ia64/vmx/vtlb.c
> >>>>>> --- a/xen/arch/ia64/vmx/vtlb.c Thu Nov 06 12:14:57 2008 +0900
> >>>>>> +++ b/xen/arch/ia64/vmx/vtlb.c Fri Nov 07 10:35:11 2008 +0800
> >>>>>> @@ -522,7 +522,7 @@ static u64 translate_phy_pte(VCPU *v, u6
> >>>>>>       * which is required by vga acceleration since qemu maps
> >>>>>> shared 
> >>>>>>       * vram buffer with WB.
> >>>>>>       */
> >>>>>> -    if (mfn_valid(pte_pfn(__pte(pte))) && phy_pte.ma !=
> >>>>>> VA_MATTR_NATPAGE) +    if (mfn_valid(pte_pfn(__pte(maddr))) &&
> >>>>>>          phy_pte.ma != VA_MATTR_NATPAGE) phy_pte.ma =
> >>>>>> VA_MATTR_WB; 
> >>>>>> 
> >>>>>>      maddr = ((maddr & _PAGE_PPN_MASK) & PAGE_MASK) | (paddr &
> >>>>>> ~PAGE_MASK);
> >>>>> 
> >>>>>> _______________________________________________
> >>>>>> Xen-ia64-devel mailing list
> >>>>>> Xen-ia64-devel@lists.xensource.com
> >>>>>> http://lists.xensource.com/xen-ia64-devel
> >> 
> > 
> > 
> >> _______________________________________________
> >> Xen-ia64-devel mailing list
> >> Xen-ia64-devel@lists.xensource.com
> >> http://lists.xensource.com/xen-ia64-devel
> 


> _______________________________________________
> Xen-ia64-devel mailing list
> Xen-ia64-devel@lists.xensource.com
> http://lists.xensource.com/xen-ia64-devel

-- 
yamahata

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@lists.xensource.com
http://lists.xensource.com/xen-ia64-devel

Reply via email to