Merge remote-tracking branch 'remotes/kraxel/tags/pull-console-20140915-1' into staging
[sdk/emulator/qemu.git] / xen-hvm.c
1 /*
2  * Copyright (C) 2010       Citrix Ltd.
3  *
4  * This work is licensed under the terms of the GNU GPL, version 2.  See
5  * the COPYING file in the top-level directory.
6  *
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  */
10
11 #include <sys/mman.h>
12
13 #include "hw/pci/pci.h"
14 #include "hw/i386/pc.h"
15 #include "hw/xen/xen_common.h"
16 #include "hw/xen/xen_backend.h"
17 #include "qmp-commands.h"
18
19 #include "sysemu/char.h"
20 #include "qemu/range.h"
21 #include "sysemu/xen-mapcache.h"
22 #include "trace.h"
23 #include "exec/address-spaces.h"
24
25 #include <xen/hvm/ioreq.h>
26 #include <xen/hvm/params.h>
27 #include <xen/hvm/e820.h>
28
29 //#define DEBUG_XEN_HVM
30
31 #ifdef DEBUG_XEN_HVM
32 #define DPRINTF(fmt, ...) \
33     do { fprintf(stderr, "xen: " fmt, ## __VA_ARGS__); } while (0)
34 #else
35 #define DPRINTF(fmt, ...) \
36     do { } while (0)
37 #endif
38
39 static MemoryRegion ram_memory, ram_640k, ram_lo, ram_hi;
40 static MemoryRegion *framebuffer;
41 static bool xen_in_migration;
42
43 /* Compatibility with older version */
44 #if __XEN_LATEST_INTERFACE_VERSION__ < 0x0003020a
45 static inline uint32_t xen_vcpu_eport(shared_iopage_t *shared_page, int i)
46 {
47     return shared_page->vcpu_iodata[i].vp_eport;
48 }
49 static inline ioreq_t *xen_vcpu_ioreq(shared_iopage_t *shared_page, int vcpu)
50 {
51     return &shared_page->vcpu_iodata[vcpu].vp_ioreq;
52 }
53 #  define FMT_ioreq_size PRIx64
54 #else
55 static inline uint32_t xen_vcpu_eport(shared_iopage_t *shared_page, int i)
56 {
57     return shared_page->vcpu_ioreq[i].vp_eport;
58 }
59 static inline ioreq_t *xen_vcpu_ioreq(shared_iopage_t *shared_page, int vcpu)
60 {
61     return &shared_page->vcpu_ioreq[vcpu];
62 }
63 #  define FMT_ioreq_size "u"
64 #endif
65 #ifndef HVM_PARAM_BUFIOREQ_EVTCHN
66 #define HVM_PARAM_BUFIOREQ_EVTCHN 26
67 #endif
68
69 #define BUFFER_IO_MAX_DELAY  100
70
71 typedef struct XenPhysmap {
72     hwaddr start_addr;
73     ram_addr_t size;
74     const char *name;
75     hwaddr phys_offset;
76
77     QLIST_ENTRY(XenPhysmap) list;
78 } XenPhysmap;
79
80 typedef struct XenIOState {
81     shared_iopage_t *shared_page;
82     buffered_iopage_t *buffered_io_page;
83     QEMUTimer *buffered_io_timer;
84     /* the evtchn port for polling the notification, */
85     evtchn_port_t *ioreq_local_port;
86     /* evtchn local port for buffered io */
87     evtchn_port_t bufioreq_local_port;
88     /* the evtchn fd for polling */
89     XenEvtchn xce_handle;
90     /* which vcpu we are serving */
91     int send_vcpu;
92
93     struct xs_handle *xenstore;
94     MemoryListener memory_listener;
95     QLIST_HEAD(, XenPhysmap) physmap;
96     hwaddr free_phys_offset;
97     const XenPhysmap *log_for_dirtybit;
98
99     Notifier exit;
100     Notifier suspend;
101     Notifier wakeup;
102 } XenIOState;
103
104 /* Xen specific function for piix pci */
105
106 int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
107 {
108     return irq_num + ((pci_dev->devfn >> 3) << 2);
109 }
110
111 void xen_piix3_set_irq(void *opaque, int irq_num, int level)
112 {
113     xc_hvm_set_pci_intx_level(xen_xc, xen_domid, 0, 0, irq_num >> 2,
114                               irq_num & 3, level);
115 }
116
117 void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len)
118 {
119     int i;
120
121     /* Scan for updates to PCI link routes (0x60-0x63). */
122     for (i = 0; i < len; i++) {
123         uint8_t v = (val >> (8 * i)) & 0xff;
124         if (v & 0x80) {
125             v = 0;
126         }
127         v &= 0xf;
128         if (((address + i) >= 0x60) && ((address + i) <= 0x63)) {
129             xc_hvm_set_pci_link_route(xen_xc, xen_domid, address + i - 0x60, v);
130         }
131     }
132 }
133
134 void xen_hvm_inject_msi(uint64_t addr, uint32_t data)
135 {
136     xen_xc_hvm_inject_msi(xen_xc, xen_domid, addr, data);
137 }
138
139 static void xen_suspend_notifier(Notifier *notifier, void *data)
140 {
141     xc_set_hvm_param(xen_xc, xen_domid, HVM_PARAM_ACPI_S_STATE, 3);
142 }
143
144 /* Xen Interrupt Controller */
145
146 static void xen_set_irq(void *opaque, int irq, int level)
147 {
148     xc_hvm_set_isa_irq_level(xen_xc, xen_domid, irq, level);
149 }
150
151 qemu_irq *xen_interrupt_controller_init(void)
152 {
153     return qemu_allocate_irqs(xen_set_irq, NULL, 16);
154 }
155
156 /* Memory Ops */
157
158 static void xen_ram_init(ram_addr_t *below_4g_mem_size,
159                          ram_addr_t *above_4g_mem_size,
160                          ram_addr_t ram_size, MemoryRegion **ram_memory_p)
161 {
162     MemoryRegion *sysmem = get_system_memory();
163     ram_addr_t block_len;
164     uint64_t user_lowmem = object_property_get_int(qdev_get_machine(),
165                                                    PC_MACHINE_MAX_RAM_BELOW_4G,
166                                                    &error_abort);
167
168     /* Handle the machine opt max-ram-below-4g.  It is basically doing
169      * min(xen limit, user limit).
170      */
171     if (HVM_BELOW_4G_RAM_END <= user_lowmem) {
172         user_lowmem = HVM_BELOW_4G_RAM_END;
173     }
174
175     if (ram_size >= user_lowmem) {
176         *above_4g_mem_size = ram_size - user_lowmem;
177         *below_4g_mem_size = user_lowmem;
178     } else {
179         *above_4g_mem_size = 0;
180         *below_4g_mem_size = ram_size;
181     }
182     if (!*above_4g_mem_size) {
183         block_len = ram_size;
184     } else {
185         /*
186          * Xen does not allocate the memory continuously, it keeps a
187          * hole of the size computed above or passed in.
188          */
189         block_len = (1ULL << 32) + *above_4g_mem_size;
190     }
191     memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len,
192                            &error_abort);
193     *ram_memory_p = &ram_memory;
194     vmstate_register_ram_global(&ram_memory);
195
196     memory_region_init_alias(&ram_640k, NULL, "xen.ram.640k",
197                              &ram_memory, 0, 0xa0000);
198     memory_region_add_subregion(sysmem, 0, &ram_640k);
199     /* Skip of the VGA IO memory space, it will be registered later by the VGA
200      * emulated device.
201      *
202      * The area between 0xc0000 and 0x100000 will be used by SeaBIOS to load
203      * the Options ROM, so it is registered here as RAM.
204      */
205     memory_region_init_alias(&ram_lo, NULL, "xen.ram.lo",
206                              &ram_memory, 0xc0000,
207                              *below_4g_mem_size - 0xc0000);
208     memory_region_add_subregion(sysmem, 0xc0000, &ram_lo);
209     if (*above_4g_mem_size > 0) {
210         memory_region_init_alias(&ram_hi, NULL, "xen.ram.hi",
211                                  &ram_memory, 0x100000000ULL,
212                                  *above_4g_mem_size);
213         memory_region_add_subregion(sysmem, 0x100000000ULL, &ram_hi);
214     }
215 }
216
217 void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr)
218 {
219     unsigned long nr_pfn;
220     xen_pfn_t *pfn_list;
221     int i;
222
223     if (runstate_check(RUN_STATE_INMIGRATE)) {
224         /* RAM already populated in Xen */
225         fprintf(stderr, "%s: do not alloc "RAM_ADDR_FMT
226                 " bytes of ram at "RAM_ADDR_FMT" when runstate is INMIGRATE\n",
227                 __func__, size, ram_addr); 
228         return;
229     }
230
231     if (mr == &ram_memory) {
232         return;
233     }
234
235     trace_xen_ram_alloc(ram_addr, size);
236
237     nr_pfn = size >> TARGET_PAGE_BITS;
238     pfn_list = g_malloc(sizeof (*pfn_list) * nr_pfn);
239
240     for (i = 0; i < nr_pfn; i++) {
241         pfn_list[i] = (ram_addr >> TARGET_PAGE_BITS) + i;
242     }
243
244     if (xc_domain_populate_physmap_exact(xen_xc, xen_domid, nr_pfn, 0, 0, pfn_list)) {
245         hw_error("xen: failed to populate ram at " RAM_ADDR_FMT, ram_addr);
246     }
247
248     g_free(pfn_list);
249 }
250
251 static XenPhysmap *get_physmapping(XenIOState *state,
252                                    hwaddr start_addr, ram_addr_t size)
253 {
254     XenPhysmap *physmap = NULL;
255
256     start_addr &= TARGET_PAGE_MASK;
257
258     QLIST_FOREACH(physmap, &state->physmap, list) {
259         if (range_covers_byte(physmap->start_addr, physmap->size, start_addr)) {
260             return physmap;
261         }
262     }
263     return NULL;
264 }
265
266 static hwaddr xen_phys_offset_to_gaddr(hwaddr start_addr,
267                                                    ram_addr_t size, void *opaque)
268 {
269     hwaddr addr = start_addr & TARGET_PAGE_MASK;
270     XenIOState *xen_io_state = opaque;
271     XenPhysmap *physmap = NULL;
272
273     QLIST_FOREACH(physmap, &xen_io_state->physmap, list) {
274         if (range_covers_byte(physmap->phys_offset, physmap->size, addr)) {
275             return physmap->start_addr;
276         }
277     }
278
279     return start_addr;
280 }
281
282 #if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 340
283 static int xen_add_to_physmap(XenIOState *state,
284                               hwaddr start_addr,
285                               ram_addr_t size,
286                               MemoryRegion *mr,
287                               hwaddr offset_within_region)
288 {
289     unsigned long i = 0;
290     int rc = 0;
291     XenPhysmap *physmap = NULL;
292     hwaddr pfn, start_gpfn;
293     hwaddr phys_offset = memory_region_get_ram_addr(mr);
294     char path[80], value[17];
295     const char *mr_name;
296
297     if (get_physmapping(state, start_addr, size)) {
298         return 0;
299     }
300     if (size <= 0) {
301         return -1;
302     }
303
304     /* Xen can only handle a single dirty log region for now and we want
305      * the linear framebuffer to be that region.
306      * Avoid tracking any regions that is not videoram and avoid tracking
307      * the legacy vga region. */
308     if (mr == framebuffer && start_addr > 0xbffff) {
309         goto go_physmap;
310     }
311     return -1;
312
313 go_physmap:
314     DPRINTF("mapping vram to %"HWADDR_PRIx" - %"HWADDR_PRIx"\n",
315             start_addr, start_addr + size);
316
317     pfn = phys_offset >> TARGET_PAGE_BITS;
318     start_gpfn = start_addr >> TARGET_PAGE_BITS;
319     for (i = 0; i < size >> TARGET_PAGE_BITS; i++) {
320         unsigned long idx = pfn + i;
321         xen_pfn_t gpfn = start_gpfn + i;
322
323         rc = xc_domain_add_to_physmap(xen_xc, xen_domid, XENMAPSPACE_gmfn, idx, gpfn);
324         if (rc) {
325             DPRINTF("add_to_physmap MFN %"PRI_xen_pfn" to PFN %"
326                     PRI_xen_pfn" failed: %d\n", idx, gpfn, rc);
327             return -rc;
328         }
329     }
330
331     mr_name = memory_region_name(mr);
332
333     physmap = g_malloc(sizeof (XenPhysmap));
334
335     physmap->start_addr = start_addr;
336     physmap->size = size;
337     physmap->name = mr_name;
338     physmap->phys_offset = phys_offset;
339
340     QLIST_INSERT_HEAD(&state->physmap, physmap, list);
341
342     xc_domain_pin_memory_cacheattr(xen_xc, xen_domid,
343                                    start_addr >> TARGET_PAGE_BITS,
344                                    (start_addr + size - 1) >> TARGET_PAGE_BITS,
345                                    XEN_DOMCTL_MEM_CACHEATTR_WB);
346
347     snprintf(path, sizeof(path),
348             "/local/domain/0/device-model/%d/physmap/%"PRIx64"/start_addr",
349             xen_domid, (uint64_t)phys_offset);
350     snprintf(value, sizeof(value), "%"PRIx64, (uint64_t)start_addr);
351     if (!xs_write(state->xenstore, 0, path, value, strlen(value))) {
352         return -1;
353     }
354     snprintf(path, sizeof(path),
355             "/local/domain/0/device-model/%d/physmap/%"PRIx64"/size",
356             xen_domid, (uint64_t)phys_offset);
357     snprintf(value, sizeof(value), "%"PRIx64, (uint64_t)size);
358     if (!xs_write(state->xenstore, 0, path, value, strlen(value))) {
359         return -1;
360     }
361     if (mr_name) {
362         snprintf(path, sizeof(path),
363                 "/local/domain/0/device-model/%d/physmap/%"PRIx64"/name",
364                 xen_domid, (uint64_t)phys_offset);
365         if (!xs_write(state->xenstore, 0, path, mr_name, strlen(mr_name))) {
366             return -1;
367         }
368     }
369
370     return 0;
371 }
372
373 static int xen_remove_from_physmap(XenIOState *state,
374                                    hwaddr start_addr,
375                                    ram_addr_t size)
376 {
377     unsigned long i = 0;
378     int rc = 0;
379     XenPhysmap *physmap = NULL;
380     hwaddr phys_offset = 0;
381
382     physmap = get_physmapping(state, start_addr, size);
383     if (physmap == NULL) {
384         return -1;
385     }
386
387     phys_offset = physmap->phys_offset;
388     size = physmap->size;
389
390     DPRINTF("unmapping vram to %"HWADDR_PRIx" - %"HWADDR_PRIx", at "
391             "%"HWADDR_PRIx"\n", start_addr, start_addr + size, phys_offset);
392
393     size >>= TARGET_PAGE_BITS;
394     start_addr >>= TARGET_PAGE_BITS;
395     phys_offset >>= TARGET_PAGE_BITS;
396     for (i = 0; i < size; i++) {
397         xen_pfn_t idx = start_addr + i;
398         xen_pfn_t gpfn = phys_offset + i;
399
400         rc = xc_domain_add_to_physmap(xen_xc, xen_domid, XENMAPSPACE_gmfn, idx, gpfn);
401         if (rc) {
402             fprintf(stderr, "add_to_physmap MFN %"PRI_xen_pfn" to PFN %"
403                     PRI_xen_pfn" failed: %d\n", idx, gpfn, rc);
404             return -rc;
405         }
406     }
407
408     QLIST_REMOVE(physmap, list);
409     if (state->log_for_dirtybit == physmap) {
410         state->log_for_dirtybit = NULL;
411     }
412     g_free(physmap);
413
414     return 0;
415 }
416
417 #else
418 static int xen_add_to_physmap(XenIOState *state,
419                               hwaddr start_addr,
420                               ram_addr_t size,
421                               MemoryRegion *mr,
422                               hwaddr offset_within_region)
423 {
424     return -ENOSYS;
425 }
426
427 static int xen_remove_from_physmap(XenIOState *state,
428                                    hwaddr start_addr,
429                                    ram_addr_t size)
430 {
431     return -ENOSYS;
432 }
433 #endif
434
435 static void xen_set_memory(struct MemoryListener *listener,
436                            MemoryRegionSection *section,
437                            bool add)
438 {
439     XenIOState *state = container_of(listener, XenIOState, memory_listener);
440     hwaddr start_addr = section->offset_within_address_space;
441     ram_addr_t size = int128_get64(section->size);
442     bool log_dirty = memory_region_is_logging(section->mr);
443     hvmmem_type_t mem_type;
444
445     if (!memory_region_is_ram(section->mr)) {
446         return;
447     }
448
449     if (!(section->mr != &ram_memory
450           && ( (log_dirty && add) || (!log_dirty && !add)))) {
451         return;
452     }
453
454     trace_xen_client_set_memory(start_addr, size, log_dirty);
455
456     start_addr &= TARGET_PAGE_MASK;
457     size = TARGET_PAGE_ALIGN(size);
458
459     if (add) {
460         if (!memory_region_is_rom(section->mr)) {
461             xen_add_to_physmap(state, start_addr, size,
462                                section->mr, section->offset_within_region);
463         } else {
464             mem_type = HVMMEM_ram_ro;
465             if (xc_hvm_set_mem_type(xen_xc, xen_domid, mem_type,
466                                     start_addr >> TARGET_PAGE_BITS,
467                                     size >> TARGET_PAGE_BITS)) {
468                 DPRINTF("xc_hvm_set_mem_type error, addr: "TARGET_FMT_plx"\n",
469                         start_addr);
470             }
471         }
472     } else {
473         if (xen_remove_from_physmap(state, start_addr, size) < 0) {
474             DPRINTF("physmapping does not exist at "TARGET_FMT_plx"\n", start_addr);
475         }
476     }
477 }
478
479 static void xen_region_add(MemoryListener *listener,
480                            MemoryRegionSection *section)
481 {
482     memory_region_ref(section->mr);
483     xen_set_memory(listener, section, true);
484 }
485
486 static void xen_region_del(MemoryListener *listener,
487                            MemoryRegionSection *section)
488 {
489     xen_set_memory(listener, section, false);
490     memory_region_unref(section->mr);
491 }
492
493 static void xen_sync_dirty_bitmap(XenIOState *state,
494                                   hwaddr start_addr,
495                                   ram_addr_t size)
496 {
497     hwaddr npages = size >> TARGET_PAGE_BITS;
498     const int width = sizeof(unsigned long) * 8;
499     unsigned long bitmap[(npages + width - 1) / width];
500     int rc, i, j;
501     const XenPhysmap *physmap = NULL;
502
503     physmap = get_physmapping(state, start_addr, size);
504     if (physmap == NULL) {
505         /* not handled */
506         return;
507     }
508
509     if (state->log_for_dirtybit == NULL) {
510         state->log_for_dirtybit = physmap;
511     } else if (state->log_for_dirtybit != physmap) {
512         /* Only one range for dirty bitmap can be tracked. */
513         return;
514     }
515
516     rc = xc_hvm_track_dirty_vram(xen_xc, xen_domid,
517                                  start_addr >> TARGET_PAGE_BITS, npages,
518                                  bitmap);
519     if (rc < 0) {
520 #ifndef ENODATA
521 #define ENODATA  ENOENT
522 #endif
523         if (errno == ENODATA) {
524             memory_region_set_dirty(framebuffer, 0, size);
525             DPRINTF("xen: track_dirty_vram failed (0x" TARGET_FMT_plx
526                     ", 0x" TARGET_FMT_plx "): %s\n",
527                     start_addr, start_addr + size, strerror(errno));
528         }
529         return;
530     }
531
532     for (i = 0; i < ARRAY_SIZE(bitmap); i++) {
533         unsigned long map = bitmap[i];
534         while (map != 0) {
535             j = ctzl(map);
536             map &= ~(1ul << j);
537             memory_region_set_dirty(framebuffer,
538                                     (i * width + j) * TARGET_PAGE_SIZE,
539                                     TARGET_PAGE_SIZE);
540         };
541     }
542 }
543
544 static void xen_log_start(MemoryListener *listener,
545                           MemoryRegionSection *section)
546 {
547     XenIOState *state = container_of(listener, XenIOState, memory_listener);
548
549     xen_sync_dirty_bitmap(state, section->offset_within_address_space,
550                           int128_get64(section->size));
551 }
552
553 static void xen_log_stop(MemoryListener *listener, MemoryRegionSection *section)
554 {
555     XenIOState *state = container_of(listener, XenIOState, memory_listener);
556
557     state->log_for_dirtybit = NULL;
558     /* Disable dirty bit tracking */
559     xc_hvm_track_dirty_vram(xen_xc, xen_domid, 0, 0, NULL);
560 }
561
562 static void xen_log_sync(MemoryListener *listener, MemoryRegionSection *section)
563 {
564     XenIOState *state = container_of(listener, XenIOState, memory_listener);
565
566     xen_sync_dirty_bitmap(state, section->offset_within_address_space,
567                           int128_get64(section->size));
568 }
569
570 static void xen_log_global_start(MemoryListener *listener)
571 {
572     if (xen_enabled()) {
573         xen_in_migration = true;
574     }
575 }
576
577 static void xen_log_global_stop(MemoryListener *listener)
578 {
579     xen_in_migration = false;
580 }
581
582 static MemoryListener xen_memory_listener = {
583     .region_add = xen_region_add,
584     .region_del = xen_region_del,
585     .log_start = xen_log_start,
586     .log_stop = xen_log_stop,
587     .log_sync = xen_log_sync,
588     .log_global_start = xen_log_global_start,
589     .log_global_stop = xen_log_global_stop,
590     .priority = 10,
591 };
592
593 /* get the ioreq packets from share mem */
594 static ioreq_t *cpu_get_ioreq_from_shared_memory(XenIOState *state, int vcpu)
595 {
596     ioreq_t *req = xen_vcpu_ioreq(state->shared_page, vcpu);
597
598     if (req->state != STATE_IOREQ_READY) {
599         DPRINTF("I/O request not ready: "
600                 "%x, ptr: %x, port: %"PRIx64", "
601                 "data: %"PRIx64", count: %" FMT_ioreq_size ", size: %" FMT_ioreq_size "\n",
602                 req->state, req->data_is_ptr, req->addr,
603                 req->data, req->count, req->size);
604         return NULL;
605     }
606
607     xen_rmb(); /* see IOREQ_READY /then/ read contents of ioreq */
608
609     req->state = STATE_IOREQ_INPROCESS;
610     return req;
611 }
612
613 /* use poll to get the port notification */
614 /* ioreq_vec--out,the */
615 /* retval--the number of ioreq packet */
616 static ioreq_t *cpu_get_ioreq(XenIOState *state)
617 {
618     int i;
619     evtchn_port_t port;
620
621     port = xc_evtchn_pending(state->xce_handle);
622     if (port == state->bufioreq_local_port) {
623         timer_mod(state->buffered_io_timer,
624                 BUFFER_IO_MAX_DELAY + qemu_clock_get_ms(QEMU_CLOCK_REALTIME));
625         return NULL;
626     }
627
628     if (port != -1) {
629         for (i = 0; i < max_cpus; i++) {
630             if (state->ioreq_local_port[i] == port) {
631                 break;
632             }
633         }
634
635         if (i == max_cpus) {
636             hw_error("Fatal error while trying to get io event!\n");
637         }
638
639         /* unmask the wanted port again */
640         xc_evtchn_unmask(state->xce_handle, port);
641
642         /* get the io packet from shared memory */
643         state->send_vcpu = i;
644         return cpu_get_ioreq_from_shared_memory(state, i);
645     }
646
647     /* read error or read nothing */
648     return NULL;
649 }
650
651 static uint32_t do_inp(pio_addr_t addr, unsigned long size)
652 {
653     switch (size) {
654         case 1:
655             return cpu_inb(addr);
656         case 2:
657             return cpu_inw(addr);
658         case 4:
659             return cpu_inl(addr);
660         default:
661             hw_error("inp: bad size: %04"FMT_pioaddr" %lx", addr, size);
662     }
663 }
664
665 static void do_outp(pio_addr_t addr,
666         unsigned long size, uint32_t val)
667 {
668     switch (size) {
669         case 1:
670             return cpu_outb(addr, val);
671         case 2:
672             return cpu_outw(addr, val);
673         case 4:
674             return cpu_outl(addr, val);
675         default:
676             hw_error("outp: bad size: %04"FMT_pioaddr" %lx", addr, size);
677     }
678 }
679
680 /*
681  * Helper functions which read/write an object from/to physical guest
682  * memory, as part of the implementation of an ioreq.
683  *
684  * Equivalent to
685  *   cpu_physical_memory_rw(addr + (req->df ? -1 : +1) * req->size * i,
686  *                          val, req->size, 0/1)
687  * except without the integer overflow problems.
688  */
689 static void rw_phys_req_item(hwaddr addr,
690                              ioreq_t *req, uint32_t i, void *val, int rw)
691 {
692     /* Do everything unsigned so overflow just results in a truncated result
693      * and accesses to undesired parts of guest memory, which is up
694      * to the guest */
695     hwaddr offset = (hwaddr)req->size * i;
696     if (req->df) {
697         addr -= offset;
698     } else {
699         addr += offset;
700     }
701     cpu_physical_memory_rw(addr, val, req->size, rw);
702 }
703
704 static inline void read_phys_req_item(hwaddr addr,
705                                       ioreq_t *req, uint32_t i, void *val)
706 {
707     rw_phys_req_item(addr, req, i, val, 0);
708 }
709 static inline void write_phys_req_item(hwaddr addr,
710                                        ioreq_t *req, uint32_t i, void *val)
711 {
712     rw_phys_req_item(addr, req, i, val, 1);
713 }
714
715
716 static void cpu_ioreq_pio(ioreq_t *req)
717 {
718     uint32_t i;
719
720     if (req->dir == IOREQ_READ) {
721         if (!req->data_is_ptr) {
722             req->data = do_inp(req->addr, req->size);
723         } else {
724             uint32_t tmp;
725
726             for (i = 0; i < req->count; i++) {
727                 tmp = do_inp(req->addr, req->size);
728                 write_phys_req_item(req->data, req, i, &tmp);
729             }
730         }
731     } else if (req->dir == IOREQ_WRITE) {
732         if (!req->data_is_ptr) {
733             do_outp(req->addr, req->size, req->data);
734         } else {
735             for (i = 0; i < req->count; i++) {
736                 uint32_t tmp = 0;
737
738                 read_phys_req_item(req->data, req, i, &tmp);
739                 do_outp(req->addr, req->size, tmp);
740             }
741         }
742     }
743 }
744
745 static void cpu_ioreq_move(ioreq_t *req)
746 {
747     uint32_t i;
748
749     if (!req->data_is_ptr) {
750         if (req->dir == IOREQ_READ) {
751             for (i = 0; i < req->count; i++) {
752                 read_phys_req_item(req->addr, req, i, &req->data);
753             }
754         } else if (req->dir == IOREQ_WRITE) {
755             for (i = 0; i < req->count; i++) {
756                 write_phys_req_item(req->addr, req, i, &req->data);
757             }
758         }
759     } else {
760         uint64_t tmp;
761
762         if (req->dir == IOREQ_READ) {
763             for (i = 0; i < req->count; i++) {
764                 read_phys_req_item(req->addr, req, i, &tmp);
765                 write_phys_req_item(req->data, req, i, &tmp);
766             }
767         } else if (req->dir == IOREQ_WRITE) {
768             for (i = 0; i < req->count; i++) {
769                 read_phys_req_item(req->data, req, i, &tmp);
770                 write_phys_req_item(req->addr, req, i, &tmp);
771             }
772         }
773     }
774 }
775
776 static void handle_ioreq(ioreq_t *req)
777 {
778     if (!req->data_is_ptr && (req->dir == IOREQ_WRITE) &&
779             (req->size < sizeof (target_ulong))) {
780         req->data &= ((target_ulong) 1 << (8 * req->size)) - 1;
781     }
782
783     switch (req->type) {
784         case IOREQ_TYPE_PIO:
785             cpu_ioreq_pio(req);
786             break;
787         case IOREQ_TYPE_COPY:
788             cpu_ioreq_move(req);
789             break;
790         case IOREQ_TYPE_TIMEOFFSET:
791             break;
792         case IOREQ_TYPE_INVALIDATE:
793             xen_invalidate_map_cache();
794             break;
795         default:
796             hw_error("Invalid ioreq type 0x%x\n", req->type);
797     }
798 }
799
800 static int handle_buffered_iopage(XenIOState *state)
801 {
802     buf_ioreq_t *buf_req = NULL;
803     ioreq_t req;
804     int qw;
805
806     if (!state->buffered_io_page) {
807         return 0;
808     }
809
810     memset(&req, 0x00, sizeof(req));
811
812     while (state->buffered_io_page->read_pointer != state->buffered_io_page->write_pointer) {
813         buf_req = &state->buffered_io_page->buf_ioreq[
814             state->buffered_io_page->read_pointer % IOREQ_BUFFER_SLOT_NUM];
815         req.size = 1UL << buf_req->size;
816         req.count = 1;
817         req.addr = buf_req->addr;
818         req.data = buf_req->data;
819         req.state = STATE_IOREQ_READY;
820         req.dir = buf_req->dir;
821         req.df = 1;
822         req.type = buf_req->type;
823         req.data_is_ptr = 0;
824         qw = (req.size == 8);
825         if (qw) {
826             buf_req = &state->buffered_io_page->buf_ioreq[
827                 (state->buffered_io_page->read_pointer + 1) % IOREQ_BUFFER_SLOT_NUM];
828             req.data |= ((uint64_t)buf_req->data) << 32;
829         }
830
831         handle_ioreq(&req);
832
833         xen_mb();
834         state->buffered_io_page->read_pointer += qw ? 2 : 1;
835     }
836
837     return req.count;
838 }
839
840 static void handle_buffered_io(void *opaque)
841 {
842     XenIOState *state = opaque;
843
844     if (handle_buffered_iopage(state)) {
845         timer_mod(state->buffered_io_timer,
846                 BUFFER_IO_MAX_DELAY + qemu_clock_get_ms(QEMU_CLOCK_REALTIME));
847     } else {
848         timer_del(state->buffered_io_timer);
849         xc_evtchn_unmask(state->xce_handle, state->bufioreq_local_port);
850     }
851 }
852
853 static void cpu_handle_ioreq(void *opaque)
854 {
855     XenIOState *state = opaque;
856     ioreq_t *req = cpu_get_ioreq(state);
857
858     handle_buffered_iopage(state);
859     if (req) {
860         handle_ioreq(req);
861
862         if (req->state != STATE_IOREQ_INPROCESS) {
863             fprintf(stderr, "Badness in I/O request ... not in service?!: "
864                     "%x, ptr: %x, port: %"PRIx64", "
865                     "data: %"PRIx64", count: %" FMT_ioreq_size ", size: %" FMT_ioreq_size "\n",
866                     req->state, req->data_is_ptr, req->addr,
867                     req->data, req->count, req->size);
868             destroy_hvm_domain(false);
869             return;
870         }
871
872         xen_wmb(); /* Update ioreq contents /then/ update state. */
873
874         /*
875          * We do this before we send the response so that the tools
876          * have the opportunity to pick up on the reset before the
877          * guest resumes and does a hlt with interrupts disabled which
878          * causes Xen to powerdown the domain.
879          */
880         if (runstate_is_running()) {
881             if (qemu_shutdown_requested_get()) {
882                 destroy_hvm_domain(false);
883             }
884             if (qemu_reset_requested_get()) {
885                 qemu_system_reset(VMRESET_REPORT);
886                 destroy_hvm_domain(true);
887             }
888         }
889
890         req->state = STATE_IORESP_READY;
891         xc_evtchn_notify(state->xce_handle, state->ioreq_local_port[state->send_vcpu]);
892     }
893 }
894
895 static void xen_main_loop_prepare(XenIOState *state)
896 {
897     int evtchn_fd = -1;
898
899     if (state->xce_handle != XC_HANDLER_INITIAL_VALUE) {
900         evtchn_fd = xc_evtchn_fd(state->xce_handle);
901     }
902
903     state->buffered_io_timer = timer_new_ms(QEMU_CLOCK_REALTIME, handle_buffered_io,
904                                                  state);
905
906     if (evtchn_fd != -1) {
907         qemu_set_fd_handler(evtchn_fd, cpu_handle_ioreq, NULL, state);
908     }
909 }
910
911
912 static void xen_hvm_change_state_handler(void *opaque, int running,
913                                          RunState rstate)
914 {
915     XenIOState *xstate = opaque;
916     if (running) {
917         xen_main_loop_prepare(xstate);
918     }
919 }
920
921 static void xen_exit_notifier(Notifier *n, void *data)
922 {
923     XenIOState *state = container_of(n, XenIOState, exit);
924
925     xc_evtchn_close(state->xce_handle);
926     xs_daemon_close(state->xenstore);
927 }
928
929 static void xen_read_physmap(XenIOState *state)
930 {
931     XenPhysmap *physmap = NULL;
932     unsigned int len, num, i;
933     char path[80], *value = NULL;
934     char **entries = NULL;
935
936     snprintf(path, sizeof(path),
937             "/local/domain/0/device-model/%d/physmap", xen_domid);
938     entries = xs_directory(state->xenstore, 0, path, &num);
939     if (entries == NULL)
940         return;
941
942     for (i = 0; i < num; i++) {
943         physmap = g_malloc(sizeof (XenPhysmap));
944         physmap->phys_offset = strtoull(entries[i], NULL, 16);
945         snprintf(path, sizeof(path),
946                 "/local/domain/0/device-model/%d/physmap/%s/start_addr",
947                 xen_domid, entries[i]);
948         value = xs_read(state->xenstore, 0, path, &len);
949         if (value == NULL) {
950             g_free(physmap);
951             continue;
952         }
953         physmap->start_addr = strtoull(value, NULL, 16);
954         free(value);
955
956         snprintf(path, sizeof(path),
957                 "/local/domain/0/device-model/%d/physmap/%s/size",
958                 xen_domid, entries[i]);
959         value = xs_read(state->xenstore, 0, path, &len);
960         if (value == NULL) {
961             g_free(physmap);
962             continue;
963         }
964         physmap->size = strtoull(value, NULL, 16);
965         free(value);
966
967         snprintf(path, sizeof(path),
968                 "/local/domain/0/device-model/%d/physmap/%s/name",
969                 xen_domid, entries[i]);
970         physmap->name = xs_read(state->xenstore, 0, path, &len);
971
972         QLIST_INSERT_HEAD(&state->physmap, physmap, list);
973     }
974     free(entries);
975 }
976
977 static void xen_wakeup_notifier(Notifier *notifier, void *data)
978 {
979     xc_set_hvm_param(xen_xc, xen_domid, HVM_PARAM_ACPI_S_STATE, 0);
980 }
981
982 int xen_hvm_init(ram_addr_t *below_4g_mem_size, ram_addr_t *above_4g_mem_size,
983                  MemoryRegion **ram_memory)
984 {
985     int i, rc;
986     unsigned long ioreq_pfn;
987     unsigned long bufioreq_evtchn;
988     XenIOState *state;
989
990     state = g_malloc0(sizeof (XenIOState));
991
992     state->xce_handle = xen_xc_evtchn_open(NULL, 0);
993     if (state->xce_handle == XC_HANDLER_INITIAL_VALUE) {
994         perror("xen: event channel open");
995         g_free(state);
996         return -errno;
997     }
998
999     state->xenstore = xs_daemon_open();
1000     if (state->xenstore == NULL) {
1001         perror("xen: xenstore open");
1002         g_free(state);
1003         return -errno;
1004     }
1005
1006     state->exit.notify = xen_exit_notifier;
1007     qemu_add_exit_notifier(&state->exit);
1008
1009     state->suspend.notify = xen_suspend_notifier;
1010     qemu_register_suspend_notifier(&state->suspend);
1011
1012     state->wakeup.notify = xen_wakeup_notifier;
1013     qemu_register_wakeup_notifier(&state->wakeup);
1014
1015     xc_get_hvm_param(xen_xc, xen_domid, HVM_PARAM_IOREQ_PFN, &ioreq_pfn);
1016     DPRINTF("shared page at pfn %lx\n", ioreq_pfn);
1017     state->shared_page = xc_map_foreign_range(xen_xc, xen_domid, XC_PAGE_SIZE,
1018                                               PROT_READ|PROT_WRITE, ioreq_pfn);
1019     if (state->shared_page == NULL) {
1020         hw_error("map shared IO page returned error %d handle=" XC_INTERFACE_FMT,
1021                  errno, xen_xc);
1022     }
1023
1024     xc_get_hvm_param(xen_xc, xen_domid, HVM_PARAM_BUFIOREQ_PFN, &ioreq_pfn);
1025     DPRINTF("buffered io page at pfn %lx\n", ioreq_pfn);
1026     state->buffered_io_page = xc_map_foreign_range(xen_xc, xen_domid, XC_PAGE_SIZE,
1027                                                    PROT_READ|PROT_WRITE, ioreq_pfn);
1028     if (state->buffered_io_page == NULL) {
1029         hw_error("map buffered IO page returned error %d", errno);
1030     }
1031
1032     state->ioreq_local_port = g_malloc0(max_cpus * sizeof (evtchn_port_t));
1033
1034     /* FIXME: how about if we overflow the page here? */
1035     for (i = 0; i < max_cpus; i++) {
1036         rc = xc_evtchn_bind_interdomain(state->xce_handle, xen_domid,
1037                                         xen_vcpu_eport(state->shared_page, i));
1038         if (rc == -1) {
1039             fprintf(stderr, "bind interdomain ioctl error %d\n", errno);
1040             return -1;
1041         }
1042         state->ioreq_local_port[i] = rc;
1043     }
1044
1045     rc = xc_get_hvm_param(xen_xc, xen_domid, HVM_PARAM_BUFIOREQ_EVTCHN,
1046             &bufioreq_evtchn);
1047     if (rc < 0) {
1048         fprintf(stderr, "failed to get HVM_PARAM_BUFIOREQ_EVTCHN\n");
1049         return -1;
1050     }
1051     rc = xc_evtchn_bind_interdomain(state->xce_handle, xen_domid,
1052             (uint32_t)bufioreq_evtchn);
1053     if (rc == -1) {
1054         fprintf(stderr, "bind interdomain ioctl error %d\n", errno);
1055         return -1;
1056     }
1057     state->bufioreq_local_port = rc;
1058
1059     /* Init RAM management */
1060     xen_map_cache_init(xen_phys_offset_to_gaddr, state);
1061     xen_ram_init(below_4g_mem_size, above_4g_mem_size, ram_size, ram_memory);
1062
1063     qemu_add_vm_change_state_handler(xen_hvm_change_state_handler, state);
1064
1065     state->memory_listener = xen_memory_listener;
1066     QLIST_INIT(&state->physmap);
1067     memory_listener_register(&state->memory_listener, &address_space_memory);
1068     state->log_for_dirtybit = NULL;
1069
1070     /* Initialize backend core & drivers */
1071     if (xen_be_init() != 0) {
1072         fprintf(stderr, "%s: xen backend core setup failed\n", __FUNCTION__);
1073         exit(1);
1074     }
1075     xen_be_register("console", &xen_console_ops);
1076     xen_be_register("vkbd", &xen_kbdmouse_ops);
1077     xen_be_register("qdisk", &xen_blkdev_ops);
1078     xen_read_physmap(state);
1079
1080     return 0;
1081 }
1082
1083 void destroy_hvm_domain(bool reboot)
1084 {
1085     XenXC xc_handle;
1086     int sts;
1087
1088     xc_handle = xen_xc_interface_open(0, 0, 0);
1089     if (xc_handle == XC_HANDLER_INITIAL_VALUE) {
1090         fprintf(stderr, "Cannot acquire xenctrl handle\n");
1091     } else {
1092         sts = xc_domain_shutdown(xc_handle, xen_domid,
1093                                  reboot ? SHUTDOWN_reboot : SHUTDOWN_poweroff);
1094         if (sts != 0) {
1095             fprintf(stderr, "xc_domain_shutdown failed to issue %s, "
1096                     "sts %d, %s\n", reboot ? "reboot" : "poweroff",
1097                     sts, strerror(errno));
1098         } else {
1099             fprintf(stderr, "Issued domain %d %s\n", xen_domid,
1100                     reboot ? "reboot" : "poweroff");
1101         }
1102         xc_interface_close(xc_handle);
1103     }
1104 }
1105
1106 void xen_register_framebuffer(MemoryRegion *mr)
1107 {
1108     framebuffer = mr;
1109 }
1110
1111 void xen_shutdown_fatal_error(const char *fmt, ...)
1112 {
1113     va_list ap;
1114
1115     va_start(ap, fmt);
1116     vfprintf(stderr, fmt, ap);
1117     va_end(ap);
1118     fprintf(stderr, "Will destroy the domain.\n");
1119     /* destroy the domain */
1120     qemu_system_shutdown_request();
1121 }
1122
1123 void xen_modified_memory(ram_addr_t start, ram_addr_t length)
1124 {
1125     if (unlikely(xen_in_migration)) {
1126         int rc;
1127         ram_addr_t start_pfn, nb_pages;
1128
1129         if (length == 0) {
1130             length = TARGET_PAGE_SIZE;
1131         }
1132         start_pfn = start >> TARGET_PAGE_BITS;
1133         nb_pages = ((start + length + TARGET_PAGE_SIZE - 1) >> TARGET_PAGE_BITS)
1134             - start_pfn;
1135         rc = xc_hvm_modified_memory(xen_xc, xen_domid, start_pfn, nb_pages);
1136         if (rc) {
1137             fprintf(stderr,
1138                     "%s failed for "RAM_ADDR_FMT" ("RAM_ADDR_FMT"): %i, %s\n",
1139                     __func__, start, nb_pages, rc, strerror(-rc));
1140         }
1141     }
1142 }
1143
1144 void qmp_xen_set_global_dirty_log(bool enable, Error **errp)
1145 {
1146     if (enable) {
1147         memory_global_dirty_log_start();
1148     } else {
1149         memory_global_dirty_log_stop();
1150     }
1151 }