Hi James,
  I have a comment here:

On 2017/5/25 0:32, James Morse wrote:
> +static void kvm_send_hwpoison_signal(unsigned long address,
> +                                  struct vm_area_struct *vma)
> +{
> +     siginfo_t info;
> +
> +     info.si_signo   = SIGBUS;
> +     info.si_errno   = 0;
> +     info.si_code    = BUS_MCEERR_AR;
> +     info.si_addr    = (void __user *)address;
> +
> +     if (is_vm_hugetlb_page(vma))
> +             info.si_addr_lsb = huge_page_shift(hstate_vma(vma));
> +     else
> +             info.si_addr_lsb = PAGE_SHIFT;
> +
> +     send_sig_info(SIGBUS, &info, current);
> +}
> +
>  static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
>                         struct kvm_memory_slot *memslot, unsigned long hva,
>                         unsigned long fault_status)
> @@ -1318,6 +1337,10 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, 
> phys_addr_t fault_ipa,
>       smp_rmb();
>  
>       pfn = gfn_to_pfn_prot(kvm, gfn, write_fault, &writable);
> +     if (pfn == KVM_PFN_ERR_HWPOISON) {
> +             kvm_send_hwpoison_signal(hva, vma);
> +             return 0;
> +     }
I heard from our CPU hardware team, when happen HWpoison, CPU hardware does not 
record the IPA address in the HPFAR_EL2.
Only when the SEA error is related to the page table walk, the HPFAR_EL2 
register is updated.
here we got the pfn/gfn from the register HPFAR_EL2, if CPU does not update the 
HPFAR_EL2 register, we may can not use this method to get the pfn/gfn.
could you confirm arm's armv8.0/armv8.2 standard CPU also use such design? if 
so, we may need to use other method to get the gfn/pfn/hva address.


>       if (is_error_noslot_pfn(pfn))
>               return -EFAULT;

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to