xen: Avoid VLA
[qemu/ar7.git] / hw / i386 / xen / xen-hvm.c
blobed9c37c72d116e314fe5e4a06901a4e2be0c64b3
1 /*
2 * Copyright (C) 2010 Citrix Ltd.
4 * This work is licensed under the terms of the GNU GPL, version 2. See
5 * the COPYING file in the top-level directory.
7 * Contributions after 2012-01-13 are licensed under the terms of the
8 * GNU GPL, version 2 or (at your option) any later version.
9 */
11 #include "qemu/osdep.h"
13 #include "cpu.h"
14 #include "hw/pci/pci.h"
15 #include "hw/pci/pci_host.h"
16 #include "hw/i386/pc.h"
17 #include "hw/i386/apic-msidef.h"
18 #include "hw/xen/xen_common.h"
19 #include "hw/xen/xen-legacy-backend.h"
20 #include "hw/xen/xen-bus.h"
21 #include "qapi/error.h"
22 #include "qapi/qapi-commands-misc.h"
23 #include "qemu/error-report.h"
24 #include "qemu/range.h"
25 #include "sysemu/xen-mapcache.h"
26 #include "trace.h"
27 #include "exec/address-spaces.h"
29 #include <xen/hvm/ioreq.h>
30 #include <xen/hvm/params.h>
31 #include <xen/hvm/e820.h>
33 //#define DEBUG_XEN_HVM
35 #ifdef DEBUG_XEN_HVM
36 #define DPRINTF(fmt, ...) \
37 do { fprintf(stderr, "xen: " fmt, ## __VA_ARGS__); } while (0)
38 #else
39 #define DPRINTF(fmt, ...) \
40 do { } while (0)
41 #endif
43 static MemoryRegion ram_memory, ram_640k, ram_lo, ram_hi;
44 static MemoryRegion *framebuffer;
45 static bool xen_in_migration;
47 /* Compatibility with older version */
49 /* This allows QEMU to build on a system that has Xen 4.5 or earlier
50 * installed. This here (not in hw/xen/xen_common.h) because xen/hvm/ioreq.h
51 * needs to be included before this block and hw/xen/xen_common.h needs to
52 * be included before xen/hvm/ioreq.h
54 #ifndef IOREQ_TYPE_VMWARE_PORT
55 #define IOREQ_TYPE_VMWARE_PORT 3
56 struct vmware_regs {
57 uint32_t esi;
58 uint32_t edi;
59 uint32_t ebx;
60 uint32_t ecx;
61 uint32_t edx;
63 typedef struct vmware_regs vmware_regs_t;
65 struct shared_vmport_iopage {
66 struct vmware_regs vcpu_vmport_regs[1];
68 typedef struct shared_vmport_iopage shared_vmport_iopage_t;
69 #endif
71 static inline uint32_t xen_vcpu_eport(shared_iopage_t *shared_page, int i)
73 return shared_page->vcpu_ioreq[i].vp_eport;
75 static inline ioreq_t *xen_vcpu_ioreq(shared_iopage_t *shared_page, int vcpu)
77 return &shared_page->vcpu_ioreq[vcpu];
80 #define BUFFER_IO_MAX_DELAY 100
82 typedef struct XenPhysmap {
83 hwaddr start_addr;
84 ram_addr_t size;
85 const char *name;
86 hwaddr phys_offset;
88 QLIST_ENTRY(XenPhysmap) list;
89 } XenPhysmap;
91 static QLIST_HEAD(, XenPhysmap) xen_physmap;
93 typedef struct XenPciDevice {
94 PCIDevice *pci_dev;
95 uint32_t sbdf;
96 QLIST_ENTRY(XenPciDevice) entry;
97 } XenPciDevice;
99 typedef struct XenIOState {
100 ioservid_t ioservid;
101 shared_iopage_t *shared_page;
102 shared_vmport_iopage_t *shared_vmport_page;
103 buffered_iopage_t *buffered_io_page;
104 QEMUTimer *buffered_io_timer;
105 CPUState **cpu_by_vcpu_id;
106 /* the evtchn port for polling the notification, */
107 evtchn_port_t *ioreq_local_port;
108 /* evtchn remote and local ports for buffered io */
109 evtchn_port_t bufioreq_remote_port;
110 evtchn_port_t bufioreq_local_port;
111 /* the evtchn fd for polling */
112 xenevtchn_handle *xce_handle;
113 /* which vcpu we are serving */
114 int send_vcpu;
116 struct xs_handle *xenstore;
117 MemoryListener memory_listener;
118 MemoryListener io_listener;
119 QLIST_HEAD(, XenPciDevice) dev_list;
120 DeviceListener device_listener;
121 hwaddr free_phys_offset;
122 const XenPhysmap *log_for_dirtybit;
123 /* Buffer used by xen_sync_dirty_bitmap */
124 unsigned long *dirty_bitmap;
126 Notifier exit;
127 Notifier suspend;
128 Notifier wakeup;
129 } XenIOState;
131 /* Xen specific function for piix pci */
133 int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
135 return irq_num + ((pci_dev->devfn >> 3) << 2);
138 void xen_piix3_set_irq(void *opaque, int irq_num, int level)
140 xen_set_pci_intx_level(xen_domid, 0, 0, irq_num >> 2,
141 irq_num & 3, level);
144 void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len)
146 int i;
148 /* Scan for updates to PCI link routes (0x60-0x63). */
149 for (i = 0; i < len; i++) {
150 uint8_t v = (val >> (8 * i)) & 0xff;
151 if (v & 0x80) {
152 v = 0;
154 v &= 0xf;
155 if (((address + i) >= 0x60) && ((address + i) <= 0x63)) {
156 xen_set_pci_link_route(xen_domid, address + i - 0x60, v);
161 int xen_is_pirq_msi(uint32_t msi_data)
163 /* If vector is 0, the msi is remapped into a pirq, passed as
164 * dest_id.
166 return ((msi_data & MSI_DATA_VECTOR_MASK) >> MSI_DATA_VECTOR_SHIFT) == 0;
169 void xen_hvm_inject_msi(uint64_t addr, uint32_t data)
171 xen_inject_msi(xen_domid, addr, data);
174 static void xen_suspend_notifier(Notifier *notifier, void *data)
176 xc_set_hvm_param(xen_xc, xen_domid, HVM_PARAM_ACPI_S_STATE, 3);
179 /* Xen Interrupt Controller */
181 static void xen_set_irq(void *opaque, int irq, int level)
183 xen_set_isa_irq_level(xen_domid, irq, level);
186 qemu_irq *xen_interrupt_controller_init(void)
188 return qemu_allocate_irqs(xen_set_irq, NULL, 16);
191 /* Memory Ops */
193 static void xen_ram_init(PCMachineState *pcms,
194 ram_addr_t ram_size, MemoryRegion **ram_memory_p)
196 MemoryRegion *sysmem = get_system_memory();
197 ram_addr_t block_len;
198 uint64_t user_lowmem = object_property_get_uint(qdev_get_machine(),
199 PC_MACHINE_MAX_RAM_BELOW_4G,
200 &error_abort);
202 /* Handle the machine opt max-ram-below-4g. It is basically doing
203 * min(xen limit, user limit).
205 if (!user_lowmem) {
206 user_lowmem = HVM_BELOW_4G_RAM_END; /* default */
208 if (HVM_BELOW_4G_RAM_END <= user_lowmem) {
209 user_lowmem = HVM_BELOW_4G_RAM_END;
212 if (ram_size >= user_lowmem) {
213 pcms->above_4g_mem_size = ram_size - user_lowmem;
214 pcms->below_4g_mem_size = user_lowmem;
215 } else {
216 pcms->above_4g_mem_size = 0;
217 pcms->below_4g_mem_size = ram_size;
219 if (!pcms->above_4g_mem_size) {
220 block_len = ram_size;
221 } else {
223 * Xen does not allocate the memory continuously, it keeps a
224 * hole of the size computed above or passed in.
226 block_len = (1ULL << 32) + pcms->above_4g_mem_size;
228 memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len,
229 &error_fatal);
230 *ram_memory_p = &ram_memory;
232 memory_region_init_alias(&ram_640k, NULL, "xen.ram.640k",
233 &ram_memory, 0, 0xa0000);
234 memory_region_add_subregion(sysmem, 0, &ram_640k);
235 /* Skip of the VGA IO memory space, it will be registered later by the VGA
236 * emulated device.
238 * The area between 0xc0000 and 0x100000 will be used by SeaBIOS to load
239 * the Options ROM, so it is registered here as RAM.
241 memory_region_init_alias(&ram_lo, NULL, "xen.ram.lo",
242 &ram_memory, 0xc0000,
243 pcms->below_4g_mem_size - 0xc0000);
244 memory_region_add_subregion(sysmem, 0xc0000, &ram_lo);
245 if (pcms->above_4g_mem_size > 0) {
246 memory_region_init_alias(&ram_hi, NULL, "xen.ram.hi",
247 &ram_memory, 0x100000000ULL,
248 pcms->above_4g_mem_size);
249 memory_region_add_subregion(sysmem, 0x100000000ULL, &ram_hi);
253 void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr,
254 Error **errp)
256 unsigned long nr_pfn;
257 xen_pfn_t *pfn_list;
258 int i;
260 if (runstate_check(RUN_STATE_INMIGRATE)) {
261 /* RAM already populated in Xen */
262 fprintf(stderr, "%s: do not alloc "RAM_ADDR_FMT
263 " bytes of ram at "RAM_ADDR_FMT" when runstate is INMIGRATE\n",
264 __func__, size, ram_addr);
265 return;
268 if (mr == &ram_memory) {
269 return;
272 trace_xen_ram_alloc(ram_addr, size);
274 nr_pfn = size >> TARGET_PAGE_BITS;
275 pfn_list = g_malloc(sizeof (*pfn_list) * nr_pfn);
277 for (i = 0; i < nr_pfn; i++) {
278 pfn_list[i] = (ram_addr >> TARGET_PAGE_BITS) + i;
281 if (xc_domain_populate_physmap_exact(xen_xc, xen_domid, nr_pfn, 0, 0, pfn_list)) {
282 error_setg(errp, "xen: failed to populate ram at " RAM_ADDR_FMT,
283 ram_addr);
286 g_free(pfn_list);
289 static XenPhysmap *get_physmapping(hwaddr start_addr, ram_addr_t size)
291 XenPhysmap *physmap = NULL;
293 start_addr &= TARGET_PAGE_MASK;
295 QLIST_FOREACH(physmap, &xen_physmap, list) {
296 if (range_covers_byte(physmap->start_addr, physmap->size, start_addr)) {
297 return physmap;
300 return NULL;
303 static hwaddr xen_phys_offset_to_gaddr(hwaddr phys_offset, ram_addr_t size)
305 hwaddr addr = phys_offset & TARGET_PAGE_MASK;
306 XenPhysmap *physmap = NULL;
308 QLIST_FOREACH(physmap, &xen_physmap, list) {
309 if (range_covers_byte(physmap->phys_offset, physmap->size, addr)) {
310 return physmap->start_addr + (phys_offset - physmap->phys_offset);
314 return phys_offset;
317 #ifdef XEN_COMPAT_PHYSMAP
318 static int xen_save_physmap(XenIOState *state, XenPhysmap *physmap)
320 char path[80], value[17];
322 snprintf(path, sizeof(path),
323 "/local/domain/0/device-model/%d/physmap/%"PRIx64"/start_addr",
324 xen_domid, (uint64_t)physmap->phys_offset);
325 snprintf(value, sizeof(value), "%"PRIx64, (uint64_t)physmap->start_addr);
326 if (!xs_write(state->xenstore, 0, path, value, strlen(value))) {
327 return -1;
329 snprintf(path, sizeof(path),
330 "/local/domain/0/device-model/%d/physmap/%"PRIx64"/size",
331 xen_domid, (uint64_t)physmap->phys_offset);
332 snprintf(value, sizeof(value), "%"PRIx64, (uint64_t)physmap->size);
333 if (!xs_write(state->xenstore, 0, path, value, strlen(value))) {
334 return -1;
336 if (physmap->name) {
337 snprintf(path, sizeof(path),
338 "/local/domain/0/device-model/%d/physmap/%"PRIx64"/name",
339 xen_domid, (uint64_t)physmap->phys_offset);
340 if (!xs_write(state->xenstore, 0, path,
341 physmap->name, strlen(physmap->name))) {
342 return -1;
345 return 0;
347 #else
348 static int xen_save_physmap(XenIOState *state, XenPhysmap *physmap)
350 return 0;
352 #endif
354 static int xen_add_to_physmap(XenIOState *state,
355 hwaddr start_addr,
356 ram_addr_t size,
357 MemoryRegion *mr,
358 hwaddr offset_within_region)
360 unsigned long nr_pages;
361 int rc = 0;
362 XenPhysmap *physmap = NULL;
363 hwaddr pfn, start_gpfn;
364 hwaddr phys_offset = memory_region_get_ram_addr(mr);
365 const char *mr_name;
367 if (get_physmapping(start_addr, size)) {
368 return 0;
370 if (size <= 0) {
371 return -1;
374 /* Xen can only handle a single dirty log region for now and we want
375 * the linear framebuffer to be that region.
376 * Avoid tracking any regions that is not videoram and avoid tracking
377 * the legacy vga region. */
378 if (mr == framebuffer && start_addr > 0xbffff) {
379 goto go_physmap;
381 return -1;
383 go_physmap:
384 DPRINTF("mapping vram to %"HWADDR_PRIx" - %"HWADDR_PRIx"\n",
385 start_addr, start_addr + size);
387 mr_name = memory_region_name(mr);
389 physmap = g_malloc(sizeof(XenPhysmap));
391 physmap->start_addr = start_addr;
392 physmap->size = size;
393 physmap->name = mr_name;
394 physmap->phys_offset = phys_offset;
396 QLIST_INSERT_HEAD(&xen_physmap, physmap, list);
398 if (runstate_check(RUN_STATE_INMIGRATE)) {
399 /* Now when we have a physmap entry we can replace a dummy mapping with
400 * a real one of guest foreign memory. */
401 uint8_t *p = xen_replace_cache_entry(phys_offset, start_addr, size);
402 assert(p && p == memory_region_get_ram_ptr(mr));
404 return 0;
407 pfn = phys_offset >> TARGET_PAGE_BITS;
408 start_gpfn = start_addr >> TARGET_PAGE_BITS;
409 nr_pages = size >> TARGET_PAGE_BITS;
410 rc = xendevicemodel_relocate_memory(xen_dmod, xen_domid, nr_pages, pfn,
411 start_gpfn);
412 if (rc) {
413 int saved_errno = errno;
415 error_report("relocate_memory %lu pages from GFN %"HWADDR_PRIx
416 " to GFN %"HWADDR_PRIx" failed: %s",
417 nr_pages, pfn, start_gpfn, strerror(saved_errno));
418 errno = saved_errno;
419 return -1;
422 rc = xendevicemodel_pin_memory_cacheattr(xen_dmod, xen_domid,
423 start_addr >> TARGET_PAGE_BITS,
424 (start_addr + size - 1) >> TARGET_PAGE_BITS,
425 XEN_DOMCTL_MEM_CACHEATTR_WB);
426 if (rc) {
427 error_report("pin_memory_cacheattr failed: %s", strerror(errno));
429 return xen_save_physmap(state, physmap);
432 static int xen_remove_from_physmap(XenIOState *state,
433 hwaddr start_addr,
434 ram_addr_t size)
436 int rc = 0;
437 XenPhysmap *physmap = NULL;
438 hwaddr phys_offset = 0;
440 physmap = get_physmapping(start_addr, size);
441 if (physmap == NULL) {
442 return -1;
445 phys_offset = physmap->phys_offset;
446 size = physmap->size;
448 DPRINTF("unmapping vram to %"HWADDR_PRIx" - %"HWADDR_PRIx", at "
449 "%"HWADDR_PRIx"\n", start_addr, start_addr + size, phys_offset);
451 size >>= TARGET_PAGE_BITS;
452 start_addr >>= TARGET_PAGE_BITS;
453 phys_offset >>= TARGET_PAGE_BITS;
454 rc = xendevicemodel_relocate_memory(xen_dmod, xen_domid, size, start_addr,
455 phys_offset);
456 if (rc) {
457 int saved_errno = errno;
459 error_report("relocate_memory "RAM_ADDR_FMT" pages"
460 " from GFN %"HWADDR_PRIx
461 " to GFN %"HWADDR_PRIx" failed: %s",
462 size, start_addr, phys_offset, strerror(saved_errno));
463 errno = saved_errno;
464 return -1;
467 QLIST_REMOVE(physmap, list);
468 if (state->log_for_dirtybit == physmap) {
469 state->log_for_dirtybit = NULL;
470 g_free(state->dirty_bitmap);
471 state->dirty_bitmap = NULL;
473 g_free(physmap);
475 return 0;
478 static void xen_set_memory(struct MemoryListener *listener,
479 MemoryRegionSection *section,
480 bool add)
482 XenIOState *state = container_of(listener, XenIOState, memory_listener);
483 hwaddr start_addr = section->offset_within_address_space;
484 ram_addr_t size = int128_get64(section->size);
485 bool log_dirty = memory_region_is_logging(section->mr, DIRTY_MEMORY_VGA);
486 hvmmem_type_t mem_type;
488 if (section->mr == &ram_memory) {
489 return;
490 } else {
491 if (add) {
492 xen_map_memory_section(xen_domid, state->ioservid,
493 section);
494 } else {
495 xen_unmap_memory_section(xen_domid, state->ioservid,
496 section);
500 if (!memory_region_is_ram(section->mr)) {
501 return;
504 if (log_dirty != add) {
505 return;
508 trace_xen_client_set_memory(start_addr, size, log_dirty);
510 start_addr &= TARGET_PAGE_MASK;
511 size = TARGET_PAGE_ALIGN(size);
513 if (add) {
514 if (!memory_region_is_rom(section->mr)) {
515 xen_add_to_physmap(state, start_addr, size,
516 section->mr, section->offset_within_region);
517 } else {
518 mem_type = HVMMEM_ram_ro;
519 if (xen_set_mem_type(xen_domid, mem_type,
520 start_addr >> TARGET_PAGE_BITS,
521 size >> TARGET_PAGE_BITS)) {
522 DPRINTF("xen_set_mem_type error, addr: "TARGET_FMT_plx"\n",
523 start_addr);
526 } else {
527 if (xen_remove_from_physmap(state, start_addr, size) < 0) {
528 DPRINTF("physmapping does not exist at "TARGET_FMT_plx"\n", start_addr);
533 static void xen_region_add(MemoryListener *listener,
534 MemoryRegionSection *section)
536 memory_region_ref(section->mr);
537 xen_set_memory(listener, section, true);
540 static void xen_region_del(MemoryListener *listener,
541 MemoryRegionSection *section)
543 xen_set_memory(listener, section, false);
544 memory_region_unref(section->mr);
547 static void xen_io_add(MemoryListener *listener,
548 MemoryRegionSection *section)
550 XenIOState *state = container_of(listener, XenIOState, io_listener);
551 MemoryRegion *mr = section->mr;
553 if (mr->ops == &unassigned_io_ops) {
554 return;
557 memory_region_ref(mr);
559 xen_map_io_section(xen_domid, state->ioservid, section);
562 static void xen_io_del(MemoryListener *listener,
563 MemoryRegionSection *section)
565 XenIOState *state = container_of(listener, XenIOState, io_listener);
566 MemoryRegion *mr = section->mr;
568 if (mr->ops == &unassigned_io_ops) {
569 return;
572 xen_unmap_io_section(xen_domid, state->ioservid, section);
574 memory_region_unref(mr);
577 static void xen_device_realize(DeviceListener *listener,
578 DeviceState *dev)
580 XenIOState *state = container_of(listener, XenIOState, device_listener);
582 if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
583 PCIDevice *pci_dev = PCI_DEVICE(dev);
584 XenPciDevice *xendev = g_new(XenPciDevice, 1);
586 xendev->pci_dev = pci_dev;
587 xendev->sbdf = PCI_BUILD_BDF(pci_dev_bus_num(pci_dev),
588 pci_dev->devfn);
589 QLIST_INSERT_HEAD(&state->dev_list, xendev, entry);
591 xen_map_pcidev(xen_domid, state->ioservid, pci_dev);
595 static void xen_device_unrealize(DeviceListener *listener,
596 DeviceState *dev)
598 XenIOState *state = container_of(listener, XenIOState, device_listener);
600 if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
601 PCIDevice *pci_dev = PCI_DEVICE(dev);
602 XenPciDevice *xendev, *next;
604 xen_unmap_pcidev(xen_domid, state->ioservid, pci_dev);
606 QLIST_FOREACH_SAFE(xendev, &state->dev_list, entry, next) {
607 if (xendev->pci_dev == pci_dev) {
608 QLIST_REMOVE(xendev, entry);
609 g_free(xendev);
610 break;
616 static void xen_sync_dirty_bitmap(XenIOState *state,
617 hwaddr start_addr,
618 ram_addr_t size)
620 hwaddr npages = size >> TARGET_PAGE_BITS;
621 const int width = sizeof(unsigned long) * 8;
622 size_t bitmap_size = DIV_ROUND_UP(npages, width);
623 int rc, i, j;
624 const XenPhysmap *physmap = NULL;
626 physmap = get_physmapping(start_addr, size);
627 if (physmap == NULL) {
628 /* not handled */
629 return;
632 if (state->log_for_dirtybit == NULL) {
633 state->log_for_dirtybit = physmap;
634 state->dirty_bitmap = g_new(unsigned long, bitmap_size);
635 } else if (state->log_for_dirtybit != physmap) {
636 /* Only one range for dirty bitmap can be tracked. */
637 return;
640 rc = xen_track_dirty_vram(xen_domid, start_addr >> TARGET_PAGE_BITS,
641 npages, state->dirty_bitmap);
642 if (rc < 0) {
643 #ifndef ENODATA
644 #define ENODATA ENOENT
645 #endif
646 if (errno == ENODATA) {
647 memory_region_set_dirty(framebuffer, 0, size);
648 DPRINTF("xen: track_dirty_vram failed (0x" TARGET_FMT_plx
649 ", 0x" TARGET_FMT_plx "): %s\n",
650 start_addr, start_addr + size, strerror(errno));
652 return;
655 for (i = 0; i < bitmap_size; i++) {
656 unsigned long map = state->dirty_bitmap[i];
657 while (map != 0) {
658 j = ctzl(map);
659 map &= ~(1ul << j);
660 memory_region_set_dirty(framebuffer,
661 (i * width + j) * TARGET_PAGE_SIZE,
662 TARGET_PAGE_SIZE);
667 static void xen_log_start(MemoryListener *listener,
668 MemoryRegionSection *section,
669 int old, int new)
671 XenIOState *state = container_of(listener, XenIOState, memory_listener);
673 if (new & ~old & (1 << DIRTY_MEMORY_VGA)) {
674 xen_sync_dirty_bitmap(state, section->offset_within_address_space,
675 int128_get64(section->size));
679 static void xen_log_stop(MemoryListener *listener, MemoryRegionSection *section,
680 int old, int new)
682 XenIOState *state = container_of(listener, XenIOState, memory_listener);
684 if (old & ~new & (1 << DIRTY_MEMORY_VGA)) {
685 state->log_for_dirtybit = NULL;
686 g_free(state->dirty_bitmap);
687 state->dirty_bitmap = NULL;
688 /* Disable dirty bit tracking */
689 xen_track_dirty_vram(xen_domid, 0, 0, NULL);
693 static void xen_log_sync(MemoryListener *listener, MemoryRegionSection *section)
695 XenIOState *state = container_of(listener, XenIOState, memory_listener);
697 xen_sync_dirty_bitmap(state, section->offset_within_address_space,
698 int128_get64(section->size));
701 static void xen_log_global_start(MemoryListener *listener)
703 if (xen_enabled()) {
704 xen_in_migration = true;
708 static void xen_log_global_stop(MemoryListener *listener)
710 xen_in_migration = false;
713 static MemoryListener xen_memory_listener = {
714 .region_add = xen_region_add,
715 .region_del = xen_region_del,
716 .log_start = xen_log_start,
717 .log_stop = xen_log_stop,
718 .log_sync = xen_log_sync,
719 .log_global_start = xen_log_global_start,
720 .log_global_stop = xen_log_global_stop,
721 .priority = 10,
724 static MemoryListener xen_io_listener = {
725 .region_add = xen_io_add,
726 .region_del = xen_io_del,
727 .priority = 10,
730 static DeviceListener xen_device_listener = {
731 .realize = xen_device_realize,
732 .unrealize = xen_device_unrealize,
735 /* get the ioreq packets from share mem */
736 static ioreq_t *cpu_get_ioreq_from_shared_memory(XenIOState *state, int vcpu)
738 ioreq_t *req = xen_vcpu_ioreq(state->shared_page, vcpu);
740 if (req->state != STATE_IOREQ_READY) {
741 DPRINTF("I/O request not ready: "
742 "%x, ptr: %x, port: %"PRIx64", "
743 "data: %"PRIx64", count: %u, size: %u\n",
744 req->state, req->data_is_ptr, req->addr,
745 req->data, req->count, req->size);
746 return NULL;
749 xen_rmb(); /* see IOREQ_READY /then/ read contents of ioreq */
751 req->state = STATE_IOREQ_INPROCESS;
752 return req;
755 /* use poll to get the port notification */
756 /* ioreq_vec--out,the */
757 /* retval--the number of ioreq packet */
758 static ioreq_t *cpu_get_ioreq(XenIOState *state)
760 int i;
761 evtchn_port_t port;
763 port = xenevtchn_pending(state->xce_handle);
764 if (port == state->bufioreq_local_port) {
765 timer_mod(state->buffered_io_timer,
766 BUFFER_IO_MAX_DELAY + qemu_clock_get_ms(QEMU_CLOCK_REALTIME));
767 return NULL;
770 if (port != -1) {
771 for (i = 0; i < max_cpus; i++) {
772 if (state->ioreq_local_port[i] == port) {
773 break;
777 if (i == max_cpus) {
778 hw_error("Fatal error while trying to get io event!\n");
781 /* unmask the wanted port again */
782 xenevtchn_unmask(state->xce_handle, port);
784 /* get the io packet from shared memory */
785 state->send_vcpu = i;
786 return cpu_get_ioreq_from_shared_memory(state, i);
789 /* read error or read nothing */
790 return NULL;
793 static uint32_t do_inp(uint32_t addr, unsigned long size)
795 switch (size) {
796 case 1:
797 return cpu_inb(addr);
798 case 2:
799 return cpu_inw(addr);
800 case 4:
801 return cpu_inl(addr);
802 default:
803 hw_error("inp: bad size: %04x %lx", addr, size);
807 static void do_outp(uint32_t addr,
808 unsigned long size, uint32_t val)
810 switch (size) {
811 case 1:
812 return cpu_outb(addr, val);
813 case 2:
814 return cpu_outw(addr, val);
815 case 4:
816 return cpu_outl(addr, val);
817 default:
818 hw_error("outp: bad size: %04x %lx", addr, size);
823 * Helper functions which read/write an object from/to physical guest
824 * memory, as part of the implementation of an ioreq.
826 * Equivalent to
827 * cpu_physical_memory_rw(addr + (req->df ? -1 : +1) * req->size * i,
828 * val, req->size, 0/1)
829 * except without the integer overflow problems.
831 static void rw_phys_req_item(hwaddr addr,
832 ioreq_t *req, uint32_t i, void *val, int rw)
834 /* Do everything unsigned so overflow just results in a truncated result
835 * and accesses to undesired parts of guest memory, which is up
836 * to the guest */
837 hwaddr offset = (hwaddr)req->size * i;
838 if (req->df) {
839 addr -= offset;
840 } else {
841 addr += offset;
843 cpu_physical_memory_rw(addr, val, req->size, rw);
846 static inline void read_phys_req_item(hwaddr addr,
847 ioreq_t *req, uint32_t i, void *val)
849 rw_phys_req_item(addr, req, i, val, 0);
851 static inline void write_phys_req_item(hwaddr addr,
852 ioreq_t *req, uint32_t i, void *val)
854 rw_phys_req_item(addr, req, i, val, 1);
858 static void cpu_ioreq_pio(ioreq_t *req)
860 uint32_t i;
862 trace_cpu_ioreq_pio(req, req->dir, req->df, req->data_is_ptr, req->addr,
863 req->data, req->count, req->size);
865 if (req->size > sizeof(uint32_t)) {
866 hw_error("PIO: bad size (%u)", req->size);
869 if (req->dir == IOREQ_READ) {
870 if (!req->data_is_ptr) {
871 req->data = do_inp(req->addr, req->size);
872 trace_cpu_ioreq_pio_read_reg(req, req->data, req->addr,
873 req->size);
874 } else {
875 uint32_t tmp;
877 for (i = 0; i < req->count; i++) {
878 tmp = do_inp(req->addr, req->size);
879 write_phys_req_item(req->data, req, i, &tmp);
882 } else if (req->dir == IOREQ_WRITE) {
883 if (!req->data_is_ptr) {
884 trace_cpu_ioreq_pio_write_reg(req, req->data, req->addr,
885 req->size);
886 do_outp(req->addr, req->size, req->data);
887 } else {
888 for (i = 0; i < req->count; i++) {
889 uint32_t tmp = 0;
891 read_phys_req_item(req->data, req, i, &tmp);
892 do_outp(req->addr, req->size, tmp);
898 static void cpu_ioreq_move(ioreq_t *req)
900 uint32_t i;
902 trace_cpu_ioreq_move(req, req->dir, req->df, req->data_is_ptr, req->addr,
903 req->data, req->count, req->size);
905 if (req->size > sizeof(req->data)) {
906 hw_error("MMIO: bad size (%u)", req->size);
909 if (!req->data_is_ptr) {
910 if (req->dir == IOREQ_READ) {
911 for (i = 0; i < req->count; i++) {
912 read_phys_req_item(req->addr, req, i, &req->data);
914 } else if (req->dir == IOREQ_WRITE) {
915 for (i = 0; i < req->count; i++) {
916 write_phys_req_item(req->addr, req, i, &req->data);
919 } else {
920 uint64_t tmp;
922 if (req->dir == IOREQ_READ) {
923 for (i = 0; i < req->count; i++) {
924 read_phys_req_item(req->addr, req, i, &tmp);
925 write_phys_req_item(req->data, req, i, &tmp);
927 } else if (req->dir == IOREQ_WRITE) {
928 for (i = 0; i < req->count; i++) {
929 read_phys_req_item(req->data, req, i, &tmp);
930 write_phys_req_item(req->addr, req, i, &tmp);
936 static void cpu_ioreq_config(XenIOState *state, ioreq_t *req)
938 uint32_t sbdf = req->addr >> 32;
939 uint32_t reg = req->addr;
940 XenPciDevice *xendev;
942 if (req->size != sizeof(uint8_t) && req->size != sizeof(uint16_t) &&
943 req->size != sizeof(uint32_t)) {
944 hw_error("PCI config access: bad size (%u)", req->size);
947 if (req->count != 1) {
948 hw_error("PCI config access: bad count (%u)", req->count);
951 QLIST_FOREACH(xendev, &state->dev_list, entry) {
952 if (xendev->sbdf != sbdf) {
953 continue;
956 if (!req->data_is_ptr) {
957 if (req->dir == IOREQ_READ) {
958 req->data = pci_host_config_read_common(
959 xendev->pci_dev, reg, PCI_CONFIG_SPACE_SIZE,
960 req->size);
961 trace_cpu_ioreq_config_read(req, xendev->sbdf, reg,
962 req->size, req->data);
963 } else if (req->dir == IOREQ_WRITE) {
964 trace_cpu_ioreq_config_write(req, xendev->sbdf, reg,
965 req->size, req->data);
966 pci_host_config_write_common(
967 xendev->pci_dev, reg, PCI_CONFIG_SPACE_SIZE,
968 req->data, req->size);
970 } else {
971 uint32_t tmp;
973 if (req->dir == IOREQ_READ) {
974 tmp = pci_host_config_read_common(
975 xendev->pci_dev, reg, PCI_CONFIG_SPACE_SIZE,
976 req->size);
977 trace_cpu_ioreq_config_read(req, xendev->sbdf, reg,
978 req->size, tmp);
979 write_phys_req_item(req->data, req, 0, &tmp);
980 } else if (req->dir == IOREQ_WRITE) {
981 read_phys_req_item(req->data, req, 0, &tmp);
982 trace_cpu_ioreq_config_write(req, xendev->sbdf, reg,
983 req->size, tmp);
984 pci_host_config_write_common(
985 xendev->pci_dev, reg, PCI_CONFIG_SPACE_SIZE,
986 tmp, req->size);
992 static void regs_to_cpu(vmware_regs_t *vmport_regs, ioreq_t *req)
994 X86CPU *cpu;
995 CPUX86State *env;
997 cpu = X86_CPU(current_cpu);
998 env = &cpu->env;
999 env->regs[R_EAX] = req->data;
1000 env->regs[R_EBX] = vmport_regs->ebx;
1001 env->regs[R_ECX] = vmport_regs->ecx;
1002 env->regs[R_EDX] = vmport_regs->edx;
1003 env->regs[R_ESI] = vmport_regs->esi;
1004 env->regs[R_EDI] = vmport_regs->edi;
1007 static void regs_from_cpu(vmware_regs_t *vmport_regs)
1009 X86CPU *cpu = X86_CPU(current_cpu);
1010 CPUX86State *env = &cpu->env;
1012 vmport_regs->ebx = env->regs[R_EBX];
1013 vmport_regs->ecx = env->regs[R_ECX];
1014 vmport_regs->edx = env->regs[R_EDX];
1015 vmport_regs->esi = env->regs[R_ESI];
1016 vmport_regs->edi = env->regs[R_EDI];
1019 static void handle_vmport_ioreq(XenIOState *state, ioreq_t *req)
1021 vmware_regs_t *vmport_regs;
1023 assert(state->shared_vmport_page);
1024 vmport_regs =
1025 &state->shared_vmport_page->vcpu_vmport_regs[state->send_vcpu];
1026 QEMU_BUILD_BUG_ON(sizeof(*req) < sizeof(*vmport_regs));
1028 current_cpu = state->cpu_by_vcpu_id[state->send_vcpu];
1029 regs_to_cpu(vmport_regs, req);
1030 cpu_ioreq_pio(req);
1031 regs_from_cpu(vmport_regs);
1032 current_cpu = NULL;
1035 static void handle_ioreq(XenIOState *state, ioreq_t *req)
1037 trace_handle_ioreq(req, req->type, req->dir, req->df, req->data_is_ptr,
1038 req->addr, req->data, req->count, req->size);
1040 if (!req->data_is_ptr && (req->dir == IOREQ_WRITE) &&
1041 (req->size < sizeof (target_ulong))) {
1042 req->data &= ((target_ulong) 1 << (8 * req->size)) - 1;
1045 if (req->dir == IOREQ_WRITE)
1046 trace_handle_ioreq_write(req, req->type, req->df, req->data_is_ptr,
1047 req->addr, req->data, req->count, req->size);
1049 switch (req->type) {
1050 case IOREQ_TYPE_PIO:
1051 cpu_ioreq_pio(req);
1052 break;
1053 case IOREQ_TYPE_COPY:
1054 cpu_ioreq_move(req);
1055 break;
1056 case IOREQ_TYPE_VMWARE_PORT:
1057 handle_vmport_ioreq(state, req);
1058 break;
1059 case IOREQ_TYPE_TIMEOFFSET:
1060 break;
1061 case IOREQ_TYPE_INVALIDATE:
1062 xen_invalidate_map_cache();
1063 break;
1064 case IOREQ_TYPE_PCI_CONFIG:
1065 cpu_ioreq_config(state, req);
1066 break;
1067 default:
1068 hw_error("Invalid ioreq type 0x%x\n", req->type);
1070 if (req->dir == IOREQ_READ) {
1071 trace_handle_ioreq_read(req, req->type, req->df, req->data_is_ptr,
1072 req->addr, req->data, req->count, req->size);
1076 static int handle_buffered_iopage(XenIOState *state)
1078 buffered_iopage_t *buf_page = state->buffered_io_page;
1079 buf_ioreq_t *buf_req = NULL;
1080 ioreq_t req;
1081 int qw;
1083 if (!buf_page) {
1084 return 0;
1087 memset(&req, 0x00, sizeof(req));
1088 req.state = STATE_IOREQ_READY;
1089 req.count = 1;
1090 req.dir = IOREQ_WRITE;
1092 for (;;) {
1093 uint32_t rdptr = buf_page->read_pointer, wrptr;
1095 xen_rmb();
1096 wrptr = buf_page->write_pointer;
1097 xen_rmb();
1098 if (rdptr != buf_page->read_pointer) {
1099 continue;
1101 if (rdptr == wrptr) {
1102 break;
1104 buf_req = &buf_page->buf_ioreq[rdptr % IOREQ_BUFFER_SLOT_NUM];
1105 req.size = 1U << buf_req->size;
1106 req.addr = buf_req->addr;
1107 req.data = buf_req->data;
1108 req.type = buf_req->type;
1109 xen_rmb();
1110 qw = (req.size == 8);
1111 if (qw) {
1112 if (rdptr + 1 == wrptr) {
1113 hw_error("Incomplete quad word buffered ioreq");
1115 buf_req = &buf_page->buf_ioreq[(rdptr + 1) %
1116 IOREQ_BUFFER_SLOT_NUM];
1117 req.data |= ((uint64_t)buf_req->data) << 32;
1118 xen_rmb();
1121 handle_ioreq(state, &req);
1123 /* Only req.data may get updated by handle_ioreq(), albeit even that
1124 * should not happen as such data would never make it to the guest (we
1125 * can only usefully see writes here after all).
1127 assert(req.state == STATE_IOREQ_READY);
1128 assert(req.count == 1);
1129 assert(req.dir == IOREQ_WRITE);
1130 assert(!req.data_is_ptr);
1132 atomic_add(&buf_page->read_pointer, qw + 1);
1135 return req.count;
1138 static void handle_buffered_io(void *opaque)
1140 XenIOState *state = opaque;
1142 if (handle_buffered_iopage(state)) {
1143 timer_mod(state->buffered_io_timer,
1144 BUFFER_IO_MAX_DELAY + qemu_clock_get_ms(QEMU_CLOCK_REALTIME));
1145 } else {
1146 timer_del(state->buffered_io_timer);
1147 xenevtchn_unmask(state->xce_handle, state->bufioreq_local_port);
1151 static void cpu_handle_ioreq(void *opaque)
1153 XenIOState *state = opaque;
1154 ioreq_t *req = cpu_get_ioreq(state);
1156 handle_buffered_iopage(state);
1157 if (req) {
1158 ioreq_t copy = *req;
1160 xen_rmb();
1161 handle_ioreq(state, &copy);
1162 req->data = copy.data;
1164 if (req->state != STATE_IOREQ_INPROCESS) {
1165 fprintf(stderr, "Badness in I/O request ... not in service?!: "
1166 "%x, ptr: %x, port: %"PRIx64", "
1167 "data: %"PRIx64", count: %u, size: %u, type: %u\n",
1168 req->state, req->data_is_ptr, req->addr,
1169 req->data, req->count, req->size, req->type);
1170 destroy_hvm_domain(false);
1171 return;
1174 xen_wmb(); /* Update ioreq contents /then/ update state. */
1177 * We do this before we send the response so that the tools
1178 * have the opportunity to pick up on the reset before the
1179 * guest resumes and does a hlt with interrupts disabled which
1180 * causes Xen to powerdown the domain.
1182 if (runstate_is_running()) {
1183 ShutdownCause request;
1185 if (qemu_shutdown_requested_get()) {
1186 destroy_hvm_domain(false);
1188 request = qemu_reset_requested_get();
1189 if (request) {
1190 qemu_system_reset(request);
1191 destroy_hvm_domain(true);
1195 req->state = STATE_IORESP_READY;
1196 xenevtchn_notify(state->xce_handle,
1197 state->ioreq_local_port[state->send_vcpu]);
1201 static void xen_main_loop_prepare(XenIOState *state)
1203 int evtchn_fd = -1;
1205 if (state->xce_handle != NULL) {
1206 evtchn_fd = xenevtchn_fd(state->xce_handle);
1209 state->buffered_io_timer = timer_new_ms(QEMU_CLOCK_REALTIME, handle_buffered_io,
1210 state);
1212 if (evtchn_fd != -1) {
1213 CPUState *cpu_state;
1215 DPRINTF("%s: Init cpu_by_vcpu_id\n", __func__);
1216 CPU_FOREACH(cpu_state) {
1217 DPRINTF("%s: cpu_by_vcpu_id[%d]=%p\n",
1218 __func__, cpu_state->cpu_index, cpu_state);
1219 state->cpu_by_vcpu_id[cpu_state->cpu_index] = cpu_state;
1221 qemu_set_fd_handler(evtchn_fd, cpu_handle_ioreq, NULL, state);
1226 static void xen_hvm_change_state_handler(void *opaque, int running,
1227 RunState rstate)
1229 XenIOState *state = opaque;
1231 if (running) {
1232 xen_main_loop_prepare(state);
1235 xen_set_ioreq_server_state(xen_domid,
1236 state->ioservid,
1237 (rstate == RUN_STATE_RUNNING));
1240 static void xen_exit_notifier(Notifier *n, void *data)
1242 XenIOState *state = container_of(n, XenIOState, exit);
1244 xenevtchn_close(state->xce_handle);
1245 xs_daemon_close(state->xenstore);
1248 #ifdef XEN_COMPAT_PHYSMAP
1249 static void xen_read_physmap(XenIOState *state)
1251 XenPhysmap *physmap = NULL;
1252 unsigned int len, num, i;
1253 char path[80], *value = NULL;
1254 char **entries = NULL;
1256 snprintf(path, sizeof(path),
1257 "/local/domain/0/device-model/%d/physmap", xen_domid);
1258 entries = xs_directory(state->xenstore, 0, path, &num);
1259 if (entries == NULL)
1260 return;
1262 for (i = 0; i < num; i++) {
1263 physmap = g_malloc(sizeof (XenPhysmap));
1264 physmap->phys_offset = strtoull(entries[i], NULL, 16);
1265 snprintf(path, sizeof(path),
1266 "/local/domain/0/device-model/%d/physmap/%s/start_addr",
1267 xen_domid, entries[i]);
1268 value = xs_read(state->xenstore, 0, path, &len);
1269 if (value == NULL) {
1270 g_free(physmap);
1271 continue;
1273 physmap->start_addr = strtoull(value, NULL, 16);
1274 free(value);
1276 snprintf(path, sizeof(path),
1277 "/local/domain/0/device-model/%d/physmap/%s/size",
1278 xen_domid, entries[i]);
1279 value = xs_read(state->xenstore, 0, path, &len);
1280 if (value == NULL) {
1281 g_free(physmap);
1282 continue;
1284 physmap->size = strtoull(value, NULL, 16);
1285 free(value);
1287 snprintf(path, sizeof(path),
1288 "/local/domain/0/device-model/%d/physmap/%s/name",
1289 xen_domid, entries[i]);
1290 physmap->name = xs_read(state->xenstore, 0, path, &len);
1292 QLIST_INSERT_HEAD(&xen_physmap, physmap, list);
1294 free(entries);
1296 #else
1297 static void xen_read_physmap(XenIOState *state)
1300 #endif
1302 static void xen_wakeup_notifier(Notifier *notifier, void *data)
1304 xc_set_hvm_param(xen_xc, xen_domid, HVM_PARAM_ACPI_S_STATE, 0);
1307 static int xen_map_ioreq_server(XenIOState *state)
1309 void *addr = NULL;
1310 xenforeignmemory_resource_handle *fres;
1311 xen_pfn_t ioreq_pfn;
1312 xen_pfn_t bufioreq_pfn;
1313 evtchn_port_t bufioreq_evtchn;
1314 int rc;
1317 * Attempt to map using the resource API and fall back to normal
1318 * foreign mapping if this is not supported.
1320 QEMU_BUILD_BUG_ON(XENMEM_resource_ioreq_server_frame_bufioreq != 0);
1321 QEMU_BUILD_BUG_ON(XENMEM_resource_ioreq_server_frame_ioreq(0) != 1);
1322 fres = xenforeignmemory_map_resource(xen_fmem, xen_domid,
1323 XENMEM_resource_ioreq_server,
1324 state->ioservid, 0, 2,
1325 &addr,
1326 PROT_READ | PROT_WRITE, 0);
1327 if (fres != NULL) {
1328 trace_xen_map_resource_ioreq(state->ioservid, addr);
1329 state->buffered_io_page = addr;
1330 state->shared_page = addr + TARGET_PAGE_SIZE;
1331 } else if (errno != EOPNOTSUPP) {
1332 error_report("failed to map ioreq server resources: error %d handle=%p",
1333 errno, xen_xc);
1334 return -1;
1337 rc = xen_get_ioreq_server_info(xen_domid, state->ioservid,
1338 (state->shared_page == NULL) ?
1339 &ioreq_pfn : NULL,
1340 (state->buffered_io_page == NULL) ?
1341 &bufioreq_pfn : NULL,
1342 &bufioreq_evtchn);
1343 if (rc < 0) {
1344 error_report("failed to get ioreq server info: error %d handle=%p",
1345 errno, xen_xc);
1346 return rc;
1349 if (state->shared_page == NULL) {
1350 DPRINTF("shared page at pfn %lx\n", ioreq_pfn);
1352 state->shared_page = xenforeignmemory_map(xen_fmem, xen_domid,
1353 PROT_READ | PROT_WRITE,
1354 1, &ioreq_pfn, NULL);
1355 if (state->shared_page == NULL) {
1356 error_report("map shared IO page returned error %d handle=%p",
1357 errno, xen_xc);
1361 if (state->buffered_io_page == NULL) {
1362 DPRINTF("buffered io page at pfn %lx\n", bufioreq_pfn);
1364 state->buffered_io_page = xenforeignmemory_map(xen_fmem, xen_domid,
1365 PROT_READ | PROT_WRITE,
1366 1, &bufioreq_pfn,
1367 NULL);
1368 if (state->buffered_io_page == NULL) {
1369 error_report("map buffered IO page returned error %d", errno);
1370 return -1;
1374 if (state->shared_page == NULL || state->buffered_io_page == NULL) {
1375 return -1;
1378 DPRINTF("buffered io evtchn is %x\n", bufioreq_evtchn);
1380 state->bufioreq_remote_port = bufioreq_evtchn;
1382 return 0;
1385 void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory)
1387 int i, rc;
1388 xen_pfn_t ioreq_pfn;
1389 XenIOState *state;
1391 state = g_malloc0(sizeof (XenIOState));
1393 state->xce_handle = xenevtchn_open(NULL, 0);
1394 if (state->xce_handle == NULL) {
1395 perror("xen: event channel open");
1396 goto err;
1399 state->xenstore = xs_daemon_open();
1400 if (state->xenstore == NULL) {
1401 perror("xen: xenstore open");
1402 goto err;
1405 xen_create_ioreq_server(xen_domid, &state->ioservid);
1407 state->exit.notify = xen_exit_notifier;
1408 qemu_add_exit_notifier(&state->exit);
1410 state->suspend.notify = xen_suspend_notifier;
1411 qemu_register_suspend_notifier(&state->suspend);
1413 state->wakeup.notify = xen_wakeup_notifier;
1414 qemu_register_wakeup_notifier(&state->wakeup);
1417 * Register wake-up support in QMP query-current-machine API
1419 qemu_register_wakeup_support();
1421 rc = xen_map_ioreq_server(state);
1422 if (rc < 0) {
1423 goto err;
1426 rc = xen_get_vmport_regs_pfn(xen_xc, xen_domid, &ioreq_pfn);
1427 if (!rc) {
1428 DPRINTF("shared vmport page at pfn %lx\n", ioreq_pfn);
1429 state->shared_vmport_page =
1430 xenforeignmemory_map(xen_fmem, xen_domid, PROT_READ|PROT_WRITE,
1431 1, &ioreq_pfn, NULL);
1432 if (state->shared_vmport_page == NULL) {
1433 error_report("map shared vmport IO page returned error %d handle=%p",
1434 errno, xen_xc);
1435 goto err;
1437 } else if (rc != -ENOSYS) {
1438 error_report("get vmport regs pfn returned error %d, rc=%d",
1439 errno, rc);
1440 goto err;
1443 /* Note: cpus is empty at this point in init */
1444 state->cpu_by_vcpu_id = g_malloc0(max_cpus * sizeof(CPUState *));
1446 rc = xen_set_ioreq_server_state(xen_domid, state->ioservid, true);
1447 if (rc < 0) {
1448 error_report("failed to enable ioreq server info: error %d handle=%p",
1449 errno, xen_xc);
1450 goto err;
1453 state->ioreq_local_port = g_malloc0(max_cpus * sizeof (evtchn_port_t));
1455 /* FIXME: how about if we overflow the page here? */
1456 for (i = 0; i < max_cpus; i++) {
1457 rc = xenevtchn_bind_interdomain(state->xce_handle, xen_domid,
1458 xen_vcpu_eport(state->shared_page, i));
1459 if (rc == -1) {
1460 error_report("shared evtchn %d bind error %d", i, errno);
1461 goto err;
1463 state->ioreq_local_port[i] = rc;
1466 rc = xenevtchn_bind_interdomain(state->xce_handle, xen_domid,
1467 state->bufioreq_remote_port);
1468 if (rc == -1) {
1469 error_report("buffered evtchn bind error %d", errno);
1470 goto err;
1472 state->bufioreq_local_port = rc;
1474 /* Init RAM management */
1475 #ifdef XEN_COMPAT_PHYSMAP
1476 xen_map_cache_init(xen_phys_offset_to_gaddr, state);
1477 #else
1478 xen_map_cache_init(NULL, state);
1479 #endif
1480 xen_ram_init(pcms, ram_size, ram_memory);
1482 qemu_add_vm_change_state_handler(xen_hvm_change_state_handler, state);
1484 state->memory_listener = xen_memory_listener;
1485 memory_listener_register(&state->memory_listener, &address_space_memory);
1486 state->log_for_dirtybit = NULL;
1488 state->io_listener = xen_io_listener;
1489 memory_listener_register(&state->io_listener, &address_space_io);
1491 state->device_listener = xen_device_listener;
1492 QLIST_INIT(&state->dev_list);
1493 device_listener_register(&state->device_listener);
1495 xen_bus_init();
1497 /* Initialize backend core & drivers */
1498 if (xen_be_init() != 0) {
1499 error_report("xen backend core setup failed");
1500 goto err;
1502 xen_be_register_common();
1504 QLIST_INIT(&xen_physmap);
1505 xen_read_physmap(state);
1507 /* Disable ACPI build because Xen handles it */
1508 pcms->acpi_build_enabled = false;
1510 return;
1512 err:
1513 error_report("xen hardware virtual machine initialisation failed");
1514 exit(1);
1517 void destroy_hvm_domain(bool reboot)
1519 xc_interface *xc_handle;
1520 int sts;
1521 int rc;
1523 unsigned int reason = reboot ? SHUTDOWN_reboot : SHUTDOWN_poweroff;
1525 if (xen_dmod) {
1526 rc = xendevicemodel_shutdown(xen_dmod, xen_domid, reason);
1527 if (!rc) {
1528 return;
1530 if (errno != ENOTTY /* old Xen */) {
1531 perror("xendevicemodel_shutdown failed");
1533 /* well, try the old thing then */
1536 xc_handle = xc_interface_open(0, 0, 0);
1537 if (xc_handle == NULL) {
1538 fprintf(stderr, "Cannot acquire xenctrl handle\n");
1539 } else {
1540 sts = xc_domain_shutdown(xc_handle, xen_domid, reason);
1541 if (sts != 0) {
1542 fprintf(stderr, "xc_domain_shutdown failed to issue %s, "
1543 "sts %d, %s\n", reboot ? "reboot" : "poweroff",
1544 sts, strerror(errno));
1545 } else {
1546 fprintf(stderr, "Issued domain %d %s\n", xen_domid,
1547 reboot ? "reboot" : "poweroff");
1549 xc_interface_close(xc_handle);
1553 void xen_register_framebuffer(MemoryRegion *mr)
1555 framebuffer = mr;
1558 void xen_shutdown_fatal_error(const char *fmt, ...)
1560 va_list ap;
1562 va_start(ap, fmt);
1563 vfprintf(stderr, fmt, ap);
1564 va_end(ap);
1565 fprintf(stderr, "Will destroy the domain.\n");
1566 /* destroy the domain */
1567 qemu_system_shutdown_request(SHUTDOWN_CAUSE_HOST_ERROR);
1570 void xen_hvm_modified_memory(ram_addr_t start, ram_addr_t length)
1572 if (unlikely(xen_in_migration)) {
1573 int rc;
1574 ram_addr_t start_pfn, nb_pages;
1576 start = xen_phys_offset_to_gaddr(start, length);
1578 if (length == 0) {
1579 length = TARGET_PAGE_SIZE;
1581 start_pfn = start >> TARGET_PAGE_BITS;
1582 nb_pages = ((start + length + TARGET_PAGE_SIZE - 1) >> TARGET_PAGE_BITS)
1583 - start_pfn;
1584 rc = xen_modified_memory(xen_domid, start_pfn, nb_pages);
1585 if (rc) {
1586 fprintf(stderr,
1587 "%s failed for "RAM_ADDR_FMT" ("RAM_ADDR_FMT"): %i, %s\n",
1588 __func__, start, nb_pages, errno, strerror(errno));
1593 void qmp_xen_set_global_dirty_log(bool enable, Error **errp)
1595 if (enable) {
1596 memory_global_dirty_log_start();
1597 } else {
1598 memory_global_dirty_log_stop();