4 * Copyright (C) 2006-2008 Qumranet Technologies
6 * Licensed under the terms of the GNU GPL version 2 or higher.
9 #include "config-host.h"
15 #include "qemu-common.h"
25 #define EXPECTED_KVM_API_VERSION 12
27 #if EXPECTED_KVM_API_VERSION != KVM_API_VERSION
28 #error libkvm: userspace and kernel version mismatch
31 #define ALIGN(x, y) (((x)+(y)-1) & ~((y)-1))
33 static inline void clear_gsi(KVMState
*s
, unsigned int gsi
)
35 uint32_t *bitmap
= s
->used_gsi_bitmap
;
37 if (gsi
< s
->max_gsi
) {
38 bitmap
[gsi
/ 32] &= ~(1U << (gsi
% 32));
40 DPRINTF("Invalid GSI %u\n", gsi
);
44 #ifdef KVM_CAP_DEVICE_ASSIGNMENT
45 int kvm_assign_pci_device(KVMState
*s
,
46 struct kvm_assigned_pci_dev
*assigned_dev
)
48 return kvm_vm_ioctl(s
, KVM_ASSIGN_PCI_DEVICE
, assigned_dev
);
51 static int kvm_old_assign_irq(KVMState
*s
,
52 struct kvm_assigned_irq
*assigned_irq
)
54 return kvm_vm_ioctl(s
, KVM_ASSIGN_IRQ
, assigned_irq
);
57 int kvm_device_intx_set_mask(KVMState
*s
, uint32_t dev_id
, bool masked
)
59 struct kvm_assigned_pci_dev assigned_dev
;
61 assigned_dev
.assigned_dev_id
= dev_id
;
62 assigned_dev
.flags
= masked
? KVM_DEV_ASSIGN_MASK_INTX
: 0;
63 return kvm_vm_ioctl(s
, KVM_ASSIGN_SET_INTX_MASK
, &assigned_dev
);
66 #ifdef KVM_CAP_ASSIGN_DEV_IRQ
67 int kvm_assign_irq(KVMState
*s
, struct kvm_assigned_irq
*assigned_irq
)
71 ret
= kvm_ioctl(s
, KVM_CHECK_EXTENSION
, KVM_CAP_ASSIGN_DEV_IRQ
);
73 return kvm_vm_ioctl(s
, KVM_ASSIGN_DEV_IRQ
, assigned_irq
);
76 return kvm_old_assign_irq(s
, assigned_irq
);
79 int kvm_deassign_irq(KVMState
*s
, struct kvm_assigned_irq
*assigned_irq
)
81 return kvm_vm_ioctl(s
, KVM_DEASSIGN_DEV_IRQ
, assigned_irq
);
84 int kvm_assign_irq(KVMState
*s
, struct kvm_assigned_irq
*assigned_irq
)
86 return kvm_old_assign_irq(s
, assigned_irq
);
91 #ifdef KVM_CAP_DEVICE_DEASSIGNMENT
92 int kvm_deassign_pci_device(KVMState
*s
,
93 struct kvm_assigned_pci_dev
*assigned_dev
)
95 return kvm_vm_ioctl(s
, KVM_DEASSIGN_PCI_DEVICE
, assigned_dev
);
99 int kvm_clear_gsi_routes(void)
101 #ifdef KVM_CAP_IRQ_ROUTING
102 kvm_state
->irq_routes
->nr
= 0;
109 int kvm_del_routing_entry(struct kvm_irq_routing_entry
*entry
)
111 #ifdef KVM_CAP_IRQ_ROUTING
112 KVMState
*s
= kvm_state
;
113 struct kvm_irq_routing_entry
*e
, *p
;
114 int i
, gsi
, found
= 0;
118 for (i
= 0; i
< s
->irq_routes
->nr
; ++i
) {
119 e
= &s
->irq_routes
->entries
[i
];
120 if (e
->type
== entry
->type
&& e
->gsi
== gsi
) {
122 case KVM_IRQ_ROUTING_IRQCHIP
:{
123 if (e
->u
.irqchip
.irqchip
==
124 entry
->u
.irqchip
.irqchip
125 && e
->u
.irqchip
.pin
== entry
->u
.irqchip
.pin
) {
126 p
= &s
->irq_routes
->entries
[--s
->irq_routes
->nr
];
132 case KVM_IRQ_ROUTING_MSI
:{
133 if (e
->u
.msi
.address_lo
==
134 entry
->u
.msi
.address_lo
135 && e
->u
.msi
.address_hi
==
136 entry
->u
.msi
.address_hi
137 && e
->u
.msi
.data
== entry
->u
.msi
.data
) {
138 p
= &s
->irq_routes
->entries
[--s
->irq_routes
->nr
];
148 /* If there are no other users of this GSI
149 * mark it available in the bitmap */
150 for (i
= 0; i
< s
->irq_routes
->nr
; i
++) {
151 e
= &s
->irq_routes
->entries
[i
];
155 if (i
== s
->irq_routes
->nr
) {
169 int kvm_update_routing_entry(struct kvm_irq_routing_entry
*entry
,
170 struct kvm_irq_routing_entry
*newentry
)
172 #ifdef KVM_CAP_IRQ_ROUTING
173 KVMState
*s
= kvm_state
;
174 struct kvm_irq_routing_entry
*e
;
177 if (entry
->gsi
!= newentry
->gsi
|| entry
->type
!= newentry
->type
) {
181 for (i
= 0; i
< s
->irq_routes
->nr
; ++i
) {
182 e
= &s
->irq_routes
->entries
[i
];
183 if (e
->type
!= entry
->type
|| e
->gsi
!= entry
->gsi
) {
187 case KVM_IRQ_ROUTING_IRQCHIP
:
188 if (e
->u
.irqchip
.irqchip
== entry
->u
.irqchip
.irqchip
&&
189 e
->u
.irqchip
.pin
== entry
->u
.irqchip
.pin
) {
190 memcpy(&e
->u
.irqchip
, &newentry
->u
.irqchip
,
191 sizeof e
->u
.irqchip
);
195 case KVM_IRQ_ROUTING_MSI
:
196 if (e
->u
.msi
.address_lo
== entry
->u
.msi
.address_lo
&&
197 e
->u
.msi
.address_hi
== entry
->u
.msi
.address_hi
&&
198 e
->u
.msi
.data
== entry
->u
.msi
.data
) {
199 memcpy(&e
->u
.msi
, &newentry
->u
.msi
, sizeof e
->u
.msi
);
213 int kvm_del_irq_route(int gsi
, int irqchip
, int pin
)
215 #ifdef KVM_CAP_IRQ_ROUTING
216 struct kvm_irq_routing_entry e
;
219 e
.type
= KVM_IRQ_ROUTING_IRQCHIP
;
221 e
.u
.irqchip
.irqchip
= irqchip
;
222 e
.u
.irqchip
.pin
= pin
;
223 return kvm_del_routing_entry(&e
);
229 int kvm_get_irq_route_gsi(void)
231 KVMState
*s
= kvm_state
;
233 uint32_t *buf
= s
->used_gsi_bitmap
;
235 /* Return the lowest unused GSI in the bitmap */
236 for (i
= 0; i
< s
->max_gsi
/ 32; i
++) {
242 return bit
- 1 + i
* 32;
248 static void kvm_msi_routing_entry(struct kvm_irq_routing_entry
*e
,
253 e
->type
= KVM_IRQ_ROUTING_MSI
;
255 e
->u
.msi
.address_lo
= msg
->addr_lo
;
256 e
->u
.msi
.address_hi
= msg
->addr_hi
;
257 e
->u
.msi
.data
= msg
->data
;
260 int kvm_msi_message_add(KVMMsiMessage
*msg
)
262 struct kvm_irq_routing_entry e
;
265 ret
= kvm_get_irq_route_gsi();
271 kvm_msi_routing_entry(&e
, msg
);
272 kvm_add_routing_entry(kvm_state
, &e
);
276 int kvm_msi_message_del(KVMMsiMessage
*msg
)
278 struct kvm_irq_routing_entry e
;
280 kvm_msi_routing_entry(&e
, msg
);
281 return kvm_del_routing_entry(&e
);
284 int kvm_msi_message_update(KVMMsiMessage
*old
, KVMMsiMessage
*new)
286 struct kvm_irq_routing_entry e1
, e2
;
290 if (memcmp(old
, new, sizeof(KVMMsiMessage
)) == 0) {
294 kvm_msi_routing_entry(&e1
, old
);
295 kvm_msi_routing_entry(&e2
, new);
297 ret
= kvm_update_routing_entry(&e1
, &e2
);
306 #ifdef KVM_CAP_DEVICE_MSIX
307 int kvm_assign_set_msix_nr(KVMState
*s
, struct kvm_assigned_msix_nr
*msix_nr
)
309 return kvm_vm_ioctl(s
, KVM_ASSIGN_SET_MSIX_NR
, msix_nr
);
312 int kvm_assign_set_msix_entry(KVMState
*s
,
313 struct kvm_assigned_msix_entry
*entry
)
315 return kvm_vm_ioctl(s
, KVM_ASSIGN_SET_MSIX_ENTRY
, entry
);
319 #if !defined(TARGET_I386)
320 int kvm_arch_init_irq_routing(void)
326 #ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
327 typedef struct KVMIOPortRegion
{
331 QLIST_ENTRY(KVMIOPortRegion
) entry
;
334 static QLIST_HEAD(, KVMIOPortRegion
) ioport_regions
;
336 static void do_set_ioport_access(void *data
)
338 KVMIOPortRegion
*region
= data
;
339 bool enable
= region
->status
> 0;
342 r
= kvm_arch_set_ioport_access(region
->start
, region
->size
, enable
);
350 int kvm_add_ioport_region(unsigned long start
, unsigned long size
,
353 KVMIOPortRegion
*region
= g_malloc0(sizeof(KVMIOPortRegion
));
357 region
->start
= start
;
360 QLIST_INSERT_HEAD(&ioport_regions
, region
, entry
);
363 for (env
= first_cpu
; env
!= NULL
; env
= env
->next_cpu
) {
364 run_on_cpu(env
, do_set_ioport_access
, region
);
365 if (region
->status
< 0) {
367 kvm_remove_ioport_region(start
, size
, is_hot_plug
);
375 int kvm_remove_ioport_region(unsigned long start
, unsigned long size
,
378 KVMIOPortRegion
*region
, *tmp
;
382 QLIST_FOREACH_SAFE(region
, &ioport_regions
, entry
, tmp
) {
383 if (region
->start
== start
&& region
->size
== size
) {
387 for (env
= first_cpu
; env
!= NULL
; env
= env
->next_cpu
) {
388 run_on_cpu(env
, do_set_ioport_access
, region
);
391 QLIST_REMOVE(region
, entry
);
397 #endif /* CONFIG_KVM_DEVICE_ASSIGNMENT */
399 int kvm_update_ioport_access(CPUState
*env
)
401 #ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
402 KVMIOPortRegion
*region
;
405 assert(qemu_cpu_is_self(env
));
407 QLIST_FOREACH(region
, &ioport_regions
, entry
) {
408 bool enable
= region
->status
> 0;
410 r
= kvm_arch_set_ioport_access(region
->start
, region
->size
, enable
);
415 #endif /* CONFIG_KVM_DEVICE_ASSIGNMENT */