Reassert nmi pending when a nmi handler is registered
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 11 Jan 2006 18:24:43 +0000 (19:24 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 11 Jan 2006 18:24:43 +0000 (19:24 +0100)
if we lost a previous nmi.

Signed-off-by: Keir Fraser <keir@xensource.com>
xen/common/kernel.c

index f2bb308652d07c853711b15df57378c7e822da60..f1d74c731aa34bd9cf331b03ed2364c2abf422e1 100644 (file)
@@ -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;