fdc: fix implied seek while there is no media in drive
[qemu-kvm.git] / qemu-kvm.c
blob133143cce590ce1b6fffc2f779688f33012c731f
1 /*
2 * qemu/kvm integration
4 * Copyright (C) 2006-2008 Qumranet Technologies
6 * Licensed under the terms of the GNU GPL version 2 or higher.
7 */
8 #include "config.h"
9 #include "config-host.h"
11 #include <assert.h>
12 #include <string.h>
13 #include "hw/hw.h"
14 #include "sysemu.h"
15 #include "qemu-common.h"
16 #include "console.h"
17 #include "block.h"
18 #include "compatfd.h"
19 #include "gdbstub.h"
20 #include "monitor.h"
21 #include "cpus.h"
23 #include "qemu-kvm.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
29 #endif
31 #define ALIGN(x, y) (((x)+(y)-1) & ~((y)-1))
33 #ifdef KVM_CAP_IRQ_ROUTING
34 static inline void clear_gsi(KVMState *s, unsigned int gsi)
36 uint32_t *bitmap = s->used_gsi_bitmap;
38 if (gsi < s->max_gsi) {
39 bitmap[gsi / 32] &= ~(1U << (gsi % 32));
40 } else {
41 DPRINTF("Invalid GSI %u\n", gsi);
44 #endif
46 #ifdef KVM_CAP_DEVICE_ASSIGNMENT
47 int kvm_assign_pci_device(KVMState *s,
48 struct kvm_assigned_pci_dev *assigned_dev)
50 return kvm_vm_ioctl(s, KVM_ASSIGN_PCI_DEVICE, assigned_dev);
53 static int kvm_old_assign_irq(KVMState *s,
54 struct kvm_assigned_irq *assigned_irq)
56 return kvm_vm_ioctl(s, KVM_ASSIGN_IRQ, assigned_irq);
59 int kvm_device_intx_set_mask(KVMState *s, uint32_t dev_id, bool masked)
61 struct kvm_assigned_pci_dev assigned_dev;
63 assigned_dev.assigned_dev_id = dev_id;
64 assigned_dev.flags = masked ? KVM_DEV_ASSIGN_MASK_INTX : 0;
65 return kvm_vm_ioctl(s, KVM_ASSIGN_SET_INTX_MASK, &assigned_dev);
68 #ifdef KVM_CAP_ASSIGN_DEV_IRQ
69 int kvm_assign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq)
71 int ret;
73 ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_ASSIGN_DEV_IRQ);
74 if (ret > 0) {
75 return kvm_vm_ioctl(s, KVM_ASSIGN_DEV_IRQ, assigned_irq);
78 return kvm_old_assign_irq(s, assigned_irq);
81 int kvm_deassign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq)
83 return kvm_vm_ioctl(s, KVM_DEASSIGN_DEV_IRQ, assigned_irq);
85 #else
86 int kvm_assign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq)
88 return kvm_old_assign_irq(s, assigned_irq);
90 #endif
91 #endif
93 #ifdef KVM_CAP_DEVICE_DEASSIGNMENT
94 int kvm_deassign_pci_device(KVMState *s,
95 struct kvm_assigned_pci_dev *assigned_dev)
97 return kvm_vm_ioctl(s, KVM_DEASSIGN_PCI_DEVICE, assigned_dev);
99 #endif
101 int kvm_del_routing_entry(struct kvm_irq_routing_entry *entry)
103 #ifdef KVM_CAP_IRQ_ROUTING
104 KVMState *s = kvm_state;
105 struct kvm_irq_routing_entry *e, *p;
106 int i, gsi, found = 0;
108 gsi = entry->gsi;
110 for (i = 0; i < s->irq_routes->nr; ++i) {
111 e = &s->irq_routes->entries[i];
112 if (e->type == entry->type && e->gsi == gsi) {
113 switch (e->type) {
114 case KVM_IRQ_ROUTING_IRQCHIP:{
115 if (e->u.irqchip.irqchip ==
116 entry->u.irqchip.irqchip
117 && e->u.irqchip.pin == entry->u.irqchip.pin) {
118 p = &s->irq_routes->entries[--s->irq_routes->nr];
119 *e = *p;
120 found = 1;
122 break;
124 case KVM_IRQ_ROUTING_MSI:{
125 if (e->u.msi.address_lo ==
126 entry->u.msi.address_lo
127 && e->u.msi.address_hi ==
128 entry->u.msi.address_hi
129 && e->u.msi.data == entry->u.msi.data) {
130 p = &s->irq_routes->entries[--s->irq_routes->nr];
131 *e = *p;
132 found = 1;
134 break;
136 default:
137 break;
139 if (found) {
140 /* If there are no other users of this GSI
141 * mark it available in the bitmap */
142 for (i = 0; i < s->irq_routes->nr; i++) {
143 e = &s->irq_routes->entries[i];
144 if (e->gsi == gsi)
145 break;
147 if (i == s->irq_routes->nr) {
148 clear_gsi(s, gsi);
151 return 0;
155 return -ESRCH;
156 #else
157 return -ENOSYS;
158 #endif
161 int kvm_update_routing_entry(struct kvm_irq_routing_entry *entry,
162 struct kvm_irq_routing_entry *newentry)
164 #ifdef KVM_CAP_IRQ_ROUTING
165 KVMState *s = kvm_state;
166 struct kvm_irq_routing_entry *e;
167 int i;
169 if (entry->gsi != newentry->gsi || entry->type != newentry->type) {
170 return -EINVAL;
173 for (i = 0; i < s->irq_routes->nr; ++i) {
174 e = &s->irq_routes->entries[i];
175 if (e->type != entry->type || e->gsi != entry->gsi) {
176 continue;
178 switch (e->type) {
179 case KVM_IRQ_ROUTING_IRQCHIP:
180 if (e->u.irqchip.irqchip == entry->u.irqchip.irqchip &&
181 e->u.irqchip.pin == entry->u.irqchip.pin) {
182 memcpy(&e->u.irqchip, &newentry->u.irqchip,
183 sizeof e->u.irqchip);
184 return 0;
186 break;
187 case KVM_IRQ_ROUTING_MSI:
188 if (e->u.msi.address_lo == entry->u.msi.address_lo &&
189 e->u.msi.address_hi == entry->u.msi.address_hi &&
190 e->u.msi.data == entry->u.msi.data) {
191 memcpy(&e->u.msi, &newentry->u.msi, sizeof e->u.msi);
192 return 0;
194 break;
195 default:
196 break;
199 return -ESRCH;
200 #else
201 return -ENOSYS;
202 #endif
205 int kvm_get_irq_route_gsi(void)
207 #ifdef KVM_CAP_IRQ_ROUTING
208 KVMState *s = kvm_state;
209 int i, bit;
210 uint32_t *buf = s->used_gsi_bitmap;
212 /* Return the lowest unused GSI in the bitmap */
213 for (i = 0; i < s->max_gsi / 32; i++) {
214 bit = ffs(~buf[i]);
215 if (!bit) {
216 continue;
219 return bit - 1 + i * 32;
222 return -ENOSPC;
223 #else
224 return -ENOSYS;
225 #endif
228 #ifdef KVM_CAP_IRQ_ROUTING
229 static void kvm_msi_routing_entry(struct kvm_irq_routing_entry *e,
230 KVMMsiMessage *msg)
233 e->gsi = msg->gsi;
234 e->type = KVM_IRQ_ROUTING_MSI;
235 e->flags = 0;
236 e->u.msi.address_lo = msg->addr_lo;
237 e->u.msi.address_hi = msg->addr_hi;
238 e->u.msi.data = msg->data;
240 #endif
242 int kvm_msi_message_add(KVMMsiMessage *msg)
244 #ifdef KVM_CAP_IRQ_ROUTING
245 struct kvm_irq_routing_entry e;
246 int ret;
248 ret = kvm_get_irq_route_gsi();
249 if (ret < 0) {
250 return ret;
252 msg->gsi = ret;
254 kvm_msi_routing_entry(&e, msg);
255 kvm_add_routing_entry(kvm_state, &e);
256 return 0;
257 #else
258 return -ENOSYS;
259 #endif
262 int kvm_msi_message_del(KVMMsiMessage *msg)
264 #ifdef KVM_CAP_IRQ_ROUTING
265 struct kvm_irq_routing_entry e;
267 kvm_msi_routing_entry(&e, msg);
268 return kvm_del_routing_entry(&e);
269 #else
270 return -ENOSYS;
271 #endif
274 int kvm_msi_message_update(KVMMsiMessage *old, KVMMsiMessage *new)
276 #ifdef KVM_CAP_IRQ_ROUTING
277 struct kvm_irq_routing_entry e1, e2;
278 int ret;
280 new->gsi = old->gsi;
281 if (memcmp(old, new, sizeof(KVMMsiMessage)) == 0) {
282 return 0;
285 kvm_msi_routing_entry(&e1, old);
286 kvm_msi_routing_entry(&e2, new);
288 ret = kvm_update_routing_entry(&e1, &e2);
289 if (ret < 0) {
290 return ret;
293 return 1;
294 #else
295 return -ENOSYS;
296 #endif
300 #ifdef KVM_CAP_DEVICE_MSIX
301 int kvm_assign_set_msix_nr(KVMState *s, struct kvm_assigned_msix_nr *msix_nr)
303 return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_NR, msix_nr);
306 int kvm_assign_set_msix_entry(KVMState *s,
307 struct kvm_assigned_msix_entry *entry)
309 return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_ENTRY, entry);
311 #endif
313 #if !defined(TARGET_I386)
314 void kvm_arch_init_irq_routing(KVMState *s)
317 #endif