The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/xen/interface/hvm/dm_op.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 2016, Citrix Systems Inc
    3  *
    4  * Permission is hereby granted, free of charge, to any person obtaining a copy
    5  * of this software and associated documentation files (the "Software"), to
    6  * deal in the Software without restriction, including without limitation the
    7  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
    8  * sell copies of the Software, and to permit persons to whom the Software is
    9  * furnished to do so, subject to the following conditions:
   10  *
   11  * The above copyright notice and this permission notice shall be included in
   12  * all copies or substantial portions of the Software.
   13  *
   14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
   20  * DEALINGS IN THE SOFTWARE.
   21  *
   22  */
   23 
   24 #ifndef __XEN_PUBLIC_HVM_DM_OP_H__
   25 #define __XEN_PUBLIC_HVM_DM_OP_H__
   26 
   27 #include "../xen.h"
   28 
   29 #if defined(__XEN__) || defined(__XEN_TOOLS__)
   30 
   31 #include "../event_channel.h"
   32 
   33 #ifndef uint64_aligned_t
   34 #define uint64_aligned_t uint64_t
   35 #endif
   36 
   37 /*
   38  * IOREQ Servers
   39  *
   40  * The interface between an I/O emulator an Xen is called an IOREQ Server.
   41  * A domain supports a single 'legacy' IOREQ Server which is instantiated if
   42  * parameter...
   43  *
   44  * HVM_PARAM_IOREQ_PFN is read (to get the gfn containing the synchronous
   45  * ioreq structures), or...
   46  * HVM_PARAM_BUFIOREQ_PFN is read (to get the gfn containing the buffered
   47  * ioreq ring), or...
   48  * HVM_PARAM_BUFIOREQ_EVTCHN is read (to get the event channel that Xen uses
   49  * to request buffered I/O emulation).
   50  *
   51  * The following hypercalls facilitate the creation of IOREQ Servers for
   52  * 'secondary' emulators which are invoked to implement port I/O, memory, or
   53  * PCI config space ranges which they explicitly register.
   54  */
   55 
   56 typedef uint16_t ioservid_t;
   57 
   58 /*
   59  * XEN_DMOP_create_ioreq_server: Instantiate a new IOREQ Server for a
   60  *                               secondary emulator.
   61  *
   62  * The <id> handed back is unique for target domain. The valur of
   63  * <handle_bufioreq> should be one of HVM_IOREQSRV_BUFIOREQ_* defined in
   64  * hvm_op.h. If the value is HVM_IOREQSRV_BUFIOREQ_OFF then  the buffered
   65  * ioreq ring will not be allocated and hence all emulation requests to
   66  * this server will be synchronous.
   67  */
   68 #define XEN_DMOP_create_ioreq_server 1
   69 
   70 struct xen_dm_op_create_ioreq_server {
   71     /* IN - should server handle buffered ioreqs */
   72     uint8_t handle_bufioreq;
   73     uint8_t pad[3];
   74     /* OUT - server id */
   75     ioservid_t id;
   76 };
   77 
   78 /*
   79  * XEN_DMOP_get_ioreq_server_info: Get all the information necessary to
   80  *                                 access IOREQ Server <id>.
   81  *
   82  * If the IOREQ Server is handling buffered emulation requests, the
   83  * emulator needs to bind to event channel <bufioreq_port> to listen for
   84  * them. (The event channels used for synchronous emulation requests are
   85  * specified in the per-CPU ioreq structures).
   86  * In addition, if the XENMEM_acquire_resource memory op cannot be used,
   87  * the emulator will need to map the synchronous ioreq structures and
   88  * buffered ioreq ring (if it exists) from guest memory. If <flags> does
   89  * not contain XEN_DMOP_no_gfns then these pages will be made available and
   90  * the frame numbers passed back in gfns <ioreq_gfn> and <bufioreq_gfn>
   91  * respectively. (If the IOREQ Server is not handling buffered emulation
   92  * only <ioreq_gfn> will be valid).
   93  *
   94  * NOTE: To access the synchronous ioreq structures and buffered ioreq
   95  *       ring, it is preferable to use the XENMEM_acquire_resource memory
   96  *       op specifying resource type XENMEM_resource_ioreq_server.
   97  */
   98 #define XEN_DMOP_get_ioreq_server_info 2
   99 
  100 struct xen_dm_op_get_ioreq_server_info {
  101     /* IN - server id */
  102     ioservid_t id;
  103     /* IN - flags */
  104     uint16_t flags;
  105 
  106 #define _XEN_DMOP_no_gfns 0
  107 #define XEN_DMOP_no_gfns (1u << _XEN_DMOP_no_gfns)
  108 
  109     /* OUT - buffered ioreq port */
  110     evtchn_port_t bufioreq_port;
  111     /* OUT - sync ioreq gfn (see block comment above) */
  112     uint64_aligned_t ioreq_gfn;
  113     /* OUT - buffered ioreq gfn (see block comment above)*/
  114     uint64_aligned_t bufioreq_gfn;
  115 };
  116 
  117 /*
  118  * XEN_DMOP_map_io_range_to_ioreq_server: Register an I/O range for
  119  *                                        emulation by the client of
  120  *                                        IOREQ Server <id>.
  121  * XEN_DMOP_unmap_io_range_from_ioreq_server: Deregister an I/O range
  122  *                                            previously registered for
  123  *                                            emulation by the client of
  124  *                                            IOREQ Server <id>.
  125  *
  126  * There are three types of I/O that can be emulated: port I/O, memory
  127  * accesses and PCI config space accesses. The <type> field denotes which
  128  * type of range* the <start> and <end> (inclusive) fields are specifying.
  129  * PCI config space ranges are specified by segment/bus/device/function
  130  * values which should be encoded using the DMOP_PCI_SBDF helper macro
  131  * below.
  132  *
  133  * NOTE: unless an emulation request falls entirely within a range mapped
  134  * by a secondary emulator, it will not be passed to that emulator.
  135  */
  136 #define XEN_DMOP_map_io_range_to_ioreq_server 3
  137 #define XEN_DMOP_unmap_io_range_from_ioreq_server 4
  138 
  139 struct xen_dm_op_ioreq_server_range {
  140     /* IN - server id */
  141     ioservid_t id;
  142     uint16_t pad;
  143     /* IN - type of range */
  144     uint32_t type;
  145 # define XEN_DMOP_IO_RANGE_PORT   0 /* I/O port range */
  146 # define XEN_DMOP_IO_RANGE_MEMORY 1 /* MMIO range */
  147 # define XEN_DMOP_IO_RANGE_PCI    2 /* PCI segment/bus/dev/func range */
  148     /* IN - inclusive start and end of range */
  149     uint64_aligned_t start, end;
  150 };
  151 
  152 #define XEN_DMOP_PCI_SBDF(s,b,d,f) \
  153         ((((s) & 0xffff) << 16) |  \
  154          (((b) & 0xff) << 8) |     \
  155          (((d) & 0x1f) << 3) |     \
  156          ((f) & 0x07))
  157 
  158 /*
  159  * XEN_DMOP_set_ioreq_server_state: Enable or disable the IOREQ Server <id>
  160  *
  161  * The IOREQ Server will not be passed any emulation requests until it is
  162  * in the enabled state.
  163  * Note that the contents of the ioreq_gfn and bufioreq_gfn (see
  164  * XEN_DMOP_get_ioreq_server_info) are not meaningful until the IOREQ Server
  165  * is in the enabled state.
  166  */
  167 #define XEN_DMOP_set_ioreq_server_state 5
  168 
  169 struct xen_dm_op_set_ioreq_server_state {
  170     /* IN - server id */
  171     ioservid_t id;
  172     /* IN - enabled? */
  173     uint8_t enabled;
  174     uint8_t pad;
  175 };
  176 
  177 /*
  178  * XEN_DMOP_destroy_ioreq_server: Destroy the IOREQ Server <id>.
  179  *
  180  * Any registered I/O ranges will be automatically deregistered.
  181  */
  182 #define XEN_DMOP_destroy_ioreq_server 6
  183 
  184 struct xen_dm_op_destroy_ioreq_server {
  185     /* IN - server id */
  186     ioservid_t id;
  187     uint16_t pad;
  188 };
  189 
  190 /*
  191  * XEN_DMOP_track_dirty_vram: Track modifications to the specified pfn
  192  *                            range.
  193  *
  194  * NOTE: The bitmap passed back to the caller is passed in a
  195  *       secondary buffer.
  196  */
  197 #define XEN_DMOP_track_dirty_vram 7
  198 
  199 struct xen_dm_op_track_dirty_vram {
  200     /* IN - number of pages to be tracked */
  201     uint32_t nr;
  202     uint32_t pad;
  203     /* IN - first pfn to track */
  204     uint64_aligned_t first_pfn;
  205 };
  206 
  207 /*
  208  * XEN_DMOP_set_pci_intx_level: Set the logical level of one of a domain's
  209  *                              PCI INTx pins.
  210  */
  211 #define XEN_DMOP_set_pci_intx_level 8
  212 
  213 struct xen_dm_op_set_pci_intx_level {
  214     /* IN - PCI INTx identification (domain:bus:device:intx) */
  215     uint16_t domain;
  216     uint8_t bus, device, intx;
  217     /* IN - Level: 0 -> deasserted, 1 -> asserted */
  218     uint8_t  level;
  219 };
  220 
  221 /*
  222  * XEN_DMOP_set_isa_irq_level: Set the logical level of a one of a domain's
  223  *                             ISA IRQ lines.
  224  */
  225 #define XEN_DMOP_set_isa_irq_level 9
  226 
  227 struct xen_dm_op_set_isa_irq_level {
  228     /* IN - ISA IRQ (0-15) */
  229     uint8_t  isa_irq;
  230     /* IN - Level: 0 -> deasserted, 1 -> asserted */
  231     uint8_t  level;
  232 };
  233 
  234 /*
  235  * XEN_DMOP_set_pci_link_route: Map a PCI INTx line to an IRQ line.
  236  */
  237 #define XEN_DMOP_set_pci_link_route 10
  238 
  239 struct xen_dm_op_set_pci_link_route {
  240     /* PCI INTx line (0-3) */
  241     uint8_t  link;
  242     /* ISA IRQ (1-15) or 0 -> disable link */
  243     uint8_t  isa_irq;
  244 };
  245 
  246 /*
  247  * XEN_DMOP_modified_memory: Notify that a set of pages were modified by
  248  *                           an emulator.
  249  *
  250  * DMOP buf 1 contains an array of xen_dm_op_modified_memory_extent with
  251  * @nr_extents entries.
  252  *
  253  * On error, @nr_extents will contain the index+1 of the extent that
  254  * had the error.  It is not defined if or which pages may have been
  255  * marked as dirty, in this event.
  256  */
  257 #define XEN_DMOP_modified_memory 11
  258 
  259 struct xen_dm_op_modified_memory {
  260     /*
  261      * IN - Number of extents to be processed
  262      * OUT -returns n+1 for failing extent
  263      */
  264     uint32_t nr_extents;
  265     /* IN/OUT - Must be set to 0 */
  266     uint32_t opaque;
  267 };
  268 
  269 struct xen_dm_op_modified_memory_extent {
  270     /* IN - number of contiguous pages modified */
  271     uint32_t nr;
  272     uint32_t pad;
  273     /* IN - first pfn modified */
  274     uint64_aligned_t first_pfn;
  275 };
  276 
  277 /*
  278  * XEN_DMOP_set_mem_type: Notify that a region of memory is to be treated
  279  *                        in a specific way. (See definition of
  280  *                        hvmmem_type_t).
  281  *
  282  * NOTE: In the event of a continuation (return code -ERESTART), the
  283  *       @first_pfn is set to the value of the pfn of the remaining
  284  *       region and @nr reduced to the size of the remaining region.
  285  */
  286 #define XEN_DMOP_set_mem_type 12
  287 
  288 struct xen_dm_op_set_mem_type {
  289     /* IN - number of contiguous pages */
  290     uint32_t nr;
  291     /* IN - new hvmmem_type_t of region */
  292     uint16_t mem_type;
  293     uint16_t pad;
  294     /* IN - first pfn in region */
  295     uint64_aligned_t first_pfn;
  296 };
  297 
  298 /*
  299  * XEN_DMOP_inject_event: Inject an event into a VCPU, which will
  300  *                        get taken up when it is next scheduled.
  301  *
  302  * Note that the caller should know enough of the state of the CPU before
  303  * injecting, to know what the effect of injecting the event will be.
  304  */
  305 #define XEN_DMOP_inject_event 13
  306 
  307 struct xen_dm_op_inject_event {
  308     /* IN - index of vCPU */
  309     uint32_t vcpuid;
  310     /* IN - interrupt vector */
  311     uint8_t vector;
  312     /* IN - event type (DMOP_EVENT_* ) */
  313     uint8_t type;
  314 /* NB. This enumeration precisely matches hvm.h:X86_EVENTTYPE_* */
  315 # define XEN_DMOP_EVENT_ext_int    0 /* external interrupt */
  316 # define XEN_DMOP_EVENT_nmi        2 /* nmi */
  317 # define XEN_DMOP_EVENT_hw_exc     3 /* hardware exception */
  318 # define XEN_DMOP_EVENT_sw_int     4 /* software interrupt (CD nn) */
  319 # define XEN_DMOP_EVENT_pri_sw_exc 5 /* ICEBP (F1) */
  320 # define XEN_DMOP_EVENT_sw_exc     6 /* INT3 (CC), INTO (CE) */
  321     /* IN - instruction length */
  322     uint8_t insn_len;
  323     uint8_t pad0;
  324     /* IN - error code (or ~0 to skip) */
  325     uint32_t error_code;
  326     uint32_t pad1;
  327     /* IN - type-specific extra data (%cr2 for #PF, pending_dbg for #DB) */
  328     uint64_aligned_t cr2;
  329 };
  330 
  331 /*
  332  * XEN_DMOP_inject_msi: Inject an MSI for an emulated device.
  333  */
  334 #define XEN_DMOP_inject_msi 14
  335 
  336 struct xen_dm_op_inject_msi {
  337     /* IN - MSI data (lower 32 bits) */
  338     uint32_t data;
  339     uint32_t pad;
  340     /* IN - MSI address (0xfeexxxxx) */
  341     uint64_aligned_t addr;
  342 };
  343 
  344 /*
  345  * XEN_DMOP_map_mem_type_to_ioreq_server : map or unmap the IOREQ Server <id>
  346  *                                      to specific memory type <type>
  347  *                                      for specific accesses <flags>
  348  *
  349  * For now, flags only accept the value of XEN_DMOP_IOREQ_MEM_ACCESS_WRITE,
  350  * which means only write operations are to be forwarded to an ioreq server.
  351  * Support for the emulation of read operations can be added when an ioreq
  352  * server has such requirement in future.
  353  */
  354 #define XEN_DMOP_map_mem_type_to_ioreq_server 15
  355 
  356 struct xen_dm_op_map_mem_type_to_ioreq_server {
  357     ioservid_t id;      /* IN - ioreq server id */
  358     uint16_t type;      /* IN - memory type */
  359     uint32_t flags;     /* IN - types of accesses to be forwarded to the
  360                            ioreq server. flags with 0 means to unmap the
  361                            ioreq server */
  362 
  363 #define XEN_DMOP_IOREQ_MEM_ACCESS_READ (1u << 0)
  364 #define XEN_DMOP_IOREQ_MEM_ACCESS_WRITE (1u << 1)
  365 
  366     uint64_t opaque;    /* IN/OUT - only used for hypercall continuation,
  367                            has to be set to zero by the caller */
  368 };
  369 
  370 /*
  371  * XEN_DMOP_remote_shutdown : Declare a shutdown for another domain
  372  *                            Identical to SCHEDOP_remote_shutdown
  373  */
  374 #define XEN_DMOP_remote_shutdown 16
  375 
  376 struct xen_dm_op_remote_shutdown {
  377     uint32_t reason;       /* SHUTDOWN_* => enum sched_shutdown_reason */
  378                            /* (Other reason values are not blocked) */
  379 };
  380 
  381 /*
  382  * XEN_DMOP_relocate_memory : Relocate GFNs for the specified guest.
  383  *                            Identical to XENMEM_add_to_physmap with
  384  *                            space == XENMAPSPACE_gmfn_range.
  385  */
  386 #define XEN_DMOP_relocate_memory 17
  387 
  388 struct xen_dm_op_relocate_memory {
  389     /* All fields are IN/OUT, with their OUT state undefined. */
  390     /* Number of GFNs to process. */
  391     uint32_t size;
  392     uint32_t pad;
  393     /* Starting GFN to relocate. */
  394     uint64_aligned_t src_gfn;
  395     /* Starting GFN where GFNs should be relocated. */
  396     uint64_aligned_t dst_gfn;
  397 };
  398 
  399 /*
  400  * XEN_DMOP_pin_memory_cacheattr : Pin caching type of RAM space.
  401  *                                 Identical to XEN_DOMCTL_pin_mem_cacheattr.
  402  */
  403 #define XEN_DMOP_pin_memory_cacheattr 18
  404 
  405 struct xen_dm_op_pin_memory_cacheattr {
  406     uint64_aligned_t start; /* Start gfn. */
  407     uint64_aligned_t end;   /* End gfn. */
  408 /* Caching types: these happen to be the same as x86 MTRR/PAT type codes. */
  409 #define XEN_DMOP_MEM_CACHEATTR_UC  0
  410 #define XEN_DMOP_MEM_CACHEATTR_WC  1
  411 #define XEN_DMOP_MEM_CACHEATTR_WT  4
  412 #define XEN_DMOP_MEM_CACHEATTR_WP  5
  413 #define XEN_DMOP_MEM_CACHEATTR_WB  6
  414 #define XEN_DMOP_MEM_CACHEATTR_UCM 7
  415 #define XEN_DMOP_DELETE_MEM_CACHEATTR (~(uint32_t)0)
  416     uint32_t type;          /* XEN_DMOP_MEM_CACHEATTR_* */
  417     uint32_t pad;
  418 };
  419 
  420 struct xen_dm_op {
  421     uint32_t op;
  422     uint32_t pad;
  423     union {
  424         struct xen_dm_op_create_ioreq_server create_ioreq_server;
  425         struct xen_dm_op_get_ioreq_server_info get_ioreq_server_info;
  426         struct xen_dm_op_ioreq_server_range map_io_range_to_ioreq_server;
  427         struct xen_dm_op_ioreq_server_range unmap_io_range_from_ioreq_server;
  428         struct xen_dm_op_set_ioreq_server_state set_ioreq_server_state;
  429         struct xen_dm_op_destroy_ioreq_server destroy_ioreq_server;
  430         struct xen_dm_op_track_dirty_vram track_dirty_vram;
  431         struct xen_dm_op_set_pci_intx_level set_pci_intx_level;
  432         struct xen_dm_op_set_isa_irq_level set_isa_irq_level;
  433         struct xen_dm_op_set_pci_link_route set_pci_link_route;
  434         struct xen_dm_op_modified_memory modified_memory;
  435         struct xen_dm_op_set_mem_type set_mem_type;
  436         struct xen_dm_op_inject_event inject_event;
  437         struct xen_dm_op_inject_msi inject_msi;
  438         struct xen_dm_op_map_mem_type_to_ioreq_server
  439                 map_mem_type_to_ioreq_server;
  440         struct xen_dm_op_remote_shutdown remote_shutdown;
  441         struct xen_dm_op_relocate_memory relocate_memory;
  442         struct xen_dm_op_pin_memory_cacheattr pin_memory_cacheattr;
  443     } u;
  444 };
  445 
  446 #endif /* __XEN__ || __XEN_TOOLS__ */
  447 
  448 struct xen_dm_op_buf {
  449     XEN_GUEST_HANDLE(void) h;
  450     xen_ulong_t size;
  451 };
  452 typedef struct xen_dm_op_buf xen_dm_op_buf_t;
  453 DEFINE_XEN_GUEST_HANDLE(xen_dm_op_buf_t);
  454 
  455 /* ` enum neg_errnoval
  456  * ` HYPERVISOR_dm_op(domid_t domid,
  457  * `                  unsigned int nr_bufs,
  458  * `                  xen_dm_op_buf_t bufs[])
  459  * `
  460  *
  461  * @domid is the domain the hypercall operates on.
  462  * @nr_bufs is the number of buffers in the @bufs array.
  463  * @bufs points to an array of buffers where @bufs[0] contains a struct
  464  * xen_dm_op, describing the specific device model operation and its
  465  * parameters.
  466  * @bufs[1..] may be referenced in the parameters for the purposes of
  467  * passing extra information to or from the domain.
  468  */
  469 
  470 #endif /* __XEN_PUBLIC_HVM_DM_OP_H__ */
  471 
  472 /*
  473  * Local variables:
  474  * mode: C
  475  * c-file-style: "BSD"
  476  * c-basic-offset: 4
  477  * tab-width: 4
  478  * indent-tabs-mode: nil
  479  * End:
  480  */

Cache object: 743b7db8fb396553102f2518a0beeca7


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.