diff options
author | Ian.Campbell@xensource.com <Ian.Campbell@xensource.com> | 2006-04-21 17:19:22 +0100 |
---|---|---|
committer | Ian.Campbell@xensource.com <Ian.Campbell@xensource.com> | 2006-04-21 17:19:22 +0100 |
commit | 8c18405bb315412b8af78b8d90819430a5555f61 (patch) | |
tree | 8207d28032c5098a2494eff17c2e4287c9b9fa68 /xen/common/kernel.c | |
parent | 77d02076f98b7d29f24ca1eea68e8df8bbb3bea3 (diff) | |
download | xen-8c18405bb315412b8af78b8d90819430a5555f61.tar.gz xen-8c18405bb315412b8af78b8d90819430a5555f61.tar.bz2 xen-8c18405bb315412b8af78b8d90819430a5555f61.zip |
Merge nmi_op functionality with the callback_op hypercall.
Signed-off-by: Ian Campbell <ian.campbell@xensource.com>
Diffstat (limited to 'xen/common/kernel.c')
-rw-r--r-- | xen/common/kernel.c | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/xen/common/kernel.c b/xen/common/kernel.c index a2a23fb70f..f7dffadd69 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -213,37 +213,51 @@ long do_xen_version(int cmd, GUEST_HANDLE(void) arg) return -ENOSYS; } -long do_nmi_op(unsigned int cmd, GUEST_HANDLE(void) arg) +long register_guest_nmi_callback(unsigned long address) { struct vcpu *v = current; struct domain *d = current->domain; + + if ( (d->domain_id != 0) || (v->vcpu_id != 0) ) + return -EINVAL; + + v->nmi_addr = address; +#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 + + return 0; +} + +long unregister_guest_nmi_callback(void) +{ + struct vcpu *v = current; + + v->nmi_addr = 0; + + return 0; +} + +long do_nmi_op(unsigned int cmd, GUEST_HANDLE(void) arg) +{ struct xennmi_callback cb; long rc = 0; switch ( cmd ) { case XENNMI_register_callback: - rc = -EINVAL; - if ( (d->domain_id != 0) || (v->vcpu_id != 0) ) - break; - rc = -EFAULT; if ( copy_from_guest(&cb, arg, 1) ) break; - - v->nmi_addr = cb.handler_address; -#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 - rc = 0; + rc = register_guest_nmi_callback(cb.handler_address); break; case XENNMI_unregister_callback: - v->nmi_addr = 0; + rc = unregister_guest_nmi_callback(); break; default: rc = -ENOSYS; |