From: kaf24@firebug.cl.cam.ac.uk Date: Wed, 11 Jan 2006 18:24:43 +0000 (+0100) Subject: Reassert nmi pending when a nmi handler is registered X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16541^2~61^2~6 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=a7813c4bba0b7de139df68721c7f6561a5763ae4;p=xen.git Reassert nmi pending when a nmi handler is registered if we lost a previous nmi. Signed-off-by: Keir Fraser --- diff --git a/xen/common/kernel.c b/xen/common/kernel.c index f2bb308652..f1d74c731a 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -151,19 +151,32 @@ long do_xen_version(int cmd, void *arg) long do_nmi_op(unsigned int cmd, void *arg) { + struct vcpu *v = current; + struct domain *d = current->domain; long rc = 0; switch ( cmd ) { case XENNMI_register_callback: - if ( (current->domain->domain_id != 0) || (current->vcpu_id != 0) ) - rc = -EINVAL; + if ( (d->domain_id != 0) || (v->vcpu_id != 0) ) + { + rc = -EINVAL; + } else - current->nmi_addr = (unsigned long)arg; - printk("***** NMI handler at 0x%lx\n", current->nmi_addr); + { + v->nmi_addr = (unsigned long)arg; +#ifdef CONFIG_X86 + /* + * If no handler was registered we can 'lose the NMI edge'. + * Re-assert it now. + */ + if ( d->shared_info->arch.nmi_reason != 0 ) + set_bit(_VCPUF_nmi_pending, &v->vcpu_flags); +#endif + } break; case XENNMI_unregister_callback: - current->nmi_addr = 0; + v->nmi_addr = 0; break; default: rc = -ENOSYS;