diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-07 14:35:30 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-07 14:35:30 -0400 |
| commit | 66bb0aa077978dbb76e6283531eb3cc7a878de38 (patch) | |
| tree | 62a28a96cb43df2d8f7c6eb14d4676a1e2ce3887 /include | |
| parent | e306e3be1cbe5b11d0f8a53a557c205cf27e4979 (diff) | |
| parent | c77dcacb397519b6ade8f08201a4a90a7f4f751e (diff) | |
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull second round of KVM changes from Paolo Bonzini:
"Here are the PPC and ARM changes for KVM, which I separated because
they had small conflicts (respectively within KVM documentation, and
with 3.16-rc changes). Since they were all within the subsystem, I
took care of them.
Stephen Rothwell reported some snags in PPC builds, but they are all
fixed now; the latest linux-next report was clean.
New features for ARM include:
- KVM VGIC v2 emulation on GICv3 hardware
- Big-Endian support for arm/arm64 (guest and host)
- Debug Architecture support for arm64 (arm32 is on Christoffer's todo list)
And for PPC:
- Book3S: Good number of LE host fixes, enable HV on LE
- Book3S HV: Add in-guest debug support
This release drops support for KVM on the PPC440. As a result, the
PPC merge removes more lines than it adds. :)
I also included an x86 change, since Davidlohr tied it to an
independent bug report and the reporter quickly provided a Tested-by;
there was no reason to wait for -rc2"
* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (122 commits)
KVM: Move more code under CONFIG_HAVE_KVM_IRQFD
KVM: nVMX: fix "acknowledge interrupt on exit" when APICv is in use
KVM: nVMX: Fix nested vmexit ack intr before load vmcs01
KVM: PPC: Enable IRQFD support for the XICS interrupt controller
KVM: Give IRQFD its own separate enabling Kconfig option
KVM: Move irq notifier implementation into eventfd.c
KVM: Move all accesses to kvm::irq_routing into irqchip.c
KVM: irqchip: Provide and use accessors for irq routing table
KVM: Don't keep reference to irq routing table in irqfd struct
KVM: PPC: drop duplicate tracepoint
arm64: KVM: fix 64bit CP15 VM access for 32bit guests
KVM: arm64: GICv3: mandate page-aligned GICV region
arm64: KVM: GICv3: move system register access to msr_s/mrs_s
KVM: PPC: PR: Handle FSCR feature deselects
KVM: PPC: HV: Remove generic instruction emulation
KVM: PPC: BOOKEHV: rename e500hv_spr to bookehv_spr
KVM: PPC: Remove DCR handling
KVM: PPC: Expose helper functions for data/inst faults
KVM: PPC: Separate loadstore emulation from priv emulation
KVM: PPC: Handle magic page in kvmppc_ld/st
...
Diffstat (limited to 'include')
| -rw-r--r-- | include/kvm/arm_arch_timer.h | 14 | ||||
| -rw-r--r-- | include/kvm/arm_vgic.h | 115 | ||||
| -rw-r--r-- | include/linux/kvm_host.h | 47 | ||||
| -rw-r--r-- | include/trace/events/kvm.h | 8 | ||||
| -rw-r--r-- | include/uapi/linux/kvm.h | 6 |
5 files changed, 142 insertions, 48 deletions
diff --git a/include/kvm/arm_arch_timer.h b/include/kvm/arm_arch_timer.h index 6d9aeddc09bf..ad9db6045b2f 100644 --- a/include/kvm/arm_arch_timer.h +++ b/include/kvm/arm_arch_timer.h | |||
| @@ -67,6 +67,10 @@ void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu); | |||
| 67 | void kvm_timer_flush_hwstate(struct kvm_vcpu *vcpu); | 67 | void kvm_timer_flush_hwstate(struct kvm_vcpu *vcpu); |
| 68 | void kvm_timer_sync_hwstate(struct kvm_vcpu *vcpu); | 68 | void kvm_timer_sync_hwstate(struct kvm_vcpu *vcpu); |
| 69 | void kvm_timer_vcpu_terminate(struct kvm_vcpu *vcpu); | 69 | void kvm_timer_vcpu_terminate(struct kvm_vcpu *vcpu); |
| 70 | |||
| 71 | u64 kvm_arm_timer_get_reg(struct kvm_vcpu *, u64 regid); | ||
| 72 | int kvm_arm_timer_set_reg(struct kvm_vcpu *, u64 regid, u64 value); | ||
| 73 | |||
| 70 | #else | 74 | #else |
| 71 | static inline int kvm_timer_hyp_init(void) | 75 | static inline int kvm_timer_hyp_init(void) |
| 72 | { | 76 | { |
| @@ -84,6 +88,16 @@ static inline void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu) {} | |||
| 84 | static inline void kvm_timer_flush_hwstate(struct kvm_vcpu *vcpu) {} | 88 | static inline void kvm_timer_flush_hwstate(struct kvm_vcpu *vcpu) {} |
| 85 | static inline void kvm_timer_sync_hwstate(struct kvm_vcpu *vcpu) {} | 89 | static inline void kvm_timer_sync_hwstate(struct kvm_vcpu *vcpu) {} |
| 86 | static inline void kvm_timer_vcpu_terminate(struct kvm_vcpu *vcpu) {} | 90 | static inline void kvm_timer_vcpu_terminate(struct kvm_vcpu *vcpu) {} |
| 91 | |||
| 92 | static inline int kvm_arm_timer_set_reg(struct kvm_vcpu *vcpu, u64 regid, u64 value) | ||
| 93 | { | ||
| 94 | return 0; | ||
| 95 | } | ||
| 96 | |||
| 97 | static inline u64 kvm_arm_timer_get_reg(struct kvm_vcpu *vcpu, u64 regid) | ||
| 98 | { | ||
| 99 | return 0; | ||
| 100 | } | ||
| 87 | #endif | 101 | #endif |
| 88 | 102 | ||
| 89 | #endif | 103 | #endif |
diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h index f27000f55a83..35b0c121bb65 100644 --- a/include/kvm/arm_vgic.h +++ b/include/kvm/arm_vgic.h | |||
| @@ -24,7 +24,6 @@ | |||
| 24 | #include <linux/irqreturn.h> | 24 | #include <linux/irqreturn.h> |
| 25 | #include <linux/spinlock.h> | 25 | #include <linux/spinlock.h> |
| 26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
| 27 | #include <linux/irqchip/arm-gic.h> | ||
| 28 | 27 | ||
| 29 | #define VGIC_NR_IRQS 256 | 28 | #define VGIC_NR_IRQS 256 |
| 30 | #define VGIC_NR_SGIS 16 | 29 | #define VGIC_NR_SGIS 16 |
| @@ -32,7 +31,9 @@ | |||
| 32 | #define VGIC_NR_PRIVATE_IRQS (VGIC_NR_SGIS + VGIC_NR_PPIS) | 31 | #define VGIC_NR_PRIVATE_IRQS (VGIC_NR_SGIS + VGIC_NR_PPIS) |
| 33 | #define VGIC_NR_SHARED_IRQS (VGIC_NR_IRQS - VGIC_NR_PRIVATE_IRQS) | 32 | #define VGIC_NR_SHARED_IRQS (VGIC_NR_IRQS - VGIC_NR_PRIVATE_IRQS) |
| 34 | #define VGIC_MAX_CPUS KVM_MAX_VCPUS | 33 | #define VGIC_MAX_CPUS KVM_MAX_VCPUS |
| 35 | #define VGIC_MAX_LRS (1 << 6) | 34 | |
| 35 | #define VGIC_V2_MAX_LRS (1 << 6) | ||
| 36 | #define VGIC_V3_MAX_LRS 16 | ||
| 36 | 37 | ||
| 37 | /* Sanity checks... */ | 38 | /* Sanity checks... */ |
| 38 | #if (VGIC_MAX_CPUS > 8) | 39 | #if (VGIC_MAX_CPUS > 8) |
| @@ -68,9 +69,62 @@ struct vgic_bytemap { | |||
| 68 | u32 shared[VGIC_NR_SHARED_IRQS / 4]; | 69 | u32 shared[VGIC_NR_SHARED_IRQS / 4]; |
| 69 | }; | 70 | }; |
| 70 | 71 | ||
| 72 | struct kvm_vcpu; | ||
| 73 | |||
| 74 | enum vgic_type { | ||
| 75 | VGIC_V2, /* Good ol' GICv2 */ | ||
| 76 | VGIC_V3, /* New fancy GICv3 */ | ||
| 77 | }; | ||
| 78 | |||
| 79 | #define LR_STATE_PENDING (1 << 0) | ||
| 80 | #define LR_STATE_ACTIVE (1 << 1) | ||
| 81 | #define LR_STATE_MASK (3 << 0) | ||
| 82 | #define LR_EOI_INT (1 << 2) | ||
| 83 | |||
| 84 | struct vgic_lr { | ||
| 85 | u16 irq; | ||
| 86 | u8 source; | ||
| 87 | u8 state; | ||
| 88 | }; | ||
| 89 | |||
| 90 | struct vgic_vmcr { | ||
| 91 | u32 ctlr; | ||
| 92 | u32 abpr; | ||
| 93 | u32 bpr; | ||
| 94 | u32 pmr; | ||
| 95 | }; | ||
| 96 | |||
| 97 | struct vgic_ops { | ||
| 98 | struct vgic_lr (*get_lr)(const struct kvm_vcpu *, int); | ||
| 99 | void (*set_lr)(struct kvm_vcpu *, int, struct vgic_lr); | ||
| 100 | void (*sync_lr_elrsr)(struct kvm_vcpu *, int, struct vgic_lr); | ||
| 101 | u64 (*get_elrsr)(const struct kvm_vcpu *vcpu); | ||
| 102 | u64 (*get_eisr)(const struct kvm_vcpu *vcpu); | ||
| 103 | u32 (*get_interrupt_status)(const struct kvm_vcpu *vcpu); | ||
| 104 | void (*enable_underflow)(struct kvm_vcpu *vcpu); | ||
| 105 | void (*disable_underflow)(struct kvm_vcpu *vcpu); | ||
| 106 | void (*get_vmcr)(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr); | ||
| 107 | void (*set_vmcr)(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr); | ||
| 108 | void (*enable)(struct kvm_vcpu *vcpu); | ||
| 109 | }; | ||
| 110 | |||
| 111 | struct vgic_params { | ||
| 112 | /* vgic type */ | ||
| 113 | enum vgic_type type; | ||
| 114 | /* Physical address of vgic virtual cpu interface */ | ||
| 115 | phys_addr_t vcpu_base; | ||
| 116 | /* Number of list registers */ | ||
| 117 | u32 nr_lr; | ||
| 118 | /* Interrupt number */ | ||
| 119 | unsigned int maint_irq; | ||
| 120 | /* Virtual control interface base address */ | ||
| 121 | void __iomem *vctrl_base; | ||
| 122 | }; | ||
| 123 | |||
| 71 | struct vgic_dist { | 124 | struct vgic_dist { |
| 72 | #ifdef CONFIG_KVM_ARM_VGIC | 125 | #ifdef CONFIG_KVM_ARM_VGIC |
| 73 | spinlock_t lock; | 126 | spinlock_t lock; |
| 127 | bool in_kernel; | ||
| 74 | bool ready; | 128 | bool ready; |
| 75 | 129 | ||
| 76 | /* Virtual control interface mapping */ | 130 | /* Virtual control interface mapping */ |
| @@ -110,6 +164,29 @@ struct vgic_dist { | |||
| 110 | #endif | 164 | #endif |
| 111 | }; | 165 | }; |
| 112 | 166 | ||
| 167 | struct vgic_v2_cpu_if { | ||
| 168 | u32 vgic_hcr; | ||
| 169 | u32 vgic_vmcr; | ||
| 170 | u32 vgic_misr; /* Saved only */ | ||
| 171 | u32 vgic_eisr[2]; /* Saved only */ | ||
| 172 | u32 vgic_elrsr[2]; /* Saved only */ | ||
| 173 | u32 vgic_apr; | ||
| 174 | u32 vgic_lr[VGIC_V2_MAX_LRS]; | ||
| 175 | }; | ||
| 176 | |||
| 177 | struct vgic_v3_cpu_if { | ||
| 178 | #ifdef CONFIG_ARM_GIC_V3 | ||
| 179 | u32 vgic_hcr; | ||
| 180 | u32 vgic_vmcr; | ||
| 181 | u32 vgic_misr; /* Saved only */ | ||
| 182 | u32 vgic_eisr; /* Saved only */ | ||
| 183 | u32 vgic_elrsr; /* Saved only */ | ||
| 184 | u32 vgic_ap0r[4]; | ||
| 185 | u32 vgic_ap1r[4]; | ||
| 186 | u64 vgic_lr[VGIC_V3_MAX_LRS]; | ||
| 187 | #endif | ||
| 188 | }; | ||
| 189 | |||
| 113 | struct vgic_cpu { | 190 | struct vgic_cpu { |
| 114 | #ifdef CONFIG_KVM_ARM_VGIC | 191 | #ifdef CONFIG_KVM_ARM_VGIC |
| 115 | /* per IRQ to LR mapping */ | 192 | /* per IRQ to LR mapping */ |
| @@ -120,24 +197,24 @@ struct vgic_cpu { | |||
| 120 | DECLARE_BITMAP( pending_shared, VGIC_NR_SHARED_IRQS); | 197 | DECLARE_BITMAP( pending_shared, VGIC_NR_SHARED_IRQS); |
| 121 | 198 | ||
| 122 | /* Bitmap of used/free list registers */ | 199 | /* Bitmap of used/free list registers */ |
| 123 | DECLARE_BITMAP( lr_used, VGIC_MAX_LRS); | 200 | DECLARE_BITMAP( lr_used, VGIC_V2_MAX_LRS); |
| 124 | 201 | ||
| 125 | /* Number of list registers on this CPU */ | 202 | /* Number of list registers on this CPU */ |
| 126 | int nr_lr; | 203 | int nr_lr; |
| 127 | 204 | ||
| 128 | /* CPU vif control registers for world switch */ | 205 | /* CPU vif control registers for world switch */ |
| 129 | u32 vgic_hcr; | 206 | union { |
| 130 | u32 vgic_vmcr; | 207 | struct vgic_v2_cpu_if vgic_v2; |
| 131 | u32 vgic_misr; /* Saved only */ | 208 | struct vgic_v3_cpu_if vgic_v3; |
| 132 | u32 vgic_eisr[2]; /* Saved only */ | 209 | }; |
| 133 | u32 vgic_elrsr[2]; /* Saved only */ | ||
| 134 | u32 vgic_apr; | ||
| 135 | u32 vgic_lr[VGIC_MAX_LRS]; | ||
| 136 | #endif | 210 | #endif |
| 137 | }; | 211 | }; |
| 138 | 212 | ||
| 139 | #define LR_EMPTY 0xff | 213 | #define LR_EMPTY 0xff |
| 140 | 214 | ||
| 215 | #define INT_STATUS_EOI (1 << 0) | ||
| 216 | #define INT_STATUS_UNDERFLOW (1 << 1) | ||
| 217 | |||
| 141 | struct kvm; | 218 | struct kvm; |
| 142 | struct kvm_vcpu; | 219 | struct kvm_vcpu; |
| 143 | struct kvm_run; | 220 | struct kvm_run; |
| @@ -157,9 +234,25 @@ int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu); | |||
| 157 | bool vgic_handle_mmio(struct kvm_vcpu *vcpu, struct kvm_run *run, | 234 | bool vgic_handle_mmio(struct kvm_vcpu *vcpu, struct kvm_run *run, |
| 158 | struct kvm_exit_mmio *mmio); | 235 | struct kvm_exit_mmio *mmio); |
| 159 | 236 | ||
| 160 | #define irqchip_in_kernel(k) (!!((k)->arch.vgic.vctrl_base)) | 237 | #define irqchip_in_kernel(k) (!!((k)->arch.vgic.in_kernel)) |
| 161 | #define vgic_initialized(k) ((k)->arch.vgic.ready) | 238 | #define vgic_initialized(k) ((k)->arch.vgic.ready) |
| 162 | 239 | ||
| 240 | int vgic_v2_probe(struct device_node *vgic_node, | ||
| 241 | const struct vgic_ops **ops, | ||
| 242 | const struct vgic_params **params); | ||
| 243 | #ifdef CONFIG_ARM_GIC_V3 | ||
| 244 | int vgic_v3_probe(struct device_node *vgic_node, | ||
| 245 | const struct vgic_ops **ops, | ||
| 246 | const struct vgic_params **params); | ||
| 247 | #else | ||
| 248 | static inline int vgic_v3_probe(struct device_node *vgic_node, | ||
| 249 | const struct vgic_ops **ops, | ||
| 250 | const struct vgic_params **params) | ||
| 251 | { | ||
| 252 | return -ENODEV; | ||
| 253 | } | ||
| 254 | #endif | ||
| 255 | |||
| 163 | #else | 256 | #else |
| 164 | static inline int kvm_vgic_hyp_init(void) | 257 | static inline int kvm_vgic_hyp_init(void) |
| 165 | { | 258 | { |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index ec4e3bd83d47..a4c33b34fe3f 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
| @@ -325,24 +325,7 @@ struct kvm_kernel_irq_routing_entry { | |||
| 325 | struct hlist_node link; | 325 | struct hlist_node link; |
| 326 | }; | 326 | }; |
| 327 | 327 | ||
| 328 | #ifdef CONFIG_HAVE_KVM_IRQ_ROUTING | 328 | struct kvm_irq_routing_table; |
| 329 | |||
| 330 | struct kvm_irq_routing_table { | ||
| 331 | int chip[KVM_NR_IRQCHIPS][KVM_IRQCHIP_NUM_PINS]; | ||
| 332 | struct kvm_kernel_irq_routing_entry *rt_entries; | ||
| 333 | u32 nr_rt_entries; | ||
| 334 | /* | ||
| 335 | * Array indexed by gsi. Each entry contains list of irq chips | ||
| 336 | * the gsi is connected to. | ||
| 337 | */ | ||
| 338 | struct hlist_head map[0]; | ||
| 339 | }; | ||
| 340 | |||
| 341 | #else | ||
| 342 | |||
| 343 | struct kvm_irq_routing_table {}; | ||
| 344 | |||
| 345 | #endif | ||
| 346 | 329 | ||
| 347 | #ifndef KVM_PRIVATE_MEM_SLOTS | 330 | #ifndef KVM_PRIVATE_MEM_SLOTS |
| 348 | #define KVM_PRIVATE_MEM_SLOTS 0 | 331 | #define KVM_PRIVATE_MEM_SLOTS 0 |
| @@ -401,11 +384,12 @@ struct kvm { | |||
| 401 | struct mutex irq_lock; | 384 | struct mutex irq_lock; |
| 402 | #ifdef CONFIG_HAVE_KVM_IRQCHIP | 385 | #ifdef CONFIG_HAVE_KVM_IRQCHIP |
| 403 | /* | 386 | /* |
| 404 | * Update side is protected by irq_lock and, | 387 | * Update side is protected by irq_lock. |
| 405 | * if configured, irqfds.lock. | ||
| 406 | */ | 388 | */ |
| 407 | struct kvm_irq_routing_table __rcu *irq_routing; | 389 | struct kvm_irq_routing_table __rcu *irq_routing; |
| 408 | struct hlist_head mask_notifier_list; | 390 | struct hlist_head mask_notifier_list; |
| 391 | #endif | ||
| 392 | #ifdef CONFIG_HAVE_KVM_IRQFD | ||
| 409 | struct hlist_head irq_ack_notifier_list; | 393 | struct hlist_head irq_ack_notifier_list; |
| 410 | #endif | 394 | #endif |
| 411 | 395 | ||
| @@ -455,7 +439,7 @@ void kvm_vcpu_uninit(struct kvm_vcpu *vcpu); | |||
| 455 | int __must_check vcpu_load(struct kvm_vcpu *vcpu); | 439 | int __must_check vcpu_load(struct kvm_vcpu *vcpu); |
| 456 | void vcpu_put(struct kvm_vcpu *vcpu); | 440 | void vcpu_put(struct kvm_vcpu *vcpu); |
| 457 | 441 | ||
| 458 | #ifdef CONFIG_HAVE_KVM_IRQ_ROUTING | 442 | #ifdef CONFIG_HAVE_KVM_IRQFD |
| 459 | int kvm_irqfd_init(void); | 443 | int kvm_irqfd_init(void); |
| 460 | void kvm_irqfd_exit(void); | 444 | void kvm_irqfd_exit(void); |
| 461 | #else | 445 | #else |
| @@ -602,7 +586,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, | |||
| 602 | unsigned int ioctl, unsigned long arg); | 586 | unsigned int ioctl, unsigned long arg); |
| 603 | int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf); | 587 | int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf); |
| 604 | 588 | ||
| 605 | int kvm_dev_ioctl_check_extension(long ext); | 589 | int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext); |
| 606 | 590 | ||
| 607 | int kvm_get_dirty_log(struct kvm *kvm, | 591 | int kvm_get_dirty_log(struct kvm *kvm, |
| 608 | struct kvm_dirty_log *log, int *is_dirty); | 592 | struct kvm_dirty_log *log, int *is_dirty); |
| @@ -752,6 +736,10 @@ void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, | |||
| 752 | void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin, | 736 | void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin, |
| 753 | bool mask); | 737 | bool mask); |
| 754 | 738 | ||
| 739 | int kvm_irq_map_gsi(struct kvm *kvm, | ||
| 740 | struct kvm_kernel_irq_routing_entry *entries, int gsi); | ||
| 741 | int kvm_irq_map_chip_pin(struct kvm *kvm, unsigned irqchip, unsigned pin); | ||
| 742 | |||
| 755 | int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level, | 743 | int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level, |
| 756 | bool line_status); | 744 | bool line_status); |
| 757 | int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level); | 745 | int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level); |
| @@ -942,28 +930,27 @@ int kvm_set_irq_routing(struct kvm *kvm, | |||
| 942 | const struct kvm_irq_routing_entry *entries, | 930 | const struct kvm_irq_routing_entry *entries, |
| 943 | unsigned nr, | 931 | unsigned nr, |
| 944 | unsigned flags); | 932 | unsigned flags); |
| 945 | int kvm_set_routing_entry(struct kvm_irq_routing_table *rt, | 933 | int kvm_set_routing_entry(struct kvm_kernel_irq_routing_entry *e, |
| 946 | struct kvm_kernel_irq_routing_entry *e, | ||
| 947 | const struct kvm_irq_routing_entry *ue); | 934 | const struct kvm_irq_routing_entry *ue); |
| 948 | void kvm_free_irq_routing(struct kvm *kvm); | 935 | void kvm_free_irq_routing(struct kvm *kvm); |
| 949 | 936 | ||
| 950 | int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi); | ||
| 951 | |||
| 952 | #else | 937 | #else |
| 953 | 938 | ||
| 954 | static inline void kvm_free_irq_routing(struct kvm *kvm) {} | 939 | static inline void kvm_free_irq_routing(struct kvm *kvm) {} |
| 955 | 940 | ||
| 956 | #endif | 941 | #endif |
| 957 | 942 | ||
| 943 | int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi); | ||
| 944 | |||
| 958 | #ifdef CONFIG_HAVE_KVM_EVENTFD | 945 | #ifdef CONFIG_HAVE_KVM_EVENTFD |
| 959 | 946 | ||
| 960 | void kvm_eventfd_init(struct kvm *kvm); | 947 | void kvm_eventfd_init(struct kvm *kvm); |
| 961 | int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args); | 948 | int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args); |
| 962 | 949 | ||
| 963 | #ifdef CONFIG_HAVE_KVM_IRQCHIP | 950 | #ifdef CONFIG_HAVE_KVM_IRQFD |
| 964 | int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args); | 951 | int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args); |
| 965 | void kvm_irqfd_release(struct kvm *kvm); | 952 | void kvm_irqfd_release(struct kvm *kvm); |
| 966 | void kvm_irq_routing_update(struct kvm *, struct kvm_irq_routing_table *); | 953 | void kvm_irq_routing_update(struct kvm *); |
| 967 | #else | 954 | #else |
| 968 | static inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args) | 955 | static inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args) |
| 969 | { | 956 | { |
| @@ -985,10 +972,8 @@ static inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args) | |||
| 985 | static inline void kvm_irqfd_release(struct kvm *kvm) {} | 972 | static inline void kvm_irqfd_release(struct kvm *kvm) {} |
| 986 | 973 | ||
| 987 | #ifdef CONFIG_HAVE_KVM_IRQCHIP | 974 | #ifdef CONFIG_HAVE_KVM_IRQCHIP |
| 988 | static inline void kvm_irq_routing_update(struct kvm *kvm, | 975 | static inline void kvm_irq_routing_update(struct kvm *kvm) |
| 989 | struct kvm_irq_routing_table *irq_rt) | ||
| 990 | { | 976 | { |
| 991 | rcu_assign_pointer(kvm->irq_routing, irq_rt); | ||
| 992 | } | 977 | } |
| 993 | #endif | 978 | #endif |
| 994 | 979 | ||
diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index 131a0bda7aec..908925ace776 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h | |||
| @@ -37,7 +37,7 @@ TRACE_EVENT(kvm_userspace_exit, | |||
| 37 | __entry->errno < 0 ? -__entry->errno : __entry->reason) | 37 | __entry->errno < 0 ? -__entry->errno : __entry->reason) |
| 38 | ); | 38 | ); |
| 39 | 39 | ||
| 40 | #if defined(CONFIG_HAVE_KVM_IRQCHIP) | 40 | #if defined(CONFIG_HAVE_KVM_IRQFD) |
| 41 | TRACE_EVENT(kvm_set_irq, | 41 | TRACE_EVENT(kvm_set_irq, |
| 42 | TP_PROTO(unsigned int gsi, int level, int irq_source_id), | 42 | TP_PROTO(unsigned int gsi, int level, int irq_source_id), |
| 43 | TP_ARGS(gsi, level, irq_source_id), | 43 | TP_ARGS(gsi, level, irq_source_id), |
| @@ -57,7 +57,7 @@ TRACE_EVENT(kvm_set_irq, | |||
| 57 | TP_printk("gsi %u level %d source %d", | 57 | TP_printk("gsi %u level %d source %d", |
| 58 | __entry->gsi, __entry->level, __entry->irq_source_id) | 58 | __entry->gsi, __entry->level, __entry->irq_source_id) |
| 59 | ); | 59 | ); |
| 60 | #endif | 60 | #endif /* defined(CONFIG_HAVE_KVM_IRQFD) */ |
| 61 | 61 | ||
| 62 | #if defined(__KVM_HAVE_IOAPIC) | 62 | #if defined(__KVM_HAVE_IOAPIC) |
| 63 | #define kvm_deliver_mode \ | 63 | #define kvm_deliver_mode \ |
| @@ -124,7 +124,7 @@ TRACE_EVENT(kvm_msi_set_irq, | |||
| 124 | 124 | ||
| 125 | #endif /* defined(__KVM_HAVE_IOAPIC) */ | 125 | #endif /* defined(__KVM_HAVE_IOAPIC) */ |
| 126 | 126 | ||
| 127 | #if defined(CONFIG_HAVE_KVM_IRQCHIP) | 127 | #if defined(CONFIG_HAVE_KVM_IRQFD) |
| 128 | 128 | ||
| 129 | TRACE_EVENT(kvm_ack_irq, | 129 | TRACE_EVENT(kvm_ack_irq, |
| 130 | TP_PROTO(unsigned int irqchip, unsigned int pin), | 130 | TP_PROTO(unsigned int irqchip, unsigned int pin), |
| @@ -149,7 +149,7 @@ TRACE_EVENT(kvm_ack_irq, | |||
| 149 | #endif | 149 | #endif |
| 150 | ); | 150 | ); |
| 151 | 151 | ||
| 152 | #endif /* defined(CONFIG_HAVE_KVM_IRQCHIP) */ | 152 | #endif /* defined(CONFIG_HAVE_KVM_IRQFD) */ |
| 153 | 153 | ||
| 154 | 154 | ||
| 155 | 155 | ||
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 9b744af871d7..cf3a2ff440e4 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h | |||
| @@ -162,7 +162,7 @@ struct kvm_pit_config { | |||
| 162 | #define KVM_EXIT_TPR_ACCESS 12 | 162 | #define KVM_EXIT_TPR_ACCESS 12 |
| 163 | #define KVM_EXIT_S390_SIEIC 13 | 163 | #define KVM_EXIT_S390_SIEIC 13 |
| 164 | #define KVM_EXIT_S390_RESET 14 | 164 | #define KVM_EXIT_S390_RESET 14 |
| 165 | #define KVM_EXIT_DCR 15 | 165 | #define KVM_EXIT_DCR 15 /* deprecated */ |
| 166 | #define KVM_EXIT_NMI 16 | 166 | #define KVM_EXIT_NMI 16 |
| 167 | #define KVM_EXIT_INTERNAL_ERROR 17 | 167 | #define KVM_EXIT_INTERNAL_ERROR 17 |
| 168 | #define KVM_EXIT_OSI 18 | 168 | #define KVM_EXIT_OSI 18 |
| @@ -268,7 +268,7 @@ struct kvm_run { | |||
| 268 | __u64 trans_exc_code; | 268 | __u64 trans_exc_code; |
| 269 | __u32 pgm_code; | 269 | __u32 pgm_code; |
| 270 | } s390_ucontrol; | 270 | } s390_ucontrol; |
| 271 | /* KVM_EXIT_DCR */ | 271 | /* KVM_EXIT_DCR (deprecated) */ |
| 272 | struct { | 272 | struct { |
| 273 | __u32 dcrn; | 273 | __u32 dcrn; |
| 274 | __u32 data; | 274 | __u32 data; |
| @@ -763,6 +763,8 @@ struct kvm_ppc_smmu_info { | |||
| 763 | #define KVM_CAP_VM_ATTRIBUTES 101 | 763 | #define KVM_CAP_VM_ATTRIBUTES 101 |
| 764 | #define KVM_CAP_ARM_PSCI_0_2 102 | 764 | #define KVM_CAP_ARM_PSCI_0_2 102 |
| 765 | #define KVM_CAP_PPC_FIXUP_HCALL 103 | 765 | #define KVM_CAP_PPC_FIXUP_HCALL 103 |
| 766 | #define KVM_CAP_PPC_ENABLE_HCALL 104 | ||
| 767 | #define KVM_CAP_CHECK_EXTENSION_VM 105 | ||
| 766 | 768 | ||
| 767 | #ifdef KVM_CAP_IRQ_ROUTING | 769 | #ifdef KVM_CAP_IRQ_ROUTING |
| 768 | 770 | ||
