From: Keir Fraser Date: Mon, 22 Oct 2007 10:11:04 +0000 (+0100) Subject: Allow a guest to send NMIs to its VCPUs. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14847^2~5 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=d420576eb51d53affb6aeda89c43d7d83b4d77d8;p=xen.git Allow a guest to send NMIs to its VCPUs. Signed-off-by: Keir Fraser --- diff --git a/xen/common/compat/domain.c b/xen/common/compat/domain.c index a7f2d8ff43..002a8a8362 100644 --- a/xen/common/compat/domain.c +++ b/xen/common/compat/domain.c @@ -59,6 +59,7 @@ int compat_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) case VCPUOP_stop_periodic_timer: case VCPUOP_set_singleshot_timer: case VCPUOP_stop_singleshot_timer: + case VCPUOP_send_nmi: rc = do_vcpu_op(cmd, vcpuid, arg); break; diff --git a/xen/common/domain.c b/xen/common/domain.c index 55152a3953..6c26363c65 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -708,11 +708,9 @@ long do_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) } case VCPUOP_stop_periodic_timer: - { v->periodic_period = 0; vcpu_force_reschedule(v); break; - } case VCPUOP_set_singleshot_timer: { @@ -740,13 +738,21 @@ long do_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) } case VCPUOP_stop_singleshot_timer: - { if ( v != current ) return -EINVAL; stop_timer(&v->singleshot_timer); + + break; + + case VCPUOP_send_nmi: + if ( !guest_handle_is_null(arg) ) + return -EINVAL; + + if ( !test_and_set_bool(v->nmi_pending) ) + vcpu_kick(v); + break; - } default: rc = arch_do_vcpu_op(cmd, v, arg); diff --git a/xen/include/public/vcpu.h b/xen/include/public/vcpu.h index a84eb51310..4cd4229d91 100644 --- a/xen/include/public/vcpu.h +++ b/xen/include/public/vcpu.h @@ -179,6 +179,9 @@ struct vcpu_register_vcpu_info { typedef struct vcpu_register_vcpu_info vcpu_register_vcpu_info_t; DEFINE_XEN_GUEST_HANDLE(vcpu_register_vcpu_info_t); +/* Send an NMI to the specified VCPU. @extra_arg == NULL. */ +#define VCPUOP_send_nmi 11 + #endif /* __XEN_PUBLIC_VCPU_H__ */ /*