diff options
Diffstat (limited to 'include/xen/interface')
| -rw-r--r-- | include/xen/interface/callback.h | 4 | ||||
| -rw-r--r-- | include/xen/interface/elfnote.h | 15 | ||||
| -rw-r--r-- | include/xen/interface/event_channel.h | 81 | ||||
| -rw-r--r-- | include/xen/interface/features.h | 3 | ||||
| -rw-r--r-- | include/xen/interface/grant_table.h | 181 | ||||
| -rw-r--r-- | include/xen/interface/hvm/hvm_op.h | 19 | ||||
| -rw-r--r-- | include/xen/interface/hvm/params.h | 8 | ||||
| -rw-r--r-- | include/xen/interface/io/blkif.h | 179 | ||||
| -rw-r--r-- | include/xen/interface/io/netif.h | 186 | ||||
| -rw-r--r-- | include/xen/interface/io/protocols.h | 6 | ||||
| -rw-r--r-- | include/xen/interface/io/ring.h | 16 | ||||
| -rw-r--r-- | include/xen/interface/io/tpmif.h | 52 | ||||
| -rw-r--r-- | include/xen/interface/io/xs_wire.h | 9 | ||||
| -rw-r--r-- | include/xen/interface/memory.h | 92 | ||||
| -rw-r--r-- | include/xen/interface/physdev.h | 113 | ||||
| -rw-r--r-- | include/xen/interface/platform.h | 380 | ||||
| -rw-r--r-- | include/xen/interface/sched.h | 36 | ||||
| -rw-r--r-- | include/xen/interface/vcpu.h | 2 | ||||
| -rw-r--r-- | include/xen/interface/version.h | 7 | ||||
| -rw-r--r-- | include/xen/interface/xen-mca.h | 385 | ||||
| -rw-r--r-- | include/xen/interface/xen.h | 95 | ||||
| -rw-r--r-- | include/xen/interface/xencomm.h | 41 | 
22 files changed, 1749 insertions, 161 deletions
diff --git a/include/xen/interface/callback.h b/include/xen/interface/callback.h index 2ae3cd24326..dc3193f4b58 100644 --- a/include/xen/interface/callback.h +++ b/include/xen/interface/callback.h @@ -27,7 +27,7 @@  #ifndef __XEN_PUBLIC_CALLBACK_H__  #define __XEN_PUBLIC_CALLBACK_H__ -#include "xen.h" +#include <xen/interface/xen.h>  /*   * Prototype for this hypercall is: @@ -36,7 +36,7 @@   * @extra_args == Operation-specific extra arguments (NULL if none).   */ -/* ia64, x86: Callback for event delivery. */ +/* x86: Callback for event delivery. */  #define CALLBACKTYPE_event                 0  /* x86: Failsafe callback when guest state cannot be restored by Xen. */ diff --git a/include/xen/interface/elfnote.h b/include/xen/interface/elfnote.h index 7a8262c375c..6f4eae328ca 100644 --- a/include/xen/interface/elfnote.h +++ b/include/xen/interface/elfnote.h @@ -51,7 +51,7 @@  /*   * The offset of the ELF paddr field from the acutal required - * psuedo-physical address (numeric). + * pseudo-physical address (numeric).   *   * This is used to maintain backwards compatibility with older kernels   * which wrote __PAGE_OFFSET into that field. This field defaults to 0 @@ -140,6 +140,19 @@   */  #define XEN_ELFNOTE_SUSPEND_CANCEL 14 +/* + * The features supported by this kernel (numeric). + * + * Other than XEN_ELFNOTE_FEATURES on pre-4.2 Xen, this note allows a + * kernel to specify support for features that older hypervisors don't + * know about. The set of features 4.2 and newer hypervisors will + * consider supported by the kernel is the combination of the sets + * specified through this and the string note. + * + * LEGACY: FEATURES + */ +#define XEN_ELFNOTE_SUPPORTED_FEATURES 17 +  #endif /* __XEN_PUBLIC_ELFNOTE_H__ */  /* diff --git a/include/xen/interface/event_channel.h b/include/xen/interface/event_channel.h index 2090881c365..7e6acef5415 100644 --- a/include/xen/interface/event_channel.h +++ b/include/xen/interface/event_channel.h @@ -177,6 +177,52 @@ struct evtchn_unmask {  	evtchn_port_t port;  }; +/* + * EVTCHNOP_reset: Close all event channels associated with specified domain. + * NOTES: + *  1. <dom> may be specified as DOMID_SELF. + *  2. Only a sufficiently-privileged domain may specify other than DOMID_SELF. + */ +#define EVTCHNOP_reset		 10 +struct evtchn_reset { +	/* IN parameters. */ +	domid_t dom; +}; +typedef struct evtchn_reset evtchn_reset_t; + +/* + * EVTCHNOP_init_control: initialize the control block for the FIFO ABI. + */ +#define EVTCHNOP_init_control    11 +struct evtchn_init_control { +	/* IN parameters. */ +	uint64_t control_gfn; +	uint32_t offset; +	uint32_t vcpu; +	/* OUT parameters. */ +	uint8_t link_bits; +	uint8_t _pad[7]; +}; + +/* + * EVTCHNOP_expand_array: add an additional page to the event array. + */ +#define EVTCHNOP_expand_array    12 +struct evtchn_expand_array { +	/* IN parameters. */ +	uint64_t array_gfn; +}; + +/* + * EVTCHNOP_set_priority: set the priority for an event channel. + */ +#define EVTCHNOP_set_priority    13 +struct evtchn_set_priority { +	/* IN parameters. */ +	uint32_t port; +	uint32_t priority; +}; +  struct evtchn_op {  	uint32_t cmd; /* EVTCHNOP_* */  	union { @@ -194,4 +240,39 @@ struct evtchn_op {  };  DEFINE_GUEST_HANDLE_STRUCT(evtchn_op); +/* + * 2-level ABI + */ + +#define EVTCHN_2L_NR_CHANNELS (sizeof(xen_ulong_t) * sizeof(xen_ulong_t) * 64) + +/* + * FIFO ABI + */ + +/* Events may have priorities from 0 (highest) to 15 (lowest). */ +#define EVTCHN_FIFO_PRIORITY_MAX     0 +#define EVTCHN_FIFO_PRIORITY_DEFAULT 7 +#define EVTCHN_FIFO_PRIORITY_MIN     15 + +#define EVTCHN_FIFO_MAX_QUEUES (EVTCHN_FIFO_PRIORITY_MIN + 1) + +typedef uint32_t event_word_t; + +#define EVTCHN_FIFO_PENDING 31 +#define EVTCHN_FIFO_MASKED  30 +#define EVTCHN_FIFO_LINKED  29 +#define EVTCHN_FIFO_BUSY    28 + +#define EVTCHN_FIFO_LINK_BITS 17 +#define EVTCHN_FIFO_LINK_MASK ((1 << EVTCHN_FIFO_LINK_BITS) - 1) + +#define EVTCHN_FIFO_NR_CHANNELS (1 << EVTCHN_FIFO_LINK_BITS) + +struct evtchn_fifo_control_block { +	uint32_t     ready; +	uint32_t     _rsvd; +	event_word_t head[EVTCHN_FIFO_MAX_QUEUES]; +}; +  #endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */ diff --git a/include/xen/interface/features.h b/include/xen/interface/features.h index b6ca39a069d..131a6ccdba2 100644 --- a/include/xen/interface/features.h +++ b/include/xen/interface/features.h @@ -50,6 +50,9 @@  /* x86: pirq can be used by HVM guests */  #define XENFEAT_hvm_pirqs           10 +/* operation as Dom0 is supported */ +#define XENFEAT_dom0                      11 +  #define XENFEAT_NR_SUBMAPS 1  #endif /* __XEN_PUBLIC_FEATURES_H__ */ diff --git a/include/xen/interface/grant_table.h b/include/xen/interface/grant_table.h index 39e571796e3..e40fae9bf11 100644 --- a/include/xen/interface/grant_table.h +++ b/include/xen/interface/grant_table.h @@ -85,12 +85,22 @@   */  /* + * Reference to a grant entry in a specified domain's grant table. + */ +typedef uint32_t grant_ref_t; + +/*   * A grant table comprises a packed array of grant entries in one or more   * page frames shared between Xen and a guest.   * [XEN]: This field is written by Xen and read by the sharing guest.   * [GST]: This field is written by the guest and read by Xen.   */ -struct grant_entry { + +/* + * Version 1 of the grant table entry structure is maintained purely + * for backwards compatibility.  New guests should use version 2. + */ +struct grant_entry_v1 {      /* GTF_xxx: various type and flag information.  [XEN,GST] */      uint16_t flags;      /* The domain being granted foreign privileges. [GST] */ @@ -108,10 +118,13 @@ struct grant_entry {   *  GTF_permit_access: Allow @domid to map/access @frame.   *  GTF_accept_transfer: Allow @domid to transfer ownership of one page frame   *                       to this guest. Xen writes the page number to @frame. + *  GTF_transitive: Allow @domid to transitively access a subrange of + *                  @trans_grant in @trans_domid.  No mappings are allowed.   */  #define GTF_invalid         (0U<<0)  #define GTF_permit_access   (1U<<0)  #define GTF_accept_transfer (2U<<0) +#define GTF_transitive      (3U<<0)  #define GTF_type_mask       (3U<<0)  /* @@ -119,6 +132,9 @@ struct grant_entry {   *  GTF_readonly: Restrict @domid to read-only mappings and accesses. [GST]   *  GTF_reading: Grant entry is currently mapped for reading by @domid. [XEN]   *  GTF_writing: Grant entry is currently mapped for writing by @domid. [XEN] + *  GTF_sub_page: Grant access to only a subrange of the page.  @domid + *                will only be allowed to copy from the grant, and not + *                map it. [GST]   */  #define _GTF_readonly       (2)  #define GTF_readonly        (1U<<_GTF_readonly) @@ -126,6 +142,8 @@ struct grant_entry {  #define GTF_reading         (1U<<_GTF_reading)  #define _GTF_writing        (4)  #define GTF_writing         (1U<<_GTF_writing) +#define _GTF_sub_page       (8) +#define GTF_sub_page        (1U<<_GTF_sub_page)  /*   * Subflags for GTF_accept_transfer: @@ -142,15 +160,81 @@ struct grant_entry {  #define _GTF_transfer_completed (3)  #define GTF_transfer_completed  (1U<<_GTF_transfer_completed) +/* + * Version 2 grant table entries.  These fulfil the same role as + * version 1 entries, but can represent more complicated operations. + * Any given domain will have either a version 1 or a version 2 table, + * and every entry in the table will be the same version. + * + * The interface by which domains use grant references does not depend + * on the grant table version in use by the other domain. + */ -/*********************************** - * GRANT TABLE QUERIES AND USES +/* + * Version 1 and version 2 grant entries share a common prefix.  The + * fields of the prefix are documented as part of struct + * grant_entry_v1.   */ +struct grant_entry_header { +    uint16_t flags; +    domid_t  domid; +};  /* - * Reference to a grant entry in a specified domain's grant table. + * Version 2 of the grant entry structure, here is an union because three + * different types are suppotted: full_page, sub_page and transitive. + */ +union grant_entry_v2 { +    struct grant_entry_header hdr; + +    /* +     * This member is used for V1-style full page grants, where either: +     * +     * -- hdr.type is GTF_accept_transfer, or +     * -- hdr.type is GTF_permit_access and GTF_sub_page is not set. +     * +     * In that case, the frame field has the same semantics as the +     * field of the same name in the V1 entry structure. +     */ +    struct { +	struct grant_entry_header hdr; +	uint32_t pad0; +	uint64_t frame; +    } full_page; + +    /* +     * If the grant type is GTF_grant_access and GTF_sub_page is set, +     * @domid is allowed to access bytes [@page_off,@page_off+@length) +     * in frame @frame. +     */ +    struct { +	struct grant_entry_header hdr; +	uint16_t page_off; +	uint16_t length; +	uint64_t frame; +    } sub_page; + +    /* +     * If the grant is GTF_transitive, @domid is allowed to use the +     * grant @gref in domain @trans_domid, as if it was the local +     * domain.  Obviously, the transitive access must be compatible +     * with the original grant. +     */ +    struct { +	struct grant_entry_header hdr; +	domid_t trans_domid; +	uint16_t pad0; +	grant_ref_t gref; +    } transitive; + +    uint32_t __spacer[4]; /* Pad to a power of two */ +}; + +typedef uint16_t grant_status_t; + +/*********************************** + * GRANT TABLE QUERIES AND USES   */ -typedef uint32_t grant_ref_t;  /*   * Handle to track a mapping created via a grant reference. @@ -226,7 +310,7 @@ struct gnttab_setup_table {      uint32_t nr_frames;      /* OUT parameters. */      int16_t  status;              /* GNTST_* */ -    GUEST_HANDLE(ulong) frame_list; +    GUEST_HANDLE(xen_pfn_t) frame_list;  };  DEFINE_GUEST_HANDLE_STRUCT(gnttab_setup_table); @@ -254,7 +338,7 @@ DEFINE_GUEST_HANDLE_STRUCT(gnttab_dump_table);  #define GNTTABOP_transfer                4  struct gnttab_transfer {      /* IN parameters. */ -    unsigned long mfn; +    xen_pfn_t mfn;      domid_t       domid;      grant_ref_t   ref;      /* OUT parameters. */ @@ -291,7 +375,7 @@ struct gnttab_copy {  	struct {  		union {  			grant_ref_t ref; -			unsigned long   gmfn; +			xen_pfn_t   gmfn;  		} u;  		domid_t  domid;  		uint16_t offset; @@ -322,6 +406,79 @@ struct gnttab_query_size {  DEFINE_GUEST_HANDLE_STRUCT(gnttab_query_size);  /* + * GNTTABOP_unmap_and_replace: Destroy one or more grant-reference mappings + * tracked by <handle> but atomically replace the page table entry with one + * pointing to the machine address under <new_addr>.  <new_addr> will be + * redirected to the null entry. + * NOTES: + *  1. The call may fail in an undefined manner if either mapping is not + *     tracked by <handle>. + *  2. After executing a batch of unmaps, it is guaranteed that no stale + *     mappings will remain in the device or host TLBs. + */ +#define GNTTABOP_unmap_and_replace    7 +struct gnttab_unmap_and_replace { +    /* IN parameters. */ +    uint64_t host_addr; +    uint64_t new_addr; +    grant_handle_t handle; +    /* OUT parameters. */ +    int16_t  status;              /* GNTST_* */ +}; +DEFINE_GUEST_HANDLE_STRUCT(gnttab_unmap_and_replace); + +/* + * GNTTABOP_set_version: Request a particular version of the grant + * table shared table structure.  This operation can only be performed + * once in any given domain.  It must be performed before any grants + * are activated; otherwise, the domain will be stuck with version 1. + * The only defined versions are 1 and 2. + */ +#define GNTTABOP_set_version          8 +struct gnttab_set_version { +    /* IN parameters */ +    uint32_t version; +}; +DEFINE_GUEST_HANDLE_STRUCT(gnttab_set_version); + +/* + * GNTTABOP_get_status_frames: Get the list of frames used to store grant + * status for <dom>. In grant format version 2, the status is separated + * from the other shared grant fields to allow more efficient synchronization + * using barriers instead of atomic cmpexch operations. + * <nr_frames> specify the size of vector <frame_list>. + * The frame addresses are returned in the <frame_list>. + * Only <nr_frames> addresses are returned, even if the table is larger. + * NOTES: + *  1. <dom> may be specified as DOMID_SELF. + *  2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF. + */ +#define GNTTABOP_get_status_frames     9 +struct gnttab_get_status_frames { +    /* IN parameters. */ +    uint32_t nr_frames; +    domid_t  dom; +    /* OUT parameters. */ +    int16_t  status;              /* GNTST_* */ +    GUEST_HANDLE(uint64_t) frame_list; +}; +DEFINE_GUEST_HANDLE_STRUCT(gnttab_get_status_frames); + +/* + * GNTTABOP_get_version: Get the grant table version which is in + * effect for domain <dom>. + */ +#define GNTTABOP_get_version          10 +struct gnttab_get_version { +    /* IN parameters */ +    domid_t dom; +    uint16_t pad; +    /* OUT parameters */ +    uint32_t version; +}; +DEFINE_GUEST_HANDLE_STRUCT(gnttab_get_version); + +/*   * Bitfield values for update_pin_status.flags.   */   /* Map the grant entry for access by I/O devices. */ @@ -362,7 +519,9 @@ DEFINE_GUEST_HANDLE_STRUCT(gnttab_query_size);  #define GNTST_no_device_space  (-7) /* Out of space in I/O MMU.              */  #define GNTST_permission_denied (-8) /* Not enough privilege for operation.  */  #define GNTST_bad_page         (-9) /* Specified page was invalid for op.    */ -#define GNTST_bad_copy_arg    (-10) /* copy arguments cross page boundary */ +#define GNTST_bad_copy_arg    (-10) /* copy arguments cross page boundary.   */ +#define GNTST_address_too_big (-11) /* transfer page address too large.      */ +#define GNTST_eagain          (-12) /* Operation not done; try again.        */  #define GNTTABOP_error_msgs {                   \      "okay",                                     \ @@ -375,7 +534,9 @@ DEFINE_GUEST_HANDLE_STRUCT(gnttab_query_size);      "no spare translation slot in the I/O MMU", \      "permission denied",                        \      "bad page",                                 \ -    "copy arguments cross page boundary"        \ +    "copy arguments cross page boundary",       \ +    "page address size too large",              \ +    "operation not done; try again"             \  }  #endif /* __XEN_PUBLIC_GRANT_TABLE_H__ */ diff --git a/include/xen/interface/hvm/hvm_op.h b/include/xen/interface/hvm/hvm_op.h index a4827f46ee9..956a0468286 100644 --- a/include/xen/interface/hvm/hvm_op.h +++ b/include/xen/interface/hvm/hvm_op.h @@ -43,4 +43,23 @@ struct xen_hvm_pagetable_dying {  typedef struct xen_hvm_pagetable_dying xen_hvm_pagetable_dying_t;  DEFINE_GUEST_HANDLE_STRUCT(xen_hvm_pagetable_dying_t); +enum hvmmem_type_t { +    HVMMEM_ram_rw,             /* Normal read/write guest RAM */ +    HVMMEM_ram_ro,             /* Read-only; writes are discarded */ +    HVMMEM_mmio_dm,            /* Reads and write go to the device model */ +}; + +#define HVMOP_get_mem_type    15 +/* Return hvmmem_type_t for the specified pfn. */ +struct xen_hvm_get_mem_type { +    /* Domain to be queried. */ +    domid_t domid; +    /* OUT variable. */ +    uint16_t mem_type; +    uint16_t pad[2]; /* align next field on 8-byte boundary */ +    /* IN variable. */ +    uint64_t pfn; +}; +DEFINE_GUEST_HANDLE_STRUCT(xen_hvm_get_mem_type); +  #endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */ diff --git a/include/xen/interface/hvm/params.h b/include/xen/interface/hvm/params.h index 1888d8c157e..a6c79911e72 100644 --- a/include/xen/interface/hvm/params.h +++ b/include/xen/interface/hvm/params.h @@ -21,7 +21,7 @@  #ifndef __XEN_PUBLIC_HVM_PARAMS_H__  #define __XEN_PUBLIC_HVM_PARAMS_H__ -#include "hvm_op.h" +#include <xen/interface/hvm/hvm_op.h>  /*   * Parameter space for HVMOP_{set,get}_param. @@ -90,6 +90,10 @@  /* Boolean: Enable aligning all periodic vpts to reduce interrupts */  #define HVM_PARAM_VPT_ALIGN    16 -#define HVM_NR_PARAMS          17 +/* Console debug shared memory ring and event channel */ +#define HVM_PARAM_CONSOLE_PFN    17 +#define HVM_PARAM_CONSOLE_EVTCHN 18 + +#define HVM_NR_PARAMS          19  #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */ diff --git a/include/xen/interface/io/blkif.h b/include/xen/interface/io/blkif.h index c2d1fa4dc1e..c33e1c489eb 100644 --- a/include/xen/interface/io/blkif.h +++ b/include/xen/interface/io/blkif.h @@ -9,8 +9,8 @@  #ifndef __XEN_PUBLIC_IO_BLKIF_H__  #define __XEN_PUBLIC_IO_BLKIF_H__ -#include "ring.h" -#include "../grant_table.h" +#include <xen/interface/io/ring.h> +#include <xen/interface/grant_table.h>  /*   * Front->back notifications: When enqueuing a new request, sending a @@ -45,26 +45,164 @@ typedef uint64_t blkif_sector_t;  #define BLKIF_OP_WRITE_BARRIER     2  /* + * Recognised if "feature-flush-cache" is present in backend xenbus + * info.  A flush will ask the underlying storage hardware to flush its + * non-volatile caches as appropriate.  The "feature-flush-cache" node + * contains a boolean indicating whether flush requests are likely to + * succeed or fail. Either way, a flush request may fail at any time + * with BLKIF_RSP_EOPNOTSUPP if it is unsupported by the underlying + * block-device hardware. The boolean simply indicates whether or not it + * is worthwhile for the frontend to attempt flushes.  If a backend does + * not recognise BLKIF_OP_WRITE_FLUSH_CACHE, it should *not* create the + * "feature-flush-cache" node! + */ +#define BLKIF_OP_FLUSH_DISKCACHE   3 + +/* + * Recognised only if "feature-discard" is present in backend xenbus info. + * The "feature-discard" node contains a boolean indicating whether trim + * (ATA) or unmap (SCSI) - conviently called discard requests are likely + * to succeed or fail. Either way, a discard request + * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by + * the underlying block-device hardware. The boolean simply indicates whether + * or not it is worthwhile for the frontend to attempt discard requests. + * If a backend does not recognise BLKIF_OP_DISCARD, it should *not* + * create the "feature-discard" node! + * + * Discard operation is a request for the underlying block device to mark + * extents to be erased. However, discard does not guarantee that the blocks + * will be erased from the device - it is just a hint to the device + * controller that these blocks are no longer in use. What the device + * controller does with that information is left to the controller. + * Discard operations are passed with sector_number as the + * sector index to begin discard operations at and nr_sectors as the number of + * sectors to be discarded. The specified sectors should be discarded if the + * underlying block device supports trim (ATA) or unmap (SCSI) operations, + * or a BLKIF_RSP_EOPNOTSUPP  should be returned. + * More information about trim/unmap operations at: + * http://t13.org/Documents/UploadedDocuments/docs2008/ + *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc + * http://www.seagate.com/staticfiles/support/disc/manuals/ + *     Interface%20manuals/100293068c.pdf + * The backend can optionally provide three extra XenBus attributes to + * further optimize the discard functionality: + * 'discard-alignment' - Devices that support discard functionality may + * internally allocate space in units that are bigger than the exported + * logical block size. The discard-alignment parameter indicates how many bytes + * the beginning of the partition is offset from the internal allocation unit's + * natural alignment. + * 'discard-granularity'  - Devices that support discard functionality may + * internally allocate space using units that are bigger than the logical block + * size. The discard-granularity parameter indicates the size of the internal + * allocation unit in bytes if reported by the device. Otherwise the + * discard-granularity will be set to match the device's physical block size. + * 'discard-secure' - All copies of the discarded sectors (potentially created + * by garbage collection) must also be erased.  To use this feature, the flag + * BLKIF_DISCARD_SECURE must be set in the blkif_request_trim. + */ +#define BLKIF_OP_DISCARD           5 + +/* + * Recognized if "feature-max-indirect-segments" in present in the backend + * xenbus info. The "feature-max-indirect-segments" node contains the maximum + * number of segments allowed by the backend per request. If the node is + * present, the frontend might use blkif_request_indirect structs in order to + * issue requests with more than BLKIF_MAX_SEGMENTS_PER_REQUEST (11). The + * maximum number of indirect segments is fixed by the backend, but the + * frontend can issue requests with any number of indirect segments as long as + * it's less than the number provided by the backend. The indirect_grefs field + * in blkif_request_indirect should be filled by the frontend with the + * grant references of the pages that are holding the indirect segments. + * These pages are filled with an array of blkif_request_segment that hold the + * information about the segments. The number of indirect pages to use is + * determined by the number of segments an indirect request contains. Every + * indirect page can contain a maximum of + * (PAGE_SIZE / sizeof(struct blkif_request_segment)) segments, so to + * calculate the number of indirect pages to use we have to do + * ceil(indirect_segments / (PAGE_SIZE / sizeof(struct blkif_request_segment))). + * + * If a backend does not recognize BLKIF_OP_INDIRECT, it should *not* + * create the "feature-max-indirect-segments" node! + */ +#define BLKIF_OP_INDIRECT          6 + +/*   * Maximum scatter/gather segments per request.   * This is carefully chosen so that sizeof(struct blkif_ring) <= PAGE_SIZE.   * NB. This could be 12 if the ring indexes weren't stored in the same page.   */  #define BLKIF_MAX_SEGMENTS_PER_REQUEST 11 -struct blkif_request { -	uint8_t        operation;    /* BLKIF_OP_???                         */ -	uint8_t        nr_segments;  /* number of segments                   */ -	blkif_vdev_t   handle;       /* only for read/write requests         */ -	uint64_t       id;           /* private guest value, echoed in resp  */ -	blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */ -	struct blkif_request_segment { +#define BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST 8 + +struct blkif_request_segment {  		grant_ref_t gref;        /* reference to I/O buffer frame        */  		/* @first_sect: first sector in frame to transfer (inclusive).   */  		/* @last_sect: last sector in frame to transfer (inclusive).     */  		uint8_t     first_sect, last_sect; -	} seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];  }; +struct blkif_request_rw { +	uint8_t        nr_segments;  /* number of segments                   */ +	blkif_vdev_t   handle;       /* only for read/write requests         */ +#ifndef CONFIG_X86_32 +	uint32_t       _pad1;	     /* offsetof(blkif_request,u.rw.id) == 8 */ +#endif +	uint64_t       id;           /* private guest value, echoed in resp  */ +	blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */ +	struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; +} __attribute__((__packed__)); + +struct blkif_request_discard { +	uint8_t        flag;         /* BLKIF_DISCARD_SECURE or zero.        */ +#define BLKIF_DISCARD_SECURE (1<<0)  /* ignored if discard-secure=0          */ +	blkif_vdev_t   _pad1;        /* only for read/write requests         */ +#ifndef CONFIG_X86_32 +	uint32_t       _pad2;        /* offsetof(blkif_req..,u.discard.id)==8*/ +#endif +	uint64_t       id;           /* private guest value, echoed in resp  */ +	blkif_sector_t sector_number; +	uint64_t       nr_sectors; +	uint8_t        _pad3; +} __attribute__((__packed__)); + +struct blkif_request_other { +	uint8_t      _pad1; +	blkif_vdev_t _pad2;        /* only for read/write requests         */ +#ifndef CONFIG_X86_32 +	uint32_t     _pad3;        /* offsetof(blkif_req..,u.other.id)==8*/ +#endif +	uint64_t     id;           /* private guest value, echoed in resp  */ +} __attribute__((__packed__)); + +struct blkif_request_indirect { +	uint8_t        indirect_op; +	uint16_t       nr_segments; +#ifndef CONFIG_X86_32 +	uint32_t       _pad1;        /* offsetof(blkif_...,u.indirect.id) == 8 */ +#endif +	uint64_t       id; +	blkif_sector_t sector_number; +	blkif_vdev_t   handle; +	uint16_t       _pad2; +	grant_ref_t    indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST]; +#ifndef CONFIG_X86_32 +	uint32_t      _pad3;         /* make it 64 byte aligned */ +#else +	uint64_t      _pad3;         /* make it 64 byte aligned */ +#endif +} __attribute__((__packed__)); + +struct blkif_request { +	uint8_t        operation;    /* BLKIF_OP_???                         */ +	union { +		struct blkif_request_rw rw; +		struct blkif_request_discard discard; +		struct blkif_request_other other; +		struct blkif_request_indirect indirect; +	} u; +} __attribute__((__packed__)); +  struct blkif_response {  	uint64_t        id;              /* copied from request */  	uint8_t         operation;       /* copied from request */ @@ -91,4 +229,25 @@ DEFINE_RING_TYPES(blkif, struct blkif_request, struct blkif_response);  #define VDISK_REMOVABLE    0x2  #define VDISK_READONLY     0x4 +/* Xen-defined major numbers for virtual disks, they look strangely + * familiar */ +#define XEN_IDE0_MAJOR	3 +#define XEN_IDE1_MAJOR	22 +#define XEN_SCSI_DISK0_MAJOR	8 +#define XEN_SCSI_DISK1_MAJOR	65 +#define XEN_SCSI_DISK2_MAJOR	66 +#define XEN_SCSI_DISK3_MAJOR	67 +#define XEN_SCSI_DISK4_MAJOR	68 +#define XEN_SCSI_DISK5_MAJOR	69 +#define XEN_SCSI_DISK6_MAJOR	70 +#define XEN_SCSI_DISK7_MAJOR	71 +#define XEN_SCSI_DISK8_MAJOR	128 +#define XEN_SCSI_DISK9_MAJOR	129 +#define XEN_SCSI_DISK10_MAJOR	130 +#define XEN_SCSI_DISK11_MAJOR	131 +#define XEN_SCSI_DISK12_MAJOR	132 +#define XEN_SCSI_DISK13_MAJOR	133 +#define XEN_SCSI_DISK14_MAJOR	134 +#define XEN_SCSI_DISK15_MAJOR	135 +  #endif /* __XEN_PUBLIC_IO_BLKIF_H__ */ diff --git a/include/xen/interface/io/netif.h b/include/xen/interface/io/netif.h index 518481c95f1..70054cc0708 100644 --- a/include/xen/interface/io/netif.h +++ b/include/xen/interface/io/netif.h @@ -9,8 +9,26 @@  #ifndef __XEN_PUBLIC_IO_NETIF_H__  #define __XEN_PUBLIC_IO_NETIF_H__ -#include "ring.h" -#include "../grant_table.h" +#include <xen/interface/io/ring.h> +#include <xen/interface/grant_table.h> + +/* + * Older implementation of Xen network frontend / backend has an + * implicit dependency on the MAX_SKB_FRAGS as the maximum number of + * ring slots a skb can use. Netfront / netback may not work as + * expected when frontend and backend have different MAX_SKB_FRAGS. + * + * A better approach is to add mechanism for netfront / netback to + * negotiate this value. However we cannot fix all possible + * frontends, so we need to define a value which states the minimum + * slots backend must support. + * + * The minimum value derives from older Linux kernel's MAX_SKB_FRAGS + * (18), which is proved to work with most frontends. Any new backend + * which doesn't negotiate with frontend should expect frontend to + * send a valid packet using slots up to this value. + */ +#define XEN_NETIF_NR_SLOTS_MIN 18  /*   * Notifications after enqueuing any type of message should be conditional on @@ -20,52 +38,134 @@   * that it cannot safely queue packets (as it may not be kicked to send them).   */ + /* + * "feature-split-event-channels" is introduced to separate guest TX + * and RX notificaion. Backend either doesn't support this feature or + * advertise it via xenstore as 0 (disabled) or 1 (enabled). + * + * To make use of this feature, frontend should allocate two event + * channels for TX and RX, advertise them to backend as + * "event-channel-tx" and "event-channel-rx" respectively. If frontend + * doesn't want to use this feature, it just writes "event-channel" + * node as before. + */ + +/* + * Multiple transmit and receive queues: + * If supported, the backend will write the key "multi-queue-max-queues" to + * the directory for that vif, and set its value to the maximum supported + * number of queues. + * Frontends that are aware of this feature and wish to use it can write the + * key "multi-queue-num-queues", set to the number they wish to use, which + * must be greater than zero, and no more than the value reported by the backend + * in "multi-queue-max-queues". + * + * Queues replicate the shared rings and event channels. + * "feature-split-event-channels" may optionally be used when using + * multiple queues, but is not mandatory. + * + * Each queue consists of one shared ring pair, i.e. there must be the same + * number of tx and rx rings. + * + * For frontends requesting just one queue, the usual event-channel and + * ring-ref keys are written as before, simplifying the backend processing + * to avoid distinguishing between a frontend that doesn't understand the + * multi-queue feature, and one that does, but requested only one queue. + * + * Frontends requesting two or more queues must not write the toplevel + * event-channel (or event-channel-{tx,rx}) and {tx,rx}-ring-ref keys, + * instead writing those keys under sub-keys having the name "queue-N" where + * N is the integer ID of the queue for which those keys belong. Queues + * are indexed from zero. For example, a frontend with two queues and split + * event channels must write the following set of queue-related keys: + * + * /local/domain/1/device/vif/0/multi-queue-num-queues = "2" + * /local/domain/1/device/vif/0/queue-0 = "" + * /local/domain/1/device/vif/0/queue-0/tx-ring-ref = "<ring-ref-tx0>" + * /local/domain/1/device/vif/0/queue-0/rx-ring-ref = "<ring-ref-rx0>" + * /local/domain/1/device/vif/0/queue-0/event-channel-tx = "<evtchn-tx0>" + * /local/domain/1/device/vif/0/queue-0/event-channel-rx = "<evtchn-rx0>" + * /local/domain/1/device/vif/0/queue-1 = "" + * /local/domain/1/device/vif/0/queue-1/tx-ring-ref = "<ring-ref-tx1>" + * /local/domain/1/device/vif/0/queue-1/rx-ring-ref = "<ring-ref-rx1" + * /local/domain/1/device/vif/0/queue-1/event-channel-tx = "<evtchn-tx1>" + * /local/domain/1/device/vif/0/queue-1/event-channel-rx = "<evtchn-rx1>" + * + * If there is any inconsistency in the XenStore data, the backend may + * choose not to connect any queues, instead treating the request as an + * error. This includes scenarios where more (or fewer) queues were + * requested than the frontend provided details for. + * + * Mapping of packets to queues is considered to be a function of the + * transmitting system (backend or frontend) and is not negotiated + * between the two. Guests are free to transmit packets on any queue + * they choose, provided it has been set up correctly. Guests must be + * prepared to receive packets on any queue they have requested be set up. + */ + +/* + * "feature-no-csum-offload" should be used to turn IPv4 TCP/UDP checksum + * offload off or on. If it is missing then the feature is assumed to be on. + * "feature-ipv6-csum-offload" should be used to turn IPv6 TCP/UDP checksum + * offload on or off. If it is missing then the feature is assumed to be off. + */ + +/* + * "feature-gso-tcpv4" and "feature-gso-tcpv6" advertise the capability to + * handle large TCP packets (in IPv4 or IPv6 form respectively). Neither + * frontends nor backends are assumed to be capable unless the flags are + * present. + */ +  /*   * This is the 'wire' format for packets: - *  Request 1: netif_tx_request -- NETTXF_* (any flags) - * [Request 2: netif_tx_extra]  (only if request 1 has NETTXF_extra_info) - * [Request 3: netif_tx_extra]  (only if request 2 has XEN_NETIF_EXTRA_MORE) - *  Request 4: netif_tx_request -- NETTXF_more_data - *  Request 5: netif_tx_request -- NETTXF_more_data + *  Request 1: xen_netif_tx_request  -- XEN_NETTXF_* (any flags) + * [Request 2: xen_netif_extra_info]    (only if request 1 has XEN_NETTXF_extra_info) + * [Request 3: xen_netif_extra_info]    (only if request 2 has XEN_NETIF_EXTRA_MORE) + *  Request 4: xen_netif_tx_request  -- XEN_NETTXF_more_data + *  Request 5: xen_netif_tx_request  -- XEN_NETTXF_more_data   *  ... - *  Request N: netif_tx_request -- 0 + *  Request N: xen_netif_tx_request  -- 0   */  /* Protocol checksum field is blank in the packet (hardware offload)? */ -#define _NETTXF_csum_blank     (0) -#define  NETTXF_csum_blank     (1U<<_NETTXF_csum_blank) +#define _XEN_NETTXF_csum_blank		(0) +#define  XEN_NETTXF_csum_blank		(1U<<_XEN_NETTXF_csum_blank)  /* Packet data has been validated against protocol checksum. */ -#define _NETTXF_data_validated (1) -#define  NETTXF_data_validated (1U<<_NETTXF_data_validated) +#define _XEN_NETTXF_data_validated	(1) +#define  XEN_NETTXF_data_validated	(1U<<_XEN_NETTXF_data_validated)  /* Packet continues in the next request descriptor. */ -#define _NETTXF_more_data      (2) -#define  NETTXF_more_data      (1U<<_NETTXF_more_data) +#define _XEN_NETTXF_more_data		(2) +#define  XEN_NETTXF_more_data		(1U<<_XEN_NETTXF_more_data)  /* Packet to be followed by extra descriptor(s). */ -#define _NETTXF_extra_info     (3) -#define  NETTXF_extra_info     (1U<<_NETTXF_extra_info) +#define _XEN_NETTXF_extra_info		(3) +#define  XEN_NETTXF_extra_info		(1U<<_XEN_NETTXF_extra_info) +#define XEN_NETIF_MAX_TX_SIZE 0xFFFF  struct xen_netif_tx_request {      grant_ref_t gref;      /* Reference to buffer page */      uint16_t offset;       /* Offset within buffer page */ -    uint16_t flags;        /* NETTXF_* */ +    uint16_t flags;        /* XEN_NETTXF_* */      uint16_t id;           /* Echoed in response message. */      uint16_t size;         /* Packet size in bytes.       */  }; -/* Types of netif_extra_info descriptors. */ -#define XEN_NETIF_EXTRA_TYPE_NONE  (0)  /* Never used - invalid */ -#define XEN_NETIF_EXTRA_TYPE_GSO   (1)  /* u.gso */ -#define XEN_NETIF_EXTRA_TYPE_MAX   (2) +/* Types of xen_netif_extra_info descriptors. */ +#define XEN_NETIF_EXTRA_TYPE_NONE	(0)  /* Never used - invalid */ +#define XEN_NETIF_EXTRA_TYPE_GSO	(1)  /* u.gso */ +#define XEN_NETIF_EXTRA_TYPE_MAX	(2) -/* netif_extra_info flags. */ -#define _XEN_NETIF_EXTRA_FLAG_MORE (0) -#define XEN_NETIF_EXTRA_FLAG_MORE  (1U<<_XEN_NETIF_EXTRA_FLAG_MORE) +/* xen_netif_extra_info flags. */ +#define _XEN_NETIF_EXTRA_FLAG_MORE	(0) +#define  XEN_NETIF_EXTRA_FLAG_MORE	(1U<<_XEN_NETIF_EXTRA_FLAG_MORE) -/* GSO types - only TCPv4 currently supported. */ -#define XEN_NETIF_GSO_TYPE_TCPV4        (1) +/* GSO types */ +#define XEN_NETIF_GSO_TYPE_NONE		(0) +#define XEN_NETIF_GSO_TYPE_TCPV4	(1) +#define XEN_NETIF_GSO_TYPE_TCPV6	(2)  /*   * This structure needs to fit within both netif_tx_request and @@ -107,7 +207,7 @@ struct xen_netif_extra_info {  struct xen_netif_tx_response {  	uint16_t id; -	int16_t  status;       /* NETIF_RSP_* */ +	int16_t  status;       /* XEN_NETIF_RSP_* */  };  struct xen_netif_rx_request { @@ -116,25 +216,29 @@ struct xen_netif_rx_request {  };  /* Packet data has been validated against protocol checksum. */ -#define _NETRXF_data_validated (0) -#define  NETRXF_data_validated (1U<<_NETRXF_data_validated) +#define _XEN_NETRXF_data_validated	(0) +#define  XEN_NETRXF_data_validated	(1U<<_XEN_NETRXF_data_validated)  /* Protocol checksum field is blank in the packet (hardware offload)? */ -#define _NETRXF_csum_blank     (1) -#define  NETRXF_csum_blank     (1U<<_NETRXF_csum_blank) +#define _XEN_NETRXF_csum_blank		(1) +#define  XEN_NETRXF_csum_blank		(1U<<_XEN_NETRXF_csum_blank)  /* Packet continues in the next request descriptor. */ -#define _NETRXF_more_data      (2) -#define  NETRXF_more_data      (1U<<_NETRXF_more_data) +#define _XEN_NETRXF_more_data		(2) +#define  XEN_NETRXF_more_data		(1U<<_XEN_NETRXF_more_data)  /* Packet to be followed by extra descriptor(s). */ -#define _NETRXF_extra_info     (3) -#define  NETRXF_extra_info     (1U<<_NETRXF_extra_info) +#define _XEN_NETRXF_extra_info		(3) +#define  XEN_NETRXF_extra_info		(1U<<_XEN_NETRXF_extra_info) + +/* GSO Prefix descriptor. */ +#define _XEN_NETRXF_gso_prefix		(4) +#define  XEN_NETRXF_gso_prefix		(1U<<_XEN_NETRXF_gso_prefix)  struct xen_netif_rx_response {      uint16_t id;      uint16_t offset;       /* Offset in page of start of received packet  */ -    uint16_t flags;        /* NETRXF_* */ +    uint16_t flags;        /* XEN_NETRXF_* */      int16_t  status;       /* -ve: BLKIF_RSP_* ; +ve: Rx'ed pkt size. */  }; @@ -149,10 +253,10 @@ DEFINE_RING_TYPES(xen_netif_rx,  		  struct xen_netif_rx_request,  		  struct xen_netif_rx_response); -#define NETIF_RSP_DROPPED         -2 -#define NETIF_RSP_ERROR           -1 -#define NETIF_RSP_OKAY             0 -/* No response: used for auxiliary requests (e.g., netif_tx_extra). */ -#define NETIF_RSP_NULL             1 +#define XEN_NETIF_RSP_DROPPED	-2 +#define XEN_NETIF_RSP_ERROR	-1 +#define XEN_NETIF_RSP_OKAY	 0 +/* No response: used for auxiliary requests (e.g., xen_netif_extra_info). */ +#define XEN_NETIF_RSP_NULL	 1  #endif diff --git a/include/xen/interface/io/protocols.h b/include/xen/interface/io/protocols.h index 01fc8ae5f0b..545a14ba0bb 100644 --- a/include/xen/interface/io/protocols.h +++ b/include/xen/interface/io/protocols.h @@ -3,17 +3,17 @@  #define XEN_IO_PROTO_ABI_X86_32     "x86_32-abi"  #define XEN_IO_PROTO_ABI_X86_64     "x86_64-abi" -#define XEN_IO_PROTO_ABI_IA64       "ia64-abi"  #define XEN_IO_PROTO_ABI_POWERPC64  "powerpc64-abi" +#define XEN_IO_PROTO_ABI_ARM        "arm-abi"  #if defined(__i386__)  # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_32  #elif defined(__x86_64__)  # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_64 -#elif defined(__ia64__) -# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_IA64  #elif defined(__powerpc64__)  # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_POWERPC64 +#elif defined(__arm__) || defined(__aarch64__) +# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_ARM  #else  # error arch fixup needed here  #endif diff --git a/include/xen/interface/io/ring.h b/include/xen/interface/io/ring.h index e8cbf431c8c..7d28aff605c 100644 --- a/include/xen/interface/io/ring.h +++ b/include/xen/interface/io/ring.h @@ -24,8 +24,15 @@ typedef unsigned int RING_IDX;   * A ring contains as many entries as will fit, rounded down to the nearest   * power of two (so we can mask with (size-1) to loop around).   */ -#define __RING_SIZE(_s, _sz) \ -    (__RD32(((_sz) - (long)&(_s)->ring + (long)(_s)) / sizeof((_s)->ring[0]))) +#define __CONST_RING_SIZE(_s, _sz)				\ +	(__RD32(((_sz) - offsetof(struct _s##_sring, ring)) /	\ +		sizeof(((struct _s##_sring *)0)->ring[0]))) + +/* + * The same for passing in an actual pointer instead of a name tag. + */ +#define __RING_SIZE(_s, _sz)						\ +	(__RD32(((_sz) - (long)&(_s)->ring + (long)(_s)) / sizeof((_s)->ring[0])))  /*   * Macros to make the correct C datatypes for a new kind of ring. @@ -181,6 +188,11 @@ struct __name##_back_ring {						\  #define RING_REQUEST_CONS_OVERFLOW(_r, _cons)				\      (((_cons) - (_r)->rsp_prod_pvt) >= RING_SIZE(_r)) +/* Ill-behaved frontend determination: Can there be this many requests? */ +#define RING_REQUEST_PROD_OVERFLOW(_r, _prod)               \ +    (((_prod) - (_r)->rsp_prod_pvt) > RING_SIZE(_r)) + +  #define RING_PUSH_REQUESTS(_r) do {					\      wmb(); /* back sees requests /before/ updated producer index */	\      (_r)->sring->req_prod = (_r)->req_prod_pvt;				\ diff --git a/include/xen/interface/io/tpmif.h b/include/xen/interface/io/tpmif.h new file mode 100644 index 00000000000..28e7dcd75e8 --- /dev/null +++ b/include/xen/interface/io/tpmif.h @@ -0,0 +1,52 @@ +/****************************************************************************** + * tpmif.h + * + * TPM I/O interface for Xen guest OSes, v2 + * + * This file is in the public domain. + * + */ + +#ifndef __XEN_PUBLIC_IO_TPMIF_H__ +#define __XEN_PUBLIC_IO_TPMIF_H__ + +/* + * Xenbus state machine + * + * Device open: + *   1. Both ends start in XenbusStateInitialising + *   2. Backend transitions to InitWait (frontend does not wait on this step) + *   3. Frontend populates ring-ref, event-channel, feature-protocol-v2 + *   4. Frontend transitions to Initialised + *   5. Backend maps grant and event channel, verifies feature-protocol-v2 + *   6. Backend transitions to Connected + *   7. Frontend verifies feature-protocol-v2, transitions to Connected + * + * Device close: + *   1. State is changed to XenbusStateClosing + *   2. Frontend transitions to Closed + *   3. Backend unmaps grant and event, changes state to InitWait + */ + +enum vtpm_shared_page_state { +	VTPM_STATE_IDLE,         /* no contents / vTPM idle / cancel complete */ +	VTPM_STATE_SUBMIT,       /* request ready / vTPM working */ +	VTPM_STATE_FINISH,       /* response ready / vTPM idle */ +	VTPM_STATE_CANCEL,       /* cancel requested / vTPM working */ +}; +/* The backend should only change state to IDLE or FINISH, while the + * frontend should only change to SUBMIT or CANCEL. */ + + +struct vtpm_shared_page { +	uint32_t length;         /* request/response length in bytes */ + +	uint8_t state;           /* enum vtpm_shared_page_state */ +	uint8_t locality;        /* for the current request */ +	uint8_t pad; + +	uint8_t nr_extra_pages;  /* extra pages for long packets; may be zero */ +	uint32_t extra_pages[0]; /* grant IDs; length in nr_extra_pages */ +}; + +#endif diff --git a/include/xen/interface/io/xs_wire.h b/include/xen/interface/io/xs_wire.h index 99fcffb372d..794deb07eb5 100644 --- a/include/xen/interface/io/xs_wire.h +++ b/include/xen/interface/io/xs_wire.h @@ -26,7 +26,11 @@ enum xsd_sockmsg_type      XS_SET_PERMS,      XS_WATCH_EVENT,      XS_ERROR, -    XS_IS_DOMAIN_INTRODUCED +    XS_IS_DOMAIN_INTRODUCED, +    XS_RESUME, +    XS_SET_TARGET, +    XS_RESTRICT, +    XS_RESET_WATCHES,  };  #define XS_WRITE_NONE "NONE" @@ -84,4 +88,7 @@ struct xenstore_domain_interface {      XENSTORE_RING_IDX rsp_cons, rsp_prod;  }; +/* Violating this is very bad.  See docs/misc/xenstore.txt. */ +#define XENSTORE_PAYLOAD_MAX 4096 +  #endif /* _XS_WIRE_H */ diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h index d7a6c13bde6..2ecfe4f700d 100644 --- a/include/xen/interface/memory.h +++ b/include/xen/interface/memory.h @@ -31,10 +31,10 @@ struct xen_memory_reservation {       *   OUT: GMFN bases of extents that were allocated       *   (NB. This command also updates the mach_to_phys translation table)       */ -    GUEST_HANDLE(ulong) extent_start; +    GUEST_HANDLE(xen_pfn_t) extent_start;      /* Number of extents, and size/alignment of each (2^extent_order pages). */ -    unsigned long  nr_extents; +    xen_ulong_t  nr_extents;      unsigned int   extent_order;      /* @@ -92,7 +92,7 @@ struct xen_memory_exchange {       *     command will be non-zero.       *  5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER!       */ -    unsigned long nr_exchanged; +    xen_ulong_t nr_exchanged;  };  DEFINE_GUEST_HANDLE_STRUCT(xen_memory_exchange); @@ -130,7 +130,7 @@ struct xen_machphys_mfn_list {       * any large discontiguities in the machine address space, 2MB gaps in       * the machphys table will be represented by an MFN base of zero.       */ -    GUEST_HANDLE(ulong) extent_start; +    GUEST_HANDLE(xen_pfn_t) extent_start;      /*       * Number of extents written to the above array. This will be smaller @@ -141,6 +141,27 @@ struct xen_machphys_mfn_list {  DEFINE_GUEST_HANDLE_STRUCT(xen_machphys_mfn_list);  /* + * Returns the location in virtual address space of the machine_to_phys + * mapping table. Architectures which do not have a m2p table, or which do not + * map it by default into guest address space, do not implement this command. + * arg == addr of xen_machphys_mapping_t. + */ +#define XENMEM_machphys_mapping     12 +struct xen_machphys_mapping { +    xen_ulong_t v_start, v_end; /* Start and end virtual addresses.   */ +    xen_ulong_t max_mfn;        /* Maximum MFN that can be looked up. */ +}; +DEFINE_GUEST_HANDLE_STRUCT(xen_machphys_mapping_t); + +#define XENMAPSPACE_shared_info  0 /* shared info page */ +#define XENMAPSPACE_grant_table  1 /* grant table page */ +#define XENMAPSPACE_gmfn         2 /* GMFN */ +#define XENMAPSPACE_gmfn_range   3 /* GMFN range, XENMEM_add_to_physmap only. */ +#define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another dom, +				    * XENMEM_add_to_physmap_range only. +				    */ + +/*   * Sets the GPFN at which a particular page appears in the specified guest's   * pseudophysical address space.   * arg == addr of xen_add_to_physmap_t. @@ -150,41 +171,46 @@ struct xen_add_to_physmap {      /* Which domain to change the mapping for. */      domid_t domid; +    /* Number of pages to go through for gmfn_range */ +    uint16_t    size; +      /* Source mapping space. */ -#define XENMAPSPACE_shared_info 0 /* shared info page */ -#define XENMAPSPACE_grant_table 1 /* grant table page */      unsigned int space;      /* Index into source mapping space. */ -    unsigned long idx; +    xen_ulong_t idx;      /* GPFN where the source mapping page should appear. */ -    unsigned long gpfn; +    xen_pfn_t gpfn;  };  DEFINE_GUEST_HANDLE_STRUCT(xen_add_to_physmap); -/* - * Translates a list of domain-specific GPFNs into MFNs. Returns a -ve error - * code on failure. This call only works for auto-translated guests. - */ -#define XENMEM_translate_gpfn_list  8 -struct xen_translate_gpfn_list { -    /* Which domain to translate for? */ +/*** REMOVED ***/ +/*#define XENMEM_translate_gpfn_list  8*/ + +#define XENMEM_add_to_physmap_range 23 +struct xen_add_to_physmap_range { +    /* IN */ +    /* Which domain to change the mapping for. */      domid_t domid; +    uint16_t space; /* => enum phys_map_space */ -    /* Length of list. */ -    unsigned long nr_gpfns; +    /* Number of pages to go through */ +    uint16_t size; +    domid_t foreign_domid; /* IFF gmfn_foreign */ -    /* List of GPFNs to translate. */ -    GUEST_HANDLE(ulong) gpfn_list; +    /* Indexes into space being mapped. */ +    GUEST_HANDLE(xen_ulong_t) idxs; -    /* -     * Output list to contain MFN translations. May be the same as the input -     * list (in which case each input GPFN is overwritten with the output MFN). -     */ -    GUEST_HANDLE(ulong) mfn_list; +    /* GPFN in domid where the source mapping page should appear. */ +    GUEST_HANDLE(xen_pfn_t) gpfns; + +    /* OUT */ + +    /* Per index error code. */ +    GUEST_HANDLE(int) errs;  }; -DEFINE_GUEST_HANDLE_STRUCT(xen_translate_gpfn_list); +DEFINE_GUEST_HANDLE_STRUCT(xen_add_to_physmap_range);  /*   * Returns the pseudo-physical memory map as it was when the domain @@ -221,4 +247,20 @@ DEFINE_GUEST_HANDLE_STRUCT(xen_memory_map);   * during a driver critical region.   */  extern spinlock_t xen_reservation_lock; + +/* + * Unmaps the page appearing at a particular GPFN from the specified guest's + * pseudophysical address space. + * arg == addr of xen_remove_from_physmap_t. + */ +#define XENMEM_remove_from_physmap      15 +struct xen_remove_from_physmap { +    /* Which domain to change the mapping for. */ +    domid_t domid; + +    /* GPFN of the current mapping of the page. */ +    xen_pfn_t gpfn; +}; +DEFINE_GUEST_HANDLE_STRUCT(xen_remove_from_physmap); +  #endif /* __XEN_PUBLIC_MEMORY_H__ */ diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h index 2b2c66c3df0..610dba9b620 100644 --- a/include/xen/interface/physdev.h +++ b/include/xen/interface/physdev.h @@ -39,6 +39,27 @@ struct physdev_eoi {  };  /* + * Register a shared page for the hypervisor to indicate whether the guest + * must issue PHYSDEVOP_eoi. The semantics of PHYSDEVOP_eoi change slightly + * once the guest used this function in that the associated event channel + * will automatically get unmasked. The page registered is used as a bit + * array indexed by Xen's PIRQ value. + */ +#define PHYSDEVOP_pirq_eoi_gmfn_v1       17 +/* + * Register a shared page for the hypervisor to indicate whether the + * guest must issue PHYSDEVOP_eoi. This hypercall is very similar to + * PHYSDEVOP_pirq_eoi_gmfn_v1 but it doesn't change the semantics of + * PHYSDEVOP_eoi. The page registered is used as a bit array indexed by + * Xen's PIRQ value. + */ +#define PHYSDEVOP_pirq_eoi_gmfn_v2       28 +struct physdev_pirq_eoi_gmfn { +    /* IN */ +    xen_ulong_t gmfn; +}; + +/*   * Query the status of an IRQ line.   * @arg == pointer to physdev_irq_status_query structure.   */ @@ -109,6 +130,8 @@ struct physdev_irq {  #define MAP_PIRQ_TYPE_MSI		0x0  #define MAP_PIRQ_TYPE_GSI		0x1  #define MAP_PIRQ_TYPE_UNKNOWN		0x2 +#define MAP_PIRQ_TYPE_MSI_SEG		0x3 +#define MAP_PIRQ_TYPE_MULTI_MSI		0x4  #define PHYSDEVOP_map_pirq		13  struct physdev_map_pirq { @@ -119,11 +142,16 @@ struct physdev_map_pirq {      int index;      /* IN or OUT */      int pirq; -    /* IN */ +    /* IN - high 16 bits hold segment for ..._MSI_SEG and ..._MULTI_MSI */      int bus;      /* IN */      int devfn; -    /* IN */ +    /* IN +     * - For MSI-X contains entry number. +     * - For MSI with ..._MULTI_MSI contains number of vectors. +     * OUT (..._MULTI_MSI only) +     * - Number of vectors allocated. +     */      int entry_nr;      /* IN */      uint64_t table_base; @@ -144,6 +172,13 @@ struct physdev_manage_pci {  	uint8_t devfn;  }; +#define PHYSDEVOP_restore_msi            19 +struct physdev_restore_msi { +	/* IN */ +	uint8_t bus; +	uint8_t devfn; +}; +  #define PHYSDEVOP_manage_pci_add_ext	20  struct physdev_manage_pci_ext {  	/* IN */ @@ -188,6 +223,80 @@ struct physdev_nr_pirqs {      uint32_t nr_pirqs;  }; +/* type is MAP_PIRQ_TYPE_GSI or MAP_PIRQ_TYPE_MSI + * the hypercall returns a free pirq */ +#define PHYSDEVOP_get_free_pirq    23 +struct physdev_get_free_pirq { +    /* IN */  +    int type; +    /* OUT */ +    uint32_t pirq; +}; + +#define XEN_PCI_DEV_EXTFN              0x1 +#define XEN_PCI_DEV_VIRTFN             0x2 +#define XEN_PCI_DEV_PXM                0x4 + +#define XEN_PCI_MMCFG_RESERVED         0x1 + +#define PHYSDEVOP_pci_mmcfg_reserved    24 +struct physdev_pci_mmcfg_reserved { +    uint64_t address; +    uint16_t segment; +    uint8_t start_bus; +    uint8_t end_bus; +    uint32_t flags; +}; + +#define PHYSDEVOP_pci_device_add        25 +struct physdev_pci_device_add { +    /* IN */ +    uint16_t seg; +    uint8_t bus; +    uint8_t devfn; +    uint32_t flags; +    struct { +        uint8_t bus; +        uint8_t devfn; +    } physfn; +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +    uint32_t optarr[]; +#elif defined(__GNUC__) +    uint32_t optarr[0]; +#endif +}; + +#define PHYSDEVOP_pci_device_remove     26 +#define PHYSDEVOP_restore_msi_ext       27 +/* + * Dom0 should use these two to announce MMIO resources assigned to + * MSI-X capable devices won't (prepare) or may (release) change. + */ +#define PHYSDEVOP_prepare_msix          30 +#define PHYSDEVOP_release_msix          31 +struct physdev_pci_device { +    /* IN */ +    uint16_t seg; +    uint8_t bus; +    uint8_t devfn; +}; + +#define PHYSDEVOP_DBGP_RESET_PREPARE    1 +#define PHYSDEVOP_DBGP_RESET_DONE       2 + +#define PHYSDEVOP_DBGP_BUS_UNKNOWN      0 +#define PHYSDEVOP_DBGP_BUS_PCI          1 + +#define PHYSDEVOP_dbgp_op               29 +struct physdev_dbgp_op { +    /* IN */ +    uint8_t op; +    uint8_t bus; +    union { +        struct physdev_pci_device pci; +    } u; +}; +  /*   * Notify that some PIRQ-bound event channels have been unmasked.   * ** This command is obsolete since interface version 0x00030202 and is ** diff --git a/include/xen/interface/platform.h b/include/xen/interface/platform.h new file mode 100644 index 00000000000..f1331e3e727 --- /dev/null +++ b/include/xen/interface/platform.h @@ -0,0 +1,380 @@ +/****************************************************************************** + * platform.h + * + * Hardware platform operations. Intended for use by domain-0 kernel. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2002-2006, K Fraser + */ + +#ifndef __XEN_PUBLIC_PLATFORM_H__ +#define __XEN_PUBLIC_PLATFORM_H__ + +#include <xen/interface/xen.h> + +#define XENPF_INTERFACE_VERSION 0x03000001 + +/* + * Set clock such that it would read <secs,nsecs> after 00:00:00 UTC, + * 1 January, 1970 if the current system time was <system_time>. + */ +#define XENPF_settime             17 +struct xenpf_settime { +	/* IN variables. */ +	uint32_t secs; +	uint32_t nsecs; +	uint64_t system_time; +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_settime_t); + +/* + * Request memory range (@mfn, @mfn+@nr_mfns-1) to have type @type. + * On x86, @type is an architecture-defined MTRR memory type. + * On success, returns the MTRR that was used (@reg) and a handle that can + * be passed to XENPF_DEL_MEMTYPE to accurately tear down the new setting. + * (x86-specific). + */ +#define XENPF_add_memtype         31 +struct xenpf_add_memtype { +	/* IN variables. */ +	xen_pfn_t mfn; +	uint64_t nr_mfns; +	uint32_t type; +	/* OUT variables. */ +	uint32_t handle; +	uint32_t reg; +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_add_memtype_t); + +/* + * Tear down an existing memory-range type. If @handle is remembered then it + * should be passed in to accurately tear down the correct setting (in case + * of overlapping memory regions with differing types). If it is not known + * then @handle should be set to zero. In all cases @reg must be set. + * (x86-specific). + */ +#define XENPF_del_memtype         32 +struct xenpf_del_memtype { +	/* IN variables. */ +	uint32_t handle; +	uint32_t reg; +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_del_memtype_t); + +/* Read current type of an MTRR (x86-specific). */ +#define XENPF_read_memtype        33 +struct xenpf_read_memtype { +	/* IN variables. */ +	uint32_t reg; +	/* OUT variables. */ +	xen_pfn_t mfn; +	uint64_t nr_mfns; +	uint32_t type; +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_read_memtype_t); + +#define XENPF_microcode_update    35 +struct xenpf_microcode_update { +	/* IN variables. */ +	GUEST_HANDLE(void) data;          /* Pointer to microcode data */ +	uint32_t length;                  /* Length of microcode data. */ +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_microcode_update_t); + +#define XENPF_platform_quirk      39 +#define QUIRK_NOIRQBALANCING      1 /* Do not restrict IO-APIC RTE targets */ +#define QUIRK_IOAPIC_BAD_REGSEL   2 /* IO-APIC REGSEL forgets its value    */ +#define QUIRK_IOAPIC_GOOD_REGSEL  3 /* IO-APIC REGSEL behaves properly     */ +struct xenpf_platform_quirk { +	/* IN variables. */ +	uint32_t quirk_id; +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_platform_quirk_t); + +#define XENPF_firmware_info       50 +#define XEN_FW_DISK_INFO          1 /* from int 13 AH=08/41/48 */ +#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ +#define XEN_FW_VBEDDC_INFO        3 /* from int 10 AX=4f15 */ +#define XEN_FW_KBD_SHIFT_FLAGS    5 /* Int16, Fn02: Get keyboard shift flags. */ +struct xenpf_firmware_info { +	/* IN variables. */ +	uint32_t type; +	uint32_t index; +	/* OUT variables. */ +	union { +		struct { +			/* Int13, Fn48: Check Extensions Present. */ +			uint8_t device;                   /* %dl: bios device number */ +			uint8_t version;                  /* %ah: major version      */ +			uint16_t interface_support;       /* %cx: support bitmap     */ +			/* Int13, Fn08: Legacy Get Device Parameters. */ +			uint16_t legacy_max_cylinder;     /* %cl[7:6]:%ch: max cyl # */ +			uint8_t legacy_max_head;          /* %dh: max head #         */ +			uint8_t legacy_sectors_per_track; /* %cl[5:0]: max sector #  */ +			/* Int13, Fn41: Get Device Parameters (as filled into %ds:%esi). */ +			/* NB. First uint16_t of buffer must be set to buffer size.      */ +			GUEST_HANDLE(void) edd_params; +		} disk_info; /* XEN_FW_DISK_INFO */ +		struct { +			uint8_t device;                   /* bios device number  */ +			uint32_t mbr_signature;           /* offset 0x1b8 in mbr */ +		} disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */ +		struct { +			/* Int10, AX=4F15: Get EDID info. */ +			uint8_t capabilities; +			uint8_t edid_transfer_time; +			/* must refer to 128-byte buffer */ +			GUEST_HANDLE(uchar) edid; +		} vbeddc_info; /* XEN_FW_VBEDDC_INFO */ + +		uint8_t kbd_shift_flags; /* XEN_FW_KBD_SHIFT_FLAGS */ +	} u; +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_firmware_info_t); + +#define XENPF_enter_acpi_sleep    51 +struct xenpf_enter_acpi_sleep { +	/* IN variables */ +	uint16_t val_a;             /* PM1a control / sleep type A. */ +	uint16_t val_b;             /* PM1b control / sleep type B. */ +	uint32_t sleep_state;       /* Which state to enter (Sn). */ +#define XENPF_ACPI_SLEEP_EXTENDED 0x00000001 +	uint32_t flags;             /* XENPF_ACPI_SLEEP_*. */ +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_enter_acpi_sleep_t); + +#define XENPF_change_freq         52 +struct xenpf_change_freq { +	/* IN variables */ +	uint32_t flags; /* Must be zero. */ +	uint32_t cpu;   /* Physical cpu. */ +	uint64_t freq;  /* New frequency (Hz). */ +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_change_freq_t); + +/* + * Get idle times (nanoseconds since boot) for physical CPUs specified in the + * @cpumap_bitmap with range [0..@cpumap_nr_cpus-1]. The @idletime array is + * indexed by CPU number; only entries with the corresponding @cpumap_bitmap + * bit set are written to. On return, @cpumap_bitmap is modified so that any + * non-existent CPUs are cleared. Such CPUs have their @idletime array entry + * cleared. + */ +#define XENPF_getidletime         53 +struct xenpf_getidletime { +	/* IN/OUT variables */ +	/* IN: CPUs to interrogate; OUT: subset of IN which are present */ +	GUEST_HANDLE(uchar) cpumap_bitmap; +	/* IN variables */ +	/* Size of cpumap bitmap. */ +	uint32_t cpumap_nr_cpus; +	/* Must be indexable for every cpu in cpumap_bitmap. */ +	GUEST_HANDLE(uint64_t) idletime; +	/* OUT variables */ +	/* System time when the idletime snapshots were taken. */ +	uint64_t now; +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_getidletime_t); + +#define XENPF_set_processor_pminfo      54 + +/* ability bits */ +#define XEN_PROCESSOR_PM_CX	1 +#define XEN_PROCESSOR_PM_PX	2 +#define XEN_PROCESSOR_PM_TX	4 + +/* cmd type */ +#define XEN_PM_CX   0 +#define XEN_PM_PX   1 +#define XEN_PM_TX   2 +#define XEN_PM_PDC  3 +/* Px sub info type */ +#define XEN_PX_PCT   1 +#define XEN_PX_PSS   2 +#define XEN_PX_PPC   4 +#define XEN_PX_PSD   8 + +struct xen_power_register { +	uint32_t     space_id; +	uint32_t     bit_width; +	uint32_t     bit_offset; +	uint32_t     access_size; +	uint64_t     address; +}; + +struct xen_processor_csd { +	uint32_t    domain;      /* domain number of one dependent group */ +	uint32_t    coord_type;  /* coordination type */ +	uint32_t    num;         /* number of processors in same domain */ +}; +DEFINE_GUEST_HANDLE_STRUCT(xen_processor_csd); + +struct xen_processor_cx { +	struct xen_power_register  reg; /* GAS for Cx trigger register */ +	uint8_t     type;     /* cstate value, c0: 0, c1: 1, ... */ +	uint32_t    latency;  /* worst latency (ms) to enter/exit this cstate */ +	uint32_t    power;    /* average power consumption(mW) */ +	uint32_t    dpcnt;    /* number of dependency entries */ +	GUEST_HANDLE(xen_processor_csd) dp; /* NULL if no dependency */ +}; +DEFINE_GUEST_HANDLE_STRUCT(xen_processor_cx); + +struct xen_processor_flags { +	uint32_t bm_control:1; +	uint32_t bm_check:1; +	uint32_t has_cst:1; +	uint32_t power_setup_done:1; +	uint32_t bm_rld_set:1; +}; + +struct xen_processor_power { +	uint32_t count;  /* number of C state entries in array below */ +	struct xen_processor_flags flags;  /* global flags of this processor */ +	GUEST_HANDLE(xen_processor_cx) states; /* supported c states */ +}; + +struct xen_pct_register { +	uint8_t  descriptor; +	uint16_t length; +	uint8_t  space_id; +	uint8_t  bit_width; +	uint8_t  bit_offset; +	uint8_t  reserved; +	uint64_t address; +}; + +struct xen_processor_px { +	uint64_t core_frequency; /* megahertz */ +	uint64_t power;      /* milliWatts */ +	uint64_t transition_latency; /* microseconds */ +	uint64_t bus_master_latency; /* microseconds */ +	uint64_t control;        /* control value */ +	uint64_t status;     /* success indicator */ +}; +DEFINE_GUEST_HANDLE_STRUCT(xen_processor_px); + +struct xen_psd_package { +	uint64_t num_entries; +	uint64_t revision; +	uint64_t domain; +	uint64_t coord_type; +	uint64_t num_processors; +}; + +struct xen_processor_performance { +	uint32_t flags;     /* flag for Px sub info type */ +	uint32_t platform_limit;  /* Platform limitation on freq usage */ +	struct xen_pct_register control_register; +	struct xen_pct_register status_register; +	uint32_t state_count;     /* total available performance states */ +	GUEST_HANDLE(xen_processor_px) states; +	struct xen_psd_package domain_info; +	uint32_t shared_type;     /* coordination type of this processor */ +}; +DEFINE_GUEST_HANDLE_STRUCT(xen_processor_performance); + +struct xenpf_set_processor_pminfo { +	/* IN variables */ +	uint32_t id;    /* ACPI CPU ID */ +	uint32_t type;  /* {XEN_PM_CX, XEN_PM_PX} */ +	union { +		struct xen_processor_power          power;/* Cx: _CST/_CSD */ +		struct xen_processor_performance    perf; /* Px: _PPC/_PCT/_PSS/_PSD */ +		GUEST_HANDLE(uint32_t)              pdc; +	}; +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_set_processor_pminfo); + +#define XENPF_get_cpuinfo 55 +struct xenpf_pcpuinfo { +	/* IN */ +	uint32_t xen_cpuid; +	/* OUT */ +	/* The maxium cpu_id that is present */ +	uint32_t max_present; +#define XEN_PCPU_FLAGS_ONLINE   1 +	/* Correponding xen_cpuid is not present*/ +#define XEN_PCPU_FLAGS_INVALID  2 +	uint32_t flags; +	uint32_t apic_id; +	uint32_t acpi_id; +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_pcpuinfo); + +#define XENPF_cpu_online	56 +#define XENPF_cpu_offline	57 +struct xenpf_cpu_ol { +	uint32_t cpuid; +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_cpu_ol); + +#define XENPF_cpu_hotadd	58 +struct xenpf_cpu_hotadd { +	uint32_t apic_id; +	uint32_t acpi_id; +	uint32_t pxm; +}; + +#define XENPF_mem_hotadd	59 +struct xenpf_mem_hotadd { +	uint64_t spfn; +	uint64_t epfn; +	uint32_t pxm; +	uint32_t flags; +}; + +#define XENPF_core_parking     60 +struct xenpf_core_parking { +	/* IN variables */ +#define XEN_CORE_PARKING_SET   1 +#define XEN_CORE_PARKING_GET   2 +	uint32_t type; +	/* IN variables:  set cpu nums expected to be idled */ +	/* OUT variables: get cpu nums actually be idled */ +	uint32_t idle_nums; +}; +DEFINE_GUEST_HANDLE_STRUCT(xenpf_core_parking); + +struct xen_platform_op { +	uint32_t cmd; +	uint32_t interface_version; /* XENPF_INTERFACE_VERSION */ +	union { +		struct xenpf_settime           settime; +		struct xenpf_add_memtype       add_memtype; +		struct xenpf_del_memtype       del_memtype; +		struct xenpf_read_memtype      read_memtype; +		struct xenpf_microcode_update  microcode; +		struct xenpf_platform_quirk    platform_quirk; +		struct xenpf_firmware_info     firmware_info; +		struct xenpf_enter_acpi_sleep  enter_acpi_sleep; +		struct xenpf_change_freq       change_freq; +		struct xenpf_getidletime       getidletime; +		struct xenpf_set_processor_pminfo set_pminfo; +		struct xenpf_pcpuinfo          pcpu_info; +		struct xenpf_cpu_ol            cpu_ol; +		struct xenpf_cpu_hotadd        cpu_add; +		struct xenpf_mem_hotadd        mem_add; +		struct xenpf_core_parking      core_parking; +		uint8_t                        pad[128]; +	} u; +}; +DEFINE_GUEST_HANDLE_STRUCT(xen_platform_op_t); + +#endif /* __XEN_PUBLIC_PLATFORM_H__ */ diff --git a/include/xen/interface/sched.h b/include/xen/interface/sched.h index 5fec575a800..9ce083960a2 100644 --- a/include/xen/interface/sched.h +++ b/include/xen/interface/sched.h @@ -9,7 +9,7 @@  #ifndef __XEN_PUBLIC_SCHED_H__  #define __XEN_PUBLIC_SCHED_H__ -#include "event_channel.h" +#include <xen/interface/event_channel.h>  /*   * The prototype for this hypercall is: @@ -65,6 +65,39 @@ struct sched_poll {  DEFINE_GUEST_HANDLE_STRUCT(sched_poll);  /* + * Declare a shutdown for another domain. The main use of this function is + * in interpreting shutdown requests and reasons for fully-virtualized + * domains.  A para-virtualized domain may use SCHEDOP_shutdown directly. + * @arg == pointer to sched_remote_shutdown structure. + */ +#define SCHEDOP_remote_shutdown        4 +struct sched_remote_shutdown { +    domid_t domain_id;         /* Remote domain ID */ +    unsigned int reason;       /* SHUTDOWN_xxx reason */ +}; + +/* + * Latch a shutdown code, so that when the domain later shuts down it + * reports this code to the control tools. + * @arg == as for SCHEDOP_shutdown. + */ +#define SCHEDOP_shutdown_code 5 + +/* + * Setup, poke and destroy a domain watchdog timer. + * @arg == pointer to sched_watchdog structure. + * With id == 0, setup a domain watchdog timer to cause domain shutdown + *               after timeout, returns watchdog id. + * With id != 0 and timeout == 0, destroy domain watchdog timer. + * With id != 0 and timeout != 0, poke watchdog timer and set new timeout. + */ +#define SCHEDOP_watchdog    6 +struct sched_watchdog { +    uint32_t id;                /* watchdog ID */ +    uint32_t timeout;           /* timeout */ +}; + +/*   * Reason codes for SCHEDOP_shutdown. These may be interpreted by control   * software to determine the appropriate action. For the most part, Xen does   * not care about the shutdown code. @@ -73,5 +106,6 @@ DEFINE_GUEST_HANDLE_STRUCT(sched_poll);  #define SHUTDOWN_reboot     1  /* Clean up, kill, and then restart.          */  #define SHUTDOWN_suspend    2  /* Clean up, save suspend info, kill.         */  #define SHUTDOWN_crash      3  /* Tell controller we've crashed.             */ +#define SHUTDOWN_watchdog   4  /* Restart because watchdog time expired.     */  #endif /* __XEN_PUBLIC_SCHED_H__ */ diff --git a/include/xen/interface/vcpu.h b/include/xen/interface/vcpu.h index 87e6f8a4866..b05288ce399 100644 --- a/include/xen/interface/vcpu.h +++ b/include/xen/interface/vcpu.h @@ -170,4 +170,6 @@ struct vcpu_register_vcpu_info {  };  DEFINE_GUEST_HANDLE_STRUCT(vcpu_register_vcpu_info); +/* Send an NMI to the specified VCPU. @extra_arg == NULL. */ +#define VCPUOP_send_nmi             11  #endif /* __XEN_PUBLIC_VCPU_H__ */ diff --git a/include/xen/interface/version.h b/include/xen/interface/version.h index e8b6519d47e..7ff6498679a 100644 --- a/include/xen/interface/version.h +++ b/include/xen/interface/version.h @@ -45,7 +45,7 @@ struct xen_changeset_info {  #define XENVER_platform_parameters 5  struct xen_platform_parameters { -    unsigned long virt_start; +    xen_ulong_t virt_start;  };  #define XENVER_get_features 6 @@ -55,9 +55,12 @@ struct xen_feature_info {  };  /* Declares the features reported by XENVER_get_features. */ -#include "features.h" +#include <xen/interface/features.h>  /* arg == NULL; returns host memory page size. */  #define XENVER_pagesize 7 +/* arg == xen_domain_handle_t. */ +#define XENVER_guest_handle 8 +  #endif /* __XEN_PUBLIC_VERSION_H__ */ diff --git a/include/xen/interface/xen-mca.h b/include/xen/interface/xen-mca.h new file mode 100644 index 00000000000..73a4ea714d9 --- /dev/null +++ b/include/xen/interface/xen-mca.h @@ -0,0 +1,385 @@ +/****************************************************************************** + * arch-x86/mca.h + * Guest OS machine check interface to x86 Xen. + * + * Contributed by Advanced Micro Devices, Inc. + * Author: Christoph Egger <Christoph.Egger@amd.com> + * + * Updated by Intel Corporation + * Author: Liu, Jinsong <jinsong.liu@intel.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef __XEN_PUBLIC_ARCH_X86_MCA_H__ +#define __XEN_PUBLIC_ARCH_X86_MCA_H__ + +/* Hypercall */ +#define __HYPERVISOR_mca __HYPERVISOR_arch_0 + +#define XEN_MCA_INTERFACE_VERSION	0x01ecc003 + +/* IN: Dom0 calls hypercall to retrieve nonurgent error log entry */ +#define XEN_MC_NONURGENT	0x1 +/* IN: Dom0 calls hypercall to retrieve urgent error log entry */ +#define XEN_MC_URGENT		0x2 +/* IN: Dom0 acknowledges previosly-fetched error log entry */ +#define XEN_MC_ACK		0x4 + +/* OUT: All is ok */ +#define XEN_MC_OK		0x0 +/* OUT: Domain could not fetch data. */ +#define XEN_MC_FETCHFAILED	0x1 +/* OUT: There was no machine check data to fetch. */ +#define XEN_MC_NODATA		0x2 + +#ifndef __ASSEMBLY__ +/* vIRQ injected to Dom0 */ +#define VIRQ_MCA VIRQ_ARCH_0 + +/* + * mc_info entry types + * mca machine check info are recorded in mc_info entries. + * when fetch mca info, it can use MC_TYPE_... to distinguish + * different mca info. + */ +#define MC_TYPE_GLOBAL		0 +#define MC_TYPE_BANK		1 +#define MC_TYPE_EXTENDED	2 +#define MC_TYPE_RECOVERY	3 + +struct mcinfo_common { +	uint16_t type; /* structure type */ +	uint16_t size; /* size of this struct in bytes */ +}; + +#define MC_FLAG_CORRECTABLE	(1 << 0) +#define MC_FLAG_UNCORRECTABLE	(1 << 1) +#define MC_FLAG_RECOVERABLE	(1 << 2) +#define MC_FLAG_POLLED		(1 << 3) +#define MC_FLAG_RESET		(1 << 4) +#define MC_FLAG_CMCI		(1 << 5) +#define MC_FLAG_MCE		(1 << 6) + +/* contains x86 global mc information */ +struct mcinfo_global { +	struct mcinfo_common common; + +	uint16_t mc_domid; /* running domain at the time in error */ +	uint16_t mc_vcpuid; /* virtual cpu scheduled for mc_domid */ +	uint32_t mc_socketid; /* physical socket of the physical core */ +	uint16_t mc_coreid; /* physical impacted core */ +	uint16_t mc_core_threadid; /* core thread of physical core */ +	uint32_t mc_apicid; +	uint32_t mc_flags; +	uint64_t mc_gstatus; /* global status */ +}; + +/* contains x86 bank mc information */ +struct mcinfo_bank { +	struct mcinfo_common common; + +	uint16_t mc_bank; /* bank nr */ +	uint16_t mc_domid; /* domain referenced by mc_addr if valid */ +	uint64_t mc_status; /* bank status */ +	uint64_t mc_addr; /* bank address */ +	uint64_t mc_misc; +	uint64_t mc_ctrl2; +	uint64_t mc_tsc; +}; + +struct mcinfo_msr { +	uint64_t reg; /* MSR */ +	uint64_t value; /* MSR value */ +}; + +/* contains mc information from other or additional mc MSRs */ +struct mcinfo_extended { +	struct mcinfo_common common; +	uint32_t mc_msrs; /* Number of msr with valid values. */ +	/* +	 * Currently Intel extended MSR (32/64) include all gp registers +	 * and E(R)FLAGS, E(R)IP, E(R)MISC, up to 11/19 of them might be +	 * useful at present. So expand this array to 16/32 to leave room. +	 */ +	struct mcinfo_msr mc_msr[sizeof(void *) * 4]; +}; + +/* Recovery Action flags. Giving recovery result information to DOM0 */ + +/* Xen takes successful recovery action, the error is recovered */ +#define REC_ACTION_RECOVERED (0x1 << 0) +/* No action is performed by XEN */ +#define REC_ACTION_NONE (0x1 << 1) +/* It's possible DOM0 might take action ownership in some case */ +#define REC_ACTION_NEED_RESET (0x1 << 2) + +/* + * Different Recovery Action types, if the action is performed successfully, + * REC_ACTION_RECOVERED flag will be returned. + */ + +/* Page Offline Action */ +#define MC_ACTION_PAGE_OFFLINE (0x1 << 0) +/* CPU offline Action */ +#define MC_ACTION_CPU_OFFLINE (0x1 << 1) +/* L3 cache disable Action */ +#define MC_ACTION_CACHE_SHRINK (0x1 << 2) + +/* + * Below interface used between XEN/DOM0 for passing XEN's recovery action + * information to DOM0. + */ +struct page_offline_action { +	/* Params for passing the offlined page number to DOM0 */ +	uint64_t mfn; +	uint64_t status; +}; + +struct cpu_offline_action { +	/* Params for passing the identity of the offlined CPU to DOM0 */ +	uint32_t mc_socketid; +	uint16_t mc_coreid; +	uint16_t mc_core_threadid; +}; + +#define MAX_UNION_SIZE 16 +struct mcinfo_recovery { +	struct mcinfo_common common; +	uint16_t mc_bank; /* bank nr */ +	uint8_t action_flags; +	uint8_t action_types; +	union { +		struct page_offline_action page_retire; +		struct cpu_offline_action cpu_offline; +		uint8_t pad[MAX_UNION_SIZE]; +	} action_info; +}; + + +#define MCINFO_MAXSIZE 768 +struct mc_info { +	/* Number of mcinfo_* entries in mi_data */ +	uint32_t mi_nentries; +	uint32_t flags; +	uint64_t mi_data[(MCINFO_MAXSIZE - 1) / 8]; +}; +DEFINE_GUEST_HANDLE_STRUCT(mc_info); + +#define __MC_MSR_ARRAYSIZE 8 +#define __MC_MSR_MCGCAP 0 +#define __MC_NMSRS 1 +#define MC_NCAPS 7 +struct mcinfo_logical_cpu { +	uint32_t mc_cpunr; +	uint32_t mc_chipid; +	uint16_t mc_coreid; +	uint16_t mc_threadid; +	uint32_t mc_apicid; +	uint32_t mc_clusterid; +	uint32_t mc_ncores; +	uint32_t mc_ncores_active; +	uint32_t mc_nthreads; +	uint32_t mc_cpuid_level; +	uint32_t mc_family; +	uint32_t mc_vendor; +	uint32_t mc_model; +	uint32_t mc_step; +	char mc_vendorid[16]; +	char mc_brandid[64]; +	uint32_t mc_cpu_caps[MC_NCAPS]; +	uint32_t mc_cache_size; +	uint32_t mc_cache_alignment; +	uint32_t mc_nmsrvals; +	struct mcinfo_msr mc_msrvalues[__MC_MSR_ARRAYSIZE]; +}; +DEFINE_GUEST_HANDLE_STRUCT(mcinfo_logical_cpu); + +/* + * Prototype: + *    uint32_t x86_mcinfo_nentries(struct mc_info *mi); + */ +#define x86_mcinfo_nentries(_mi)    \ +	((_mi)->mi_nentries) +/* + * Prototype: + *    struct mcinfo_common *x86_mcinfo_first(struct mc_info *mi); + */ +#define x86_mcinfo_first(_mi)       \ +	((struct mcinfo_common *)(_mi)->mi_data) +/* + * Prototype: + *    struct mcinfo_common *x86_mcinfo_next(struct mcinfo_common *mic); + */ +#define x86_mcinfo_next(_mic)       \ +	((struct mcinfo_common *)((uint8_t *)(_mic) + (_mic)->size)) + +/* + * Prototype: + *    void x86_mcinfo_lookup(void *ret, struct mc_info *mi, uint16_t type); + */ +static inline void x86_mcinfo_lookup(struct mcinfo_common **ret, +				     struct mc_info *mi, uint16_t type) +{ +	uint32_t i; +	struct mcinfo_common *mic; +	bool found = 0; + +	if (!ret || !mi) +		return; + +	mic = x86_mcinfo_first(mi); +	for (i = 0; i < x86_mcinfo_nentries(mi); i++) { +		if (mic->type == type) { +			found = 1; +			break; +		} +		mic = x86_mcinfo_next(mic); +	} + +	*ret = found ? mic : NULL; +} + +/* + * Fetch machine check data from hypervisor. + */ +#define XEN_MC_fetch		1 +struct xen_mc_fetch { +	/* +	 * IN: XEN_MC_NONURGENT, XEN_MC_URGENT, +	 * XEN_MC_ACK if ack'king an earlier fetch +	 * OUT: XEN_MC_OK, XEN_MC_FETCHAILED, XEN_MC_NODATA +	 */ +	uint32_t flags; +	uint32_t _pad0; +	/* OUT: id for ack, IN: id we are ack'ing */ +	uint64_t fetch_id; + +	/* OUT variables. */ +	GUEST_HANDLE(mc_info) data; +}; +DEFINE_GUEST_HANDLE_STRUCT(xen_mc_fetch); + + +/* + * This tells the hypervisor to notify a DomU about the machine check error + */ +#define XEN_MC_notifydomain	2 +struct xen_mc_notifydomain { +	/* IN variables */ +	uint16_t mc_domid; /* The unprivileged domain to notify */ +	uint16_t mc_vcpuid; /* The vcpu in mc_domid to notify */ + +	/* IN/OUT variables */ +	uint32_t flags; +}; +DEFINE_GUEST_HANDLE_STRUCT(xen_mc_notifydomain); + +#define XEN_MC_physcpuinfo	3 +struct xen_mc_physcpuinfo { +	/* IN/OUT */ +	uint32_t ncpus; +	uint32_t _pad0; +	/* OUT */ +	GUEST_HANDLE(mcinfo_logical_cpu) info; +}; + +#define XEN_MC_msrinject	4 +#define MC_MSRINJ_MAXMSRS	8 +struct xen_mc_msrinject { +	/* IN */ +	uint32_t mcinj_cpunr; /* target processor id */ +	uint32_t mcinj_flags; /* see MC_MSRINJ_F_* below */ +	uint32_t mcinj_count; /* 0 .. count-1 in array are valid */ +	uint32_t _pad0; +	struct mcinfo_msr mcinj_msr[MC_MSRINJ_MAXMSRS]; +}; + +/* Flags for mcinj_flags above; bits 16-31 are reserved */ +#define MC_MSRINJ_F_INTERPOSE	0x1 + +#define XEN_MC_mceinject	5 +struct xen_mc_mceinject { +	unsigned int mceinj_cpunr; /* target processor id */ +}; + +struct xen_mc { +	uint32_t cmd; +	uint32_t interface_version; /* XEN_MCA_INTERFACE_VERSION */ +	union { +		struct xen_mc_fetch        mc_fetch; +		struct xen_mc_notifydomain mc_notifydomain; +		struct xen_mc_physcpuinfo  mc_physcpuinfo; +		struct xen_mc_msrinject    mc_msrinject; +		struct xen_mc_mceinject    mc_mceinject; +	} u; +}; +DEFINE_GUEST_HANDLE_STRUCT(xen_mc); + +/* Fields are zero when not available */ +struct xen_mce { +	__u64 status; +	__u64 misc; +	__u64 addr; +	__u64 mcgstatus; +	__u64 ip; +	__u64 tsc;	/* cpu time stamp counter */ +	__u64 time;	/* wall time_t when error was detected */ +	__u8  cpuvendor;	/* cpu vendor as encoded in system.h */ +	__u8  inject_flags;	/* software inject flags */ +	__u16  pad; +	__u32 cpuid;	/* CPUID 1 EAX */ +	__u8  cs;		/* code segment */ +	__u8  bank;	/* machine check bank */ +	__u8  cpu;	/* cpu number; obsolete; use extcpu now */ +	__u8  finished;   /* entry is valid */ +	__u32 extcpu;	/* linux cpu number that detected the error */ +	__u32 socketid;	/* CPU socket ID */ +	__u32 apicid;	/* CPU initial apic ID */ +	__u64 mcgcap;	/* MCGCAP MSR: machine check capabilities of CPU */ +}; + +/* + * This structure contains all data related to the MCE log.  Also + * carries a signature to make it easier to find from external + * debugging tools.  Each entry is only valid when its finished flag + * is set. + */ + +#define XEN_MCE_LOG_LEN 32 + +struct xen_mce_log { +	char signature[12]; /* "MACHINECHECK" */ +	unsigned len;	    /* = XEN_MCE_LOG_LEN */ +	unsigned next; +	unsigned flags; +	unsigned recordlen;	/* length of struct xen_mce */ +	struct xen_mce entry[XEN_MCE_LOG_LEN]; +}; + +#define XEN_MCE_OVERFLOW 0		/* bit 0 in flags means overflow */ + +#define XEN_MCE_LOG_SIGNATURE	"MACHINECHECK" + +#define MCE_GET_RECORD_LEN   _IOR('M', 1, int) +#define MCE_GET_LOG_LEN      _IOR('M', 2, int) +#define MCE_GETCLEAR_FLAGS   _IOR('M', 3, int) + +#endif /* __ASSEMBLY__ */ +#endif /* __XEN_PUBLIC_ARCH_X86_MCA_H__ */ diff --git a/include/xen/interface/xen.h b/include/xen/interface/xen.h index 2befa3e2f1b..de082130ba4 100644 --- a/include/xen/interface/xen.h +++ b/include/xen/interface/xen.h @@ -10,7 +10,6 @@  #define __XEN_PUBLIC_XEN_H__  #include <asm/xen/interface.h> -#include <asm/pvclock-abi.h>  /*   * XEN "SYSTEM CALLS" (a.k.a. HYPERCALLS). @@ -30,7 +29,7 @@  #define __HYPERVISOR_stack_switch          3  #define __HYPERVISOR_set_callbacks         4  #define __HYPERVISOR_fpu_taskswitch        5 -#define __HYPERVISOR_sched_op              6 +#define __HYPERVISOR_sched_op_compat       6  #define __HYPERVISOR_dom0_op               7  #define __HYPERVISOR_set_debugreg          8  #define __HYPERVISOR_get_debugreg          9 @@ -52,12 +51,13 @@  #define __HYPERVISOR_mmuext_op            26  #define __HYPERVISOR_acm_op               27  #define __HYPERVISOR_nmi_op               28 -#define __HYPERVISOR_sched_op_new         29 +#define __HYPERVISOR_sched_op             29  #define __HYPERVISOR_callback_op          30  #define __HYPERVISOR_xenoprof_op          31  #define __HYPERVISOR_event_channel_op     32  #define __HYPERVISOR_physdev_op           33  #define __HYPERVISOR_hvm_op               34 +#define __HYPERVISOR_tmem_op              38  /* Architecture-specific hypercall definitions. */  #define __HYPERVISOR_arch_0               48 @@ -79,6 +79,7 @@  #define VIRQ_CONSOLE    2  /* (DOM0) Bytes received on emergency console. */  #define VIRQ_DOM_EXC    3  /* (DOM0) Exceptional event for some domain.   */  #define VIRQ_DEBUGGER   6  /* (DOM0) A domain has paused for debugging.   */ +#define VIRQ_PCPU_STATE 9  /* (DOM0) PCPU state changed                   */  /* Architecture-specific VIRQ definitions. */  #define VIRQ_ARCH_0    16 @@ -188,7 +189,7 @@ struct mmuext_op {  	unsigned int cmd;  	union {  		/* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR */ -		unsigned long mfn; +		xen_pfn_t mfn;  		/* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */  		unsigned long linear_addr;  	} arg1; @@ -274,18 +275,12 @@ DEFINE_GUEST_HANDLE_STRUCT(mmu_update);   * NB. The fields are natural register size for this architecture.   */  struct multicall_entry { -    unsigned long op; -    long result; -    unsigned long args[6]; +    xen_ulong_t op; +    xen_long_t result; +    xen_ulong_t args[6];  };  DEFINE_GUEST_HANDLE_STRUCT(multicall_entry); -/* - * Event channel endpoints per domain: - *  1024 if a long is 32 bits; 4096 if a long is 64 bits. - */ -#define NR_EVENT_CHANNELS (sizeof(unsigned long) * sizeof(unsigned long) * 64) -  struct vcpu_time_info {  	/*  	 * Updates to the following values are preceded and followed @@ -340,7 +335,7 @@ struct vcpu_info {  	 */  	uint8_t evtchn_upcall_pending;  	uint8_t evtchn_upcall_mask; -	unsigned long evtchn_pending_sel; +	xen_ulong_t evtchn_pending_sel;  	struct arch_vcpu_info arch;  	struct pvclock_vcpu_time_info time;  }; /* 64 bytes (x86) */ @@ -383,8 +378,8 @@ struct shared_info {  	 * per-vcpu selector word to be set. Each bit in the selector covers a  	 * 'C long' in the PENDING bitfield array.  	 */ -	unsigned long evtchn_pending[sizeof(unsigned long) * 8]; -	unsigned long evtchn_mask[sizeof(unsigned long) * 8]; +	xen_ulong_t evtchn_pending[sizeof(xen_ulong_t) * 8]; +	xen_ulong_t evtchn_mask[sizeof(xen_ulong_t) * 8];  	/*  	 * Wallclock time: updated only by control software. Guests should base @@ -428,11 +423,11 @@ struct start_info {  	unsigned long nr_pages;     /* Total pages allocated to this domain.  */  	unsigned long shared_info;  /* MACHINE address of shared info struct. */  	uint32_t flags;             /* SIF_xxx flags.                         */ -	unsigned long store_mfn;    /* MACHINE page number of shared page.    */ +	xen_pfn_t store_mfn;        /* MACHINE page number of shared page.    */  	uint32_t store_evtchn;      /* Event channel for store communication. */  	union {  		struct { -			unsigned long mfn;  /* MACHINE page number of console page.   */ +			xen_pfn_t mfn;      /* MACHINE page number of console page.   */  			uint32_t  evtchn;   /* Event channel for console page.        */  		} domU;  		struct { @@ -449,9 +444,50 @@ struct start_info {  	int8_t cmd_line[MAX_GUEST_CMDLINE];  }; +struct dom0_vga_console_info { +	uint8_t video_type; +#define XEN_VGATYPE_TEXT_MODE_3 0x03 +#define XEN_VGATYPE_VESA_LFB    0x23 +#define XEN_VGATYPE_EFI_LFB     0x70 + +	union { +		struct { +			/* Font height, in pixels. */ +			uint16_t font_height; +			/* Cursor location (column, row). */ +			uint16_t cursor_x, cursor_y; +			/* Number of rows and columns (dimensions in characters). */ +			uint16_t rows, columns; +		} text_mode_3; + +		struct { +			/* Width and height, in pixels. */ +			uint16_t width, height; +			/* Bytes per scan line. */ +			uint16_t bytes_per_line; +			/* Bits per pixel. */ +			uint16_t bits_per_pixel; +			/* LFB physical address, and size (in units of 64kB). */ +			uint32_t lfb_base; +			uint32_t lfb_size; +			/* RGB mask offsets and sizes, as defined by VBE 1.2+ */ +			uint8_t  red_pos, red_size; +			uint8_t  green_pos, green_size; +			uint8_t  blue_pos, blue_size; +			uint8_t  rsvd_pos, rsvd_size; + +			/* VESA capabilities (offset 0xa, VESA command 0x4f00). */ +			uint32_t gbl_caps; +			/* Mode attributes (offset 0x0, VESA command 0x4f01). */ +			uint16_t mode_attrs; +		} vesa_lfb; +	} u; +}; +  /* These flags are passed in the 'flags' field of start_info_t. */  #define SIF_PRIVILEGED    (1<<0)  /* Is the domain privileged? */  #define SIF_INITDOMAIN    (1<<1)  /* Is this the initial control domain? */ +#define SIF_PM_MASK       (0xFF<<8) /* reserve 1 byte for xen-pm options */  typedef uint64_t cpumap_t; @@ -461,6 +497,29 @@ typedef uint8_t xen_domain_handle_t[16];  #define __mk_unsigned_long(x) x ## UL  #define mk_unsigned_long(x) __mk_unsigned_long(x) +#define TMEM_SPEC_VERSION 1 + +struct tmem_op { +	uint32_t cmd; +	int32_t pool_id; +	union { +		struct {  /* for cmd == TMEM_NEW_POOL */ +			uint64_t uuid[2]; +			uint32_t flags; +		} new; +		struct { +			uint64_t oid[3]; +			uint32_t index; +			uint32_t tmem_offset; +			uint32_t pfn_offset; +			uint32_t len; +			GUEST_HANDLE(void) gmfn; /* guest machine page frame */ +		} gen; +	} u; +}; + +DEFINE_GUEST_HANDLE(u64); +  #else /* __ASSEMBLY__ */  /* In assembly code we cannot use C numeric constant suffixes. */ diff --git a/include/xen/interface/xencomm.h b/include/xen/interface/xencomm.h deleted file mode 100644 index ac45e0712af..00000000000 --- a/include/xen/interface/xencomm.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Copyright (C) IBM Corp. 2006 - */ - -#ifndef _XEN_XENCOMM_H_ -#define _XEN_XENCOMM_H_ - -/* A xencomm descriptor is a scatter/gather list containing physical - * addresses corresponding to a virtually contiguous memory area. The - * hypervisor translates these physical addresses to machine addresses to copy - * to and from the virtually contiguous area. - */ - -#define XENCOMM_MAGIC 0x58434F4D /* 'XCOM' */ -#define XENCOMM_INVALID (~0UL) - -struct xencomm_desc { -    uint32_t magic; -    uint32_t nr_addrs; /* the number of entries in address[] */ -    uint64_t address[0]; -}; - -#endif /* _XEN_XENCOMM_H_ */  | 
