Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 77db5cbd authored by Huang Ying's avatar Huang Ying Committed by Avi Kivity
Browse files

KVM: MCE: Send SRAR SIGBUS directly



Originally, SRAR SIGBUS is sent to QEMU-KVM via touching the poisoned
page. But commit 96054569 prevents the
signal from being sent. So now the signal is sent via
force_sig_info_fault directly.

[marcelo: use send_sig_info instead]

Reported-by: default avatarDean Nelson <dnelson@redhat.com>
Signed-off-by: default avatarHuang Ying <ying.huang@intel.com>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent 5854dbca
Loading
Loading
Loading
Loading
+10 −8
Original line number Original line Diff line number Diff line
@@ -2251,22 +2251,24 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write,
	return pt_write;
	return pt_write;
}
}


static void kvm_send_hwpoison_signal(struct kvm *kvm, gfn_t gfn)
static void kvm_send_hwpoison_signal(unsigned long address, struct task_struct *tsk)
{
{
	char buf[1];
	siginfo_t info;
	void __user *hva;

	int r;
	info.si_signo	= SIGBUS;
	info.si_errno	= 0;
	info.si_code	= BUS_MCEERR_AR;
	info.si_addr	= (void __user *)address;
	info.si_addr_lsb = PAGE_SHIFT;


	/* Touch the page, so send SIGBUS */
	send_sig_info(SIGBUS, &info, tsk);
	hva = (void __user *)gfn_to_hva(kvm, gfn);
	r = copy_from_user(buf, hva, 1);
}
}


static int kvm_handle_bad_page(struct kvm *kvm, gfn_t gfn, pfn_t pfn)
static int kvm_handle_bad_page(struct kvm *kvm, gfn_t gfn, pfn_t pfn)
{
{
	kvm_release_pfn_clean(pfn);
	kvm_release_pfn_clean(pfn);
	if (is_hwpoison_pfn(pfn)) {
	if (is_hwpoison_pfn(pfn)) {
		kvm_send_hwpoison_signal(kvm, gfn);
		kvm_send_hwpoison_signal(gfn_to_hva(kvm, gfn), current);
		return 0;
		return 0;
	} else if (is_fault_pfn(pfn))
	} else if (is_fault_pfn(pfn))
		return -EFAULT;
		return -EFAULT;