xen_common.h (22154B)
1#ifndef QEMU_HW_XEN_COMMON_H 2#define QEMU_HW_XEN_COMMON_H 3 4/* 5 * If we have new enough libxenctrl then we do not want/need these compat 6 * interfaces, despite what the user supplied cflags might say. They 7 * must be undefined before including xenctrl.h 8 */ 9#undef XC_WANT_COMPAT_EVTCHN_API 10#undef XC_WANT_COMPAT_GNTTAB_API 11#undef XC_WANT_COMPAT_MAP_FOREIGN_API 12 13#include <xenctrl.h> 14#include <xenstore.h> 15#include "hw/xen/interface/io/xenbus.h" 16 17#include "hw/xen/xen.h" 18#include "hw/pci/pci.h" 19#include "hw/xen/trace.h" 20 21extern xc_interface *xen_xc; 22 23/* 24 * We don't support Xen prior to 4.2.0. 25 */ 26 27/* Xen 4.2 through 4.6 */ 28#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40701 29 30typedef xc_interface xenforeignmemory_handle; 31typedef xc_evtchn xenevtchn_handle; 32typedef xc_gnttab xengnttab_handle; 33typedef evtchn_port_or_error_t xenevtchn_port_or_error_t; 34 35#define xenevtchn_open(l, f) xc_evtchn_open(l, f); 36#define xenevtchn_close(h) xc_evtchn_close(h) 37#define xenevtchn_fd(h) xc_evtchn_fd(h) 38#define xenevtchn_pending(h) xc_evtchn_pending(h) 39#define xenevtchn_notify(h, p) xc_evtchn_notify(h, p) 40#define xenevtchn_bind_interdomain(h, d, p) xc_evtchn_bind_interdomain(h, d, p) 41#define xenevtchn_unmask(h, p) xc_evtchn_unmask(h, p) 42#define xenevtchn_unbind(h, p) xc_evtchn_unbind(h, p) 43 44#define xengnttab_open(l, f) xc_gnttab_open(l, f) 45#define xengnttab_close(h) xc_gnttab_close(h) 46#define xengnttab_set_max_grants(h, n) xc_gnttab_set_max_grants(h, n) 47#define xengnttab_map_grant_ref(h, d, r, p) xc_gnttab_map_grant_ref(h, d, r, p) 48#define xengnttab_unmap(h, a, n) xc_gnttab_munmap(h, a, n) 49#define xengnttab_map_grant_refs(h, c, d, r, p) \ 50 xc_gnttab_map_grant_refs(h, c, d, r, p) 51#define xengnttab_map_domain_grant_refs(h, c, d, r, p) \ 52 xc_gnttab_map_domain_grant_refs(h, c, d, r, p) 53 54#define xenforeignmemory_open(l, f) xen_xc 55#define xenforeignmemory_close(h) 56 57static inline void *xenforeignmemory_map(xc_interface *h, uint32_t dom, 58 int prot, size_t pages, 59 const xen_pfn_t arr[/*pages*/], 60 int err[/*pages*/]) 61{ 62 if (err) 63 return xc_map_foreign_bulk(h, dom, prot, arr, err, pages); 64 else 65 return xc_map_foreign_pages(h, dom, prot, arr, pages); 66} 67 68#define xenforeignmemory_unmap(h, p, s) munmap(p, s * XC_PAGE_SIZE) 69 70#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40701 */ 71 72#include <xenevtchn.h> 73#include <xengnttab.h> 74#include <xenforeignmemory.h> 75 76#endif 77 78extern xenforeignmemory_handle *xen_fmem; 79 80#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40900 81 82typedef xc_interface xendevicemodel_handle; 83 84#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40900 */ 85 86#undef XC_WANT_COMPAT_DEVICEMODEL_API 87#include <xendevicemodel.h> 88 89#endif 90 91#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 41100 92 93static inline int xendevicemodel_relocate_memory( 94 xendevicemodel_handle *dmod, domid_t domid, uint32_t size, uint64_t src_gfn, 95 uint64_t dst_gfn) 96{ 97 uint32_t i; 98 int rc; 99 100 for (i = 0; i < size; i++) { 101 unsigned long idx = src_gfn + i; 102 xen_pfn_t gpfn = dst_gfn + i; 103 104 rc = xc_domain_add_to_physmap(xen_xc, domid, XENMAPSPACE_gmfn, idx, 105 gpfn); 106 if (rc) { 107 return rc; 108 } 109 } 110 111 return 0; 112} 113 114static inline int xendevicemodel_pin_memory_cacheattr( 115 xendevicemodel_handle *dmod, domid_t domid, uint64_t start, uint64_t end, 116 uint32_t type) 117{ 118 return xc_domain_pin_memory_cacheattr(xen_xc, domid, start, end, type); 119} 120 121typedef void xenforeignmemory_resource_handle; 122 123#define XENMEM_resource_ioreq_server 0 124 125#define XENMEM_resource_ioreq_server_frame_bufioreq 0 126#define XENMEM_resource_ioreq_server_frame_ioreq(n) (1 + (n)) 127 128static inline xenforeignmemory_resource_handle *xenforeignmemory_map_resource( 129 xenforeignmemory_handle *fmem, domid_t domid, unsigned int type, 130 unsigned int id, unsigned long frame, unsigned long nr_frames, 131 void **paddr, int prot, int flags) 132{ 133 errno = EOPNOTSUPP; 134 return NULL; 135} 136 137static inline int xenforeignmemory_unmap_resource( 138 xenforeignmemory_handle *fmem, xenforeignmemory_resource_handle *fres) 139{ 140 return 0; 141} 142 143#endif /* CONFIG_XEN_CTRL_INTERFACE_VERSION < 41100 */ 144 145#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 41000 146 147#define XEN_COMPAT_PHYSMAP 148static inline void *xenforeignmemory_map2(xenforeignmemory_handle *h, 149 uint32_t dom, void *addr, 150 int prot, int flags, size_t pages, 151 const xen_pfn_t arr[/*pages*/], 152 int err[/*pages*/]) 153{ 154 assert(addr == NULL && flags == 0); 155 return xenforeignmemory_map(h, dom, prot, pages, arr, err); 156} 157 158static inline int xentoolcore_restrict_all(domid_t domid) 159{ 160 errno = ENOTTY; 161 return -1; 162} 163 164static inline int xendevicemodel_shutdown(xendevicemodel_handle *dmod, 165 domid_t domid, unsigned int reason) 166{ 167 errno = ENOTTY; 168 return -1; 169} 170 171#else /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 41000 */ 172 173#include <xentoolcore.h> 174 175#endif 176 177#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40900 178 179static inline xendevicemodel_handle *xendevicemodel_open( 180 struct xentoollog_logger *logger, unsigned int open_flags) 181{ 182 return xen_xc; 183} 184 185#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40500 186 187static inline int xendevicemodel_create_ioreq_server( 188 xendevicemodel_handle *dmod, domid_t domid, int handle_bufioreq, 189 ioservid_t *id) 190{ 191 return xc_hvm_create_ioreq_server(dmod, domid, handle_bufioreq, 192 id); 193} 194 195static inline int xendevicemodel_get_ioreq_server_info( 196 xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, 197 xen_pfn_t *ioreq_pfn, xen_pfn_t *bufioreq_pfn, 198 evtchn_port_t *bufioreq_port) 199{ 200 return xc_hvm_get_ioreq_server_info(dmod, domid, id, ioreq_pfn, 201 bufioreq_pfn, bufioreq_port); 202} 203 204static inline int xendevicemodel_map_io_range_to_ioreq_server( 205 xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, int is_mmio, 206 uint64_t start, uint64_t end) 207{ 208 return xc_hvm_map_io_range_to_ioreq_server(dmod, domid, id, is_mmio, 209 start, end); 210} 211 212static inline int xendevicemodel_unmap_io_range_from_ioreq_server( 213 xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, int is_mmio, 214 uint64_t start, uint64_t end) 215{ 216 return xc_hvm_unmap_io_range_from_ioreq_server(dmod, domid, id, is_mmio, 217 start, end); 218} 219 220static inline int xendevicemodel_map_pcidev_to_ioreq_server( 221 xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, 222 uint16_t segment, uint8_t bus, uint8_t device, uint8_t function) 223{ 224 return xc_hvm_map_pcidev_to_ioreq_server(dmod, domid, id, segment, 225 bus, device, function); 226} 227 228static inline int xendevicemodel_unmap_pcidev_from_ioreq_server( 229 xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, 230 uint16_t segment, uint8_t bus, uint8_t device, uint8_t function) 231{ 232 return xc_hvm_unmap_pcidev_from_ioreq_server(dmod, domid, id, segment, 233 bus, device, function); 234} 235 236static inline int xendevicemodel_destroy_ioreq_server( 237 xendevicemodel_handle *dmod, domid_t domid, ioservid_t id) 238{ 239 return xc_hvm_destroy_ioreq_server(dmod, domid, id); 240} 241 242static inline int xendevicemodel_set_ioreq_server_state( 243 xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, int enabled) 244{ 245 return xc_hvm_set_ioreq_server_state(dmod, domid, id, enabled); 246} 247 248#endif /* CONFIG_XEN_CTRL_INTERFACE_VERSION >= 40500 */ 249 250static inline int xendevicemodel_set_pci_intx_level( 251 xendevicemodel_handle *dmod, domid_t domid, uint16_t segment, 252 uint8_t bus, uint8_t device, uint8_t intx, unsigned int level) 253{ 254 return xc_hvm_set_pci_intx_level(dmod, domid, segment, bus, device, 255 intx, level); 256} 257 258static inline int xendevicemodel_set_isa_irq_level( 259 xendevicemodel_handle *dmod, domid_t domid, uint8_t irq, 260 unsigned int level) 261{ 262 return xc_hvm_set_isa_irq_level(dmod, domid, irq, level); 263} 264 265static inline int xendevicemodel_set_pci_link_route( 266 xendevicemodel_handle *dmod, domid_t domid, uint8_t link, uint8_t irq) 267{ 268 return xc_hvm_set_pci_link_route(dmod, domid, link, irq); 269} 270 271static inline int xendevicemodel_inject_msi( 272 xendevicemodel_handle *dmod, domid_t domid, uint64_t msi_addr, 273 uint32_t msi_data) 274{ 275 return xc_hvm_inject_msi(dmod, domid, msi_addr, msi_data); 276} 277 278static inline int xendevicemodel_track_dirty_vram( 279 xendevicemodel_handle *dmod, domid_t domid, uint64_t first_pfn, 280 uint32_t nr, unsigned long *dirty_bitmap) 281{ 282 return xc_hvm_track_dirty_vram(dmod, domid, first_pfn, nr, 283 dirty_bitmap); 284} 285 286static inline int xendevicemodel_modified_memory( 287 xendevicemodel_handle *dmod, domid_t domid, uint64_t first_pfn, 288 uint32_t nr) 289{ 290 return xc_hvm_modified_memory(dmod, domid, first_pfn, nr); 291} 292 293static inline int xendevicemodel_set_mem_type( 294 xendevicemodel_handle *dmod, domid_t domid, hvmmem_type_t mem_type, 295 uint64_t first_pfn, uint32_t nr) 296{ 297 return xc_hvm_set_mem_type(dmod, domid, mem_type, first_pfn, nr); 298} 299 300#endif 301 302extern xendevicemodel_handle *xen_dmod; 303 304static inline int xen_set_mem_type(domid_t domid, hvmmem_type_t type, 305 uint64_t first_pfn, uint32_t nr) 306{ 307 return xendevicemodel_set_mem_type(xen_dmod, domid, type, first_pfn, 308 nr); 309} 310 311static inline int xen_set_pci_intx_level(domid_t domid, uint16_t segment, 312 uint8_t bus, uint8_t device, 313 uint8_t intx, unsigned int level) 314{ 315 return xendevicemodel_set_pci_intx_level(xen_dmod, domid, segment, bus, 316 device, intx, level); 317} 318 319static inline int xen_set_pci_link_route(domid_t domid, uint8_t link, 320 uint8_t irq) 321{ 322 return xendevicemodel_set_pci_link_route(xen_dmod, domid, link, irq); 323} 324 325static inline int xen_inject_msi(domid_t domid, uint64_t msi_addr, 326 uint32_t msi_data) 327{ 328 return xendevicemodel_inject_msi(xen_dmod, domid, msi_addr, msi_data); 329} 330 331static inline int xen_set_isa_irq_level(domid_t domid, uint8_t irq, 332 unsigned int level) 333{ 334 return xendevicemodel_set_isa_irq_level(xen_dmod, domid, irq, level); 335} 336 337static inline int xen_track_dirty_vram(domid_t domid, uint64_t first_pfn, 338 uint32_t nr, unsigned long *bitmap) 339{ 340 return xendevicemodel_track_dirty_vram(xen_dmod, domid, first_pfn, nr, 341 bitmap); 342} 343 344static inline int xen_modified_memory(domid_t domid, uint64_t first_pfn, 345 uint32_t nr) 346{ 347 return xendevicemodel_modified_memory(xen_dmod, domid, first_pfn, nr); 348} 349 350static inline int xen_restrict(domid_t domid) 351{ 352 int rc; 353 rc = xentoolcore_restrict_all(domid); 354 trace_xen_domid_restrict(rc ? errno : 0); 355 return rc; 356} 357 358void destroy_hvm_domain(bool reboot); 359 360/* shutdown/destroy current domain because of an error */ 361void xen_shutdown_fatal_error(const char *fmt, ...) GCC_FMT_ATTR(1, 2); 362 363#ifdef HVM_PARAM_VMPORT_REGS_PFN 364static inline int xen_get_vmport_regs_pfn(xc_interface *xc, domid_t dom, 365 xen_pfn_t *vmport_regs_pfn) 366{ 367 int rc; 368 uint64_t value; 369 rc = xc_hvm_param_get(xc, dom, HVM_PARAM_VMPORT_REGS_PFN, &value); 370 if (rc >= 0) { 371 *vmport_regs_pfn = (xen_pfn_t) value; 372 } 373 return rc; 374} 375#else 376static inline int xen_get_vmport_regs_pfn(xc_interface *xc, domid_t dom, 377 xen_pfn_t *vmport_regs_pfn) 378{ 379 return -ENOSYS; 380} 381#endif 382 383/* Xen before 4.6 */ 384#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40600 385 386#ifndef HVM_IOREQSRV_BUFIOREQ_ATOMIC 387#define HVM_IOREQSRV_BUFIOREQ_ATOMIC 2 388#endif 389 390#endif 391 392static inline int xen_get_default_ioreq_server_info(domid_t dom, 393 xen_pfn_t *ioreq_pfn, 394 xen_pfn_t *bufioreq_pfn, 395 evtchn_port_t 396 *bufioreq_evtchn) 397{ 398 unsigned long param; 399 int rc; 400 401 rc = xc_get_hvm_param(xen_xc, dom, HVM_PARAM_IOREQ_PFN, ¶m); 402 if (rc < 0) { 403 fprintf(stderr, "failed to get HVM_PARAM_IOREQ_PFN\n"); 404 return -1; 405 } 406 407 *ioreq_pfn = param; 408 409 rc = xc_get_hvm_param(xen_xc, dom, HVM_PARAM_BUFIOREQ_PFN, ¶m); 410 if (rc < 0) { 411 fprintf(stderr, "failed to get HVM_PARAM_BUFIOREQ_PFN\n"); 412 return -1; 413 } 414 415 *bufioreq_pfn = param; 416 417 rc = xc_get_hvm_param(xen_xc, dom, HVM_PARAM_BUFIOREQ_EVTCHN, 418 ¶m); 419 if (rc < 0) { 420 fprintf(stderr, "failed to get HVM_PARAM_BUFIOREQ_EVTCHN\n"); 421 return -1; 422 } 423 424 *bufioreq_evtchn = param; 425 426 return 0; 427} 428 429/* Xen before 4.5 */ 430#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40500 431 432#ifndef HVM_PARAM_BUFIOREQ_EVTCHN 433#define HVM_PARAM_BUFIOREQ_EVTCHN 26 434#endif 435 436#define IOREQ_TYPE_PCI_CONFIG 2 437 438typedef uint16_t ioservid_t; 439 440static inline void xen_map_memory_section(domid_t dom, 441 ioservid_t ioservid, 442 MemoryRegionSection *section) 443{ 444} 445 446static inline void xen_unmap_memory_section(domid_t dom, 447 ioservid_t ioservid, 448 MemoryRegionSection *section) 449{ 450} 451 452static inline void xen_map_io_section(domid_t dom, 453 ioservid_t ioservid, 454 MemoryRegionSection *section) 455{ 456} 457 458static inline void xen_unmap_io_section(domid_t dom, 459 ioservid_t ioservid, 460 MemoryRegionSection *section) 461{ 462} 463 464static inline void xen_map_pcidev(domid_t dom, 465 ioservid_t ioservid, 466 PCIDevice *pci_dev) 467{ 468} 469 470static inline void xen_unmap_pcidev(domid_t dom, 471 ioservid_t ioservid, 472 PCIDevice *pci_dev) 473{ 474} 475 476static inline void xen_create_ioreq_server(domid_t dom, 477 ioservid_t *ioservid) 478{ 479} 480 481static inline void xen_destroy_ioreq_server(domid_t dom, 482 ioservid_t ioservid) 483{ 484} 485 486static inline int xen_get_ioreq_server_info(domid_t dom, 487 ioservid_t ioservid, 488 xen_pfn_t *ioreq_pfn, 489 xen_pfn_t *bufioreq_pfn, 490 evtchn_port_t *bufioreq_evtchn) 491{ 492 return xen_get_default_ioreq_server_info(dom, ioreq_pfn, 493 bufioreq_pfn, 494 bufioreq_evtchn); 495} 496 497static inline int xen_set_ioreq_server_state(domid_t dom, 498 ioservid_t ioservid, 499 bool enable) 500{ 501 return 0; 502} 503 504/* Xen 4.5 */ 505#else 506 507static bool use_default_ioreq_server; 508 509static inline void xen_map_memory_section(domid_t dom, 510 ioservid_t ioservid, 511 MemoryRegionSection *section) 512{ 513 hwaddr start_addr = section->offset_within_address_space; 514 ram_addr_t size = int128_get64(section->size); 515 hwaddr end_addr = start_addr + size - 1; 516 517 if (use_default_ioreq_server) { 518 return; 519 } 520 521 trace_xen_map_mmio_range(ioservid, start_addr, end_addr); 522 xendevicemodel_map_io_range_to_ioreq_server(xen_dmod, dom, ioservid, 1, 523 start_addr, end_addr); 524} 525 526static inline void xen_unmap_memory_section(domid_t dom, 527 ioservid_t ioservid, 528 MemoryRegionSection *section) 529{ 530 hwaddr start_addr = section->offset_within_address_space; 531 ram_addr_t size = int128_get64(section->size); 532 hwaddr end_addr = start_addr + size - 1; 533 534 if (use_default_ioreq_server) { 535 return; 536 } 537 538 trace_xen_unmap_mmio_range(ioservid, start_addr, end_addr); 539 xendevicemodel_unmap_io_range_from_ioreq_server(xen_dmod, dom, ioservid, 540 1, start_addr, end_addr); 541} 542 543static inline void xen_map_io_section(domid_t dom, 544 ioservid_t ioservid, 545 MemoryRegionSection *section) 546{ 547 hwaddr start_addr = section->offset_within_address_space; 548 ram_addr_t size = int128_get64(section->size); 549 hwaddr end_addr = start_addr + size - 1; 550 551 if (use_default_ioreq_server) { 552 return; 553 } 554 555 trace_xen_map_portio_range(ioservid, start_addr, end_addr); 556 xendevicemodel_map_io_range_to_ioreq_server(xen_dmod, dom, ioservid, 0, 557 start_addr, end_addr); 558} 559 560static inline void xen_unmap_io_section(domid_t dom, 561 ioservid_t ioservid, 562 MemoryRegionSection *section) 563{ 564 hwaddr start_addr = section->offset_within_address_space; 565 ram_addr_t size = int128_get64(section->size); 566 hwaddr end_addr = start_addr + size - 1; 567 568 if (use_default_ioreq_server) { 569 return; 570 } 571 572 trace_xen_unmap_portio_range(ioservid, start_addr, end_addr); 573 xendevicemodel_unmap_io_range_from_ioreq_server(xen_dmod, dom, ioservid, 574 0, start_addr, end_addr); 575} 576 577static inline void xen_map_pcidev(domid_t dom, 578 ioservid_t ioservid, 579 PCIDevice *pci_dev) 580{ 581 if (use_default_ioreq_server) { 582 return; 583 } 584 585 trace_xen_map_pcidev(ioservid, pci_dev_bus_num(pci_dev), 586 PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); 587 xendevicemodel_map_pcidev_to_ioreq_server(xen_dmod, dom, ioservid, 0, 588 pci_dev_bus_num(pci_dev), 589 PCI_SLOT(pci_dev->devfn), 590 PCI_FUNC(pci_dev->devfn)); 591} 592 593static inline void xen_unmap_pcidev(domid_t dom, 594 ioservid_t ioservid, 595 PCIDevice *pci_dev) 596{ 597 if (use_default_ioreq_server) { 598 return; 599 } 600 601 trace_xen_unmap_pcidev(ioservid, pci_dev_bus_num(pci_dev), 602 PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); 603 xendevicemodel_unmap_pcidev_from_ioreq_server(xen_dmod, dom, ioservid, 0, 604 pci_dev_bus_num(pci_dev), 605 PCI_SLOT(pci_dev->devfn), 606 PCI_FUNC(pci_dev->devfn)); 607} 608 609static inline void xen_create_ioreq_server(domid_t dom, 610 ioservid_t *ioservid) 611{ 612 int rc = xendevicemodel_create_ioreq_server(xen_dmod, dom, 613 HVM_IOREQSRV_BUFIOREQ_ATOMIC, 614 ioservid); 615 616 if (rc == 0) { 617 trace_xen_ioreq_server_create(*ioservid); 618 return; 619 } 620 621 *ioservid = 0; 622 use_default_ioreq_server = true; 623 trace_xen_default_ioreq_server(); 624} 625 626static inline void xen_destroy_ioreq_server(domid_t dom, 627 ioservid_t ioservid) 628{ 629 if (use_default_ioreq_server) { 630 return; 631 } 632 633 trace_xen_ioreq_server_destroy(ioservid); 634 xendevicemodel_destroy_ioreq_server(xen_dmod, dom, ioservid); 635} 636 637static inline int xen_get_ioreq_server_info(domid_t dom, 638 ioservid_t ioservid, 639 xen_pfn_t *ioreq_pfn, 640 xen_pfn_t *bufioreq_pfn, 641 evtchn_port_t *bufioreq_evtchn) 642{ 643 if (use_default_ioreq_server) { 644 return xen_get_default_ioreq_server_info(dom, ioreq_pfn, 645 bufioreq_pfn, 646 bufioreq_evtchn); 647 } 648 649 return xendevicemodel_get_ioreq_server_info(xen_dmod, dom, ioservid, 650 ioreq_pfn, bufioreq_pfn, 651 bufioreq_evtchn); 652} 653 654static inline int xen_set_ioreq_server_state(domid_t dom, 655 ioservid_t ioservid, 656 bool enable) 657{ 658 if (use_default_ioreq_server) { 659 return 0; 660 } 661 662 trace_xen_ioreq_server_state(ioservid, enable); 663 return xendevicemodel_set_ioreq_server_state(xen_dmod, dom, ioservid, 664 enable); 665} 666 667#endif 668 669/* Xen before 4.8 */ 670 671#if CONFIG_XEN_CTRL_INTERFACE_VERSION < 40800 672 673struct xengnttab_grant_copy_segment { 674 union xengnttab_copy_ptr { 675 void *virt; 676 struct { 677 uint32_t ref; 678 uint16_t offset; 679 uint16_t domid; 680 } foreign; 681 } source, dest; 682 uint16_t len; 683 uint16_t flags; 684 int16_t status; 685}; 686 687typedef struct xengnttab_grant_copy_segment xengnttab_grant_copy_segment_t; 688 689static inline int xengnttab_grant_copy(xengnttab_handle *xgt, uint32_t count, 690 xengnttab_grant_copy_segment_t *segs) 691{ 692 return -ENOSYS; 693} 694#endif 695 696#endif /* QEMU_HW_XEN_COMMON_H */