diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2008-12-11 10:54:54 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2008-12-31 09:55:47 -0500 |
commit | 4531220b71f0399e71cda0c4cf749e7281a7416a (patch) | |
tree | 2d0b71b97a15bdd6ede42d05b7b9b791c3891eb3 /include/linux | |
parent | 264ff01d55b456932cef03082448b41d2edeb6a1 (diff) |
KVM: x86: Rework user space NMI injection as KVM_CAP_USER_NMI
There is no point in doing the ready_for_nmi_injection/
request_nmi_window dance with user space. First, we don't do this for
in-kernel irqchip anyway, while the code path is the same as for user
space irqchip mode. And second, there is nothing to loose if a pending
NMI is overwritten by another one (in contrast to IRQs where we have to
save the number). Actually, there is even the risk of raising spurious
NMIs this way because the reason for the held-back NMI might already be
handled while processing the first one.
Therefore this patch creates a simplified user space NMI injection
interface, exporting it under KVM_CAP_USER_NMI and dropping the old
KVM_CAP_NMI capability. And this time we also take care to provide the
interface only on archs supporting NMIs via KVM (right now only x86).
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/kvm.h | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/include/linux/kvm.h b/include/linux/kvm.h index 48807767e726..35525ac63337 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h | |||
@@ -84,21 +84,18 @@ struct kvm_irqchip { | |||
84 | #define KVM_EXIT_S390_RESET 14 | 84 | #define KVM_EXIT_S390_RESET 14 |
85 | #define KVM_EXIT_DCR 15 | 85 | #define KVM_EXIT_DCR 15 |
86 | #define KVM_EXIT_NMI 16 | 86 | #define KVM_EXIT_NMI 16 |
87 | #define KVM_EXIT_NMI_WINDOW_OPEN 17 | ||
88 | 87 | ||
89 | /* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */ | 88 | /* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */ |
90 | struct kvm_run { | 89 | struct kvm_run { |
91 | /* in */ | 90 | /* in */ |
92 | __u8 request_interrupt_window; | 91 | __u8 request_interrupt_window; |
93 | __u8 request_nmi_window; | 92 | __u8 padding1[7]; |
94 | __u8 padding1[6]; | ||
95 | 93 | ||
96 | /* out */ | 94 | /* out */ |
97 | __u32 exit_reason; | 95 | __u32 exit_reason; |
98 | __u8 ready_for_interrupt_injection; | 96 | __u8 ready_for_interrupt_injection; |
99 | __u8 if_flag; | 97 | __u8 if_flag; |
100 | __u8 ready_for_nmi_injection; | 98 | __u8 padding2[2]; |
101 | __u8 padding2; | ||
102 | 99 | ||
103 | /* in (pre_kvm_run), out (post_kvm_run) */ | 100 | /* in (pre_kvm_run), out (post_kvm_run) */ |
104 | __u64 cr8; | 101 | __u64 cr8; |
@@ -391,12 +388,14 @@ struct kvm_trace_rec { | |||
391 | #define KVM_CAP_DEVICE_ASSIGNMENT 17 | 388 | #define KVM_CAP_DEVICE_ASSIGNMENT 17 |
392 | #endif | 389 | #endif |
393 | #define KVM_CAP_IOMMU 18 | 390 | #define KVM_CAP_IOMMU 18 |
394 | #define KVM_CAP_NMI 19 | ||
395 | #if defined(CONFIG_X86) | 391 | #if defined(CONFIG_X86) |
396 | #define KVM_CAP_DEVICE_MSI 20 | 392 | #define KVM_CAP_DEVICE_MSI 20 |
397 | #endif | 393 | #endif |
398 | /* Bug in KVM_SET_USER_MEMORY_REGION fixed: */ | 394 | /* Bug in KVM_SET_USER_MEMORY_REGION fixed: */ |
399 | #define KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21 | 395 | #define KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21 |
396 | #if defined(CONFIG_X86) | ||
397 | #define KVM_CAP_USER_NMI 22 | ||
398 | #endif | ||
400 | 399 | ||
401 | /* | 400 | /* |
402 | * ioctls for VM fds | 401 | * ioctls for VM fds |