1a42089ddSJeremy Fitzhardinge /****************************************************************************** 2a42089ddSJeremy Fitzhardinge * grant_table.h 3a42089ddSJeremy Fitzhardinge * 4a42089ddSJeremy Fitzhardinge * Interface for granting foreign access to page frames, and receiving 5a42089ddSJeremy Fitzhardinge * page-ownership transfers. 6a42089ddSJeremy Fitzhardinge * 7ad9a8612SJeremy Fitzhardinge * Permission is hereby granted, free of charge, to any person obtaining a copy 8ad9a8612SJeremy Fitzhardinge * of this software and associated documentation files (the "Software"), to 9ad9a8612SJeremy Fitzhardinge * deal in the Software without restriction, including without limitation the 10ad9a8612SJeremy Fitzhardinge * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 11ad9a8612SJeremy Fitzhardinge * sell copies of the Software, and to permit persons to whom the Software is 12ad9a8612SJeremy Fitzhardinge * furnished to do so, subject to the following conditions: 13ad9a8612SJeremy Fitzhardinge * 14ad9a8612SJeremy Fitzhardinge * The above copyright notice and this permission notice shall be included in 15ad9a8612SJeremy Fitzhardinge * all copies or substantial portions of the Software. 16ad9a8612SJeremy Fitzhardinge * 17ad9a8612SJeremy Fitzhardinge * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18ad9a8612SJeremy Fitzhardinge * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19ad9a8612SJeremy Fitzhardinge * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20ad9a8612SJeremy Fitzhardinge * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21ad9a8612SJeremy Fitzhardinge * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22ad9a8612SJeremy Fitzhardinge * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23ad9a8612SJeremy Fitzhardinge * DEALINGS IN THE SOFTWARE. 24ad9a8612SJeremy Fitzhardinge * 25a42089ddSJeremy Fitzhardinge * Copyright (c) 2004, K A Fraser 26a42089ddSJeremy Fitzhardinge */ 27a42089ddSJeremy Fitzhardinge 28a42089ddSJeremy Fitzhardinge #ifndef __XEN_PUBLIC_GRANT_TABLE_H__ 29a42089ddSJeremy Fitzhardinge #define __XEN_PUBLIC_GRANT_TABLE_H__ 30a42089ddSJeremy Fitzhardinge 31*183d03ccSStefano Stabellini #include <xen/interface/xen.h> 32a42089ddSJeremy Fitzhardinge 33a42089ddSJeremy Fitzhardinge /*********************************** 34a42089ddSJeremy Fitzhardinge * GRANT TABLE REPRESENTATION 35a42089ddSJeremy Fitzhardinge */ 36a42089ddSJeremy Fitzhardinge 37a42089ddSJeremy Fitzhardinge /* Some rough guidelines on accessing and updating grant-table entries 38a42089ddSJeremy Fitzhardinge * in a concurrency-safe manner. For more information, Linux contains a 39ad9a8612SJeremy Fitzhardinge * reference implementation for guest OSes (arch/xen/kernel/grant_table.c). 40a42089ddSJeremy Fitzhardinge * 41a42089ddSJeremy Fitzhardinge * NB. WMB is a no-op on current-generation x86 processors. However, a 42a42089ddSJeremy Fitzhardinge * compiler barrier will still be required. 43a42089ddSJeremy Fitzhardinge * 44a42089ddSJeremy Fitzhardinge * Introducing a valid entry into the grant table: 45a42089ddSJeremy Fitzhardinge * 1. Write ent->domid. 46a42089ddSJeremy Fitzhardinge * 2. Write ent->frame: 47a42089ddSJeremy Fitzhardinge * GTF_permit_access: Frame to which access is permitted. 48a42089ddSJeremy Fitzhardinge * GTF_accept_transfer: Pseudo-phys frame slot being filled by new 49a42089ddSJeremy Fitzhardinge * frame, or zero if none. 50a42089ddSJeremy Fitzhardinge * 3. Write memory barrier (WMB). 51a42089ddSJeremy Fitzhardinge * 4. Write ent->flags, inc. valid type. 52a42089ddSJeremy Fitzhardinge * 53a42089ddSJeremy Fitzhardinge * Invalidating an unused GTF_permit_access entry: 54a42089ddSJeremy Fitzhardinge * 1. flags = ent->flags. 55a42089ddSJeremy Fitzhardinge * 2. Observe that !(flags & (GTF_reading|GTF_writing)). 56a42089ddSJeremy Fitzhardinge * 3. Check result of SMP-safe CMPXCHG(&ent->flags, flags, 0). 57a42089ddSJeremy Fitzhardinge * NB. No need for WMB as reuse of entry is control-dependent on success of 58a42089ddSJeremy Fitzhardinge * step 3, and all architectures guarantee ordering of ctrl-dep writes. 59a42089ddSJeremy Fitzhardinge * 60a42089ddSJeremy Fitzhardinge * Invalidating an in-use GTF_permit_access entry: 61a42089ddSJeremy Fitzhardinge * This cannot be done directly. Request assistance from the domain controller 62a42089ddSJeremy Fitzhardinge * which can set a timeout on the use of a grant entry and take necessary 63a42089ddSJeremy Fitzhardinge * action. (NB. This is not yet implemented!). 64a42089ddSJeremy Fitzhardinge * 65a42089ddSJeremy Fitzhardinge * Invalidating an unused GTF_accept_transfer entry: 66a42089ddSJeremy Fitzhardinge * 1. flags = ent->flags. 67a42089ddSJeremy Fitzhardinge * 2. Observe that !(flags & GTF_transfer_committed). [*] 68a42089ddSJeremy Fitzhardinge * 3. Check result of SMP-safe CMPXCHG(&ent->flags, flags, 0). 69a42089ddSJeremy Fitzhardinge * NB. No need for WMB as reuse of entry is control-dependent on success of 70a42089ddSJeremy Fitzhardinge * step 3, and all architectures guarantee ordering of ctrl-dep writes. 71a42089ddSJeremy Fitzhardinge * [*] If GTF_transfer_committed is set then the grant entry is 'committed'. 72a42089ddSJeremy Fitzhardinge * The guest must /not/ modify the grant entry until the address of the 73a42089ddSJeremy Fitzhardinge * transferred frame is written. It is safe for the guest to spin waiting 74a42089ddSJeremy Fitzhardinge * for this to occur (detect by observing GTF_transfer_completed in 75a42089ddSJeremy Fitzhardinge * ent->flags). 76a42089ddSJeremy Fitzhardinge * 77a42089ddSJeremy Fitzhardinge * Invalidating a committed GTF_accept_transfer entry: 78a42089ddSJeremy Fitzhardinge * 1. Wait for (ent->flags & GTF_transfer_completed). 79a42089ddSJeremy Fitzhardinge * 80a42089ddSJeremy Fitzhardinge * Changing a GTF_permit_access from writable to read-only: 81a42089ddSJeremy Fitzhardinge * Use SMP-safe CMPXCHG to set GTF_readonly, while checking !GTF_writing. 82a42089ddSJeremy Fitzhardinge * 83a42089ddSJeremy Fitzhardinge * Changing a GTF_permit_access from read-only to writable: 84a42089ddSJeremy Fitzhardinge * Use SMP-safe bit-setting instruction. 85a42089ddSJeremy Fitzhardinge */ 86a42089ddSJeremy Fitzhardinge 87a42089ddSJeremy Fitzhardinge /* 88a42089ddSJeremy Fitzhardinge * A grant table comprises a packed array of grant entries in one or more 89a42089ddSJeremy Fitzhardinge * page frames shared between Xen and a guest. 90a42089ddSJeremy Fitzhardinge * [XEN]: This field is written by Xen and read by the sharing guest. 91a42089ddSJeremy Fitzhardinge * [GST]: This field is written by the guest and read by Xen. 92a42089ddSJeremy Fitzhardinge */ 93a42089ddSJeremy Fitzhardinge struct grant_entry { 94a42089ddSJeremy Fitzhardinge /* GTF_xxx: various type and flag information. [XEN,GST] */ 95a42089ddSJeremy Fitzhardinge uint16_t flags; 96a42089ddSJeremy Fitzhardinge /* The domain being granted foreign privileges. [GST] */ 97a42089ddSJeremy Fitzhardinge domid_t domid; 98a42089ddSJeremy Fitzhardinge /* 99a42089ddSJeremy Fitzhardinge * GTF_permit_access: Frame that @domid is allowed to map and access. [GST] 100a42089ddSJeremy Fitzhardinge * GTF_accept_transfer: Frame whose ownership transferred by @domid. [XEN] 101a42089ddSJeremy Fitzhardinge */ 102a42089ddSJeremy Fitzhardinge uint32_t frame; 103a42089ddSJeremy Fitzhardinge }; 104a42089ddSJeremy Fitzhardinge 105a42089ddSJeremy Fitzhardinge /* 106a42089ddSJeremy Fitzhardinge * Type of grant entry. 107a42089ddSJeremy Fitzhardinge * GTF_invalid: This grant entry grants no privileges. 108a42089ddSJeremy Fitzhardinge * GTF_permit_access: Allow @domid to map/access @frame. 109a42089ddSJeremy Fitzhardinge * GTF_accept_transfer: Allow @domid to transfer ownership of one page frame 110a42089ddSJeremy Fitzhardinge * to this guest. Xen writes the page number to @frame. 111a42089ddSJeremy Fitzhardinge */ 112a42089ddSJeremy Fitzhardinge #define GTF_invalid (0U<<0) 113a42089ddSJeremy Fitzhardinge #define GTF_permit_access (1U<<0) 114a42089ddSJeremy Fitzhardinge #define GTF_accept_transfer (2U<<0) 115a42089ddSJeremy Fitzhardinge #define GTF_type_mask (3U<<0) 116a42089ddSJeremy Fitzhardinge 117a42089ddSJeremy Fitzhardinge /* 118a42089ddSJeremy Fitzhardinge * Subflags for GTF_permit_access. 119a42089ddSJeremy Fitzhardinge * GTF_readonly: Restrict @domid to read-only mappings and accesses. [GST] 120a42089ddSJeremy Fitzhardinge * GTF_reading: Grant entry is currently mapped for reading by @domid. [XEN] 121a42089ddSJeremy Fitzhardinge * GTF_writing: Grant entry is currently mapped for writing by @domid. [XEN] 122a42089ddSJeremy Fitzhardinge */ 123a42089ddSJeremy Fitzhardinge #define _GTF_readonly (2) 124a42089ddSJeremy Fitzhardinge #define GTF_readonly (1U<<_GTF_readonly) 125a42089ddSJeremy Fitzhardinge #define _GTF_reading (3) 126a42089ddSJeremy Fitzhardinge #define GTF_reading (1U<<_GTF_reading) 127a42089ddSJeremy Fitzhardinge #define _GTF_writing (4) 128a42089ddSJeremy Fitzhardinge #define GTF_writing (1U<<_GTF_writing) 129a42089ddSJeremy Fitzhardinge 130a42089ddSJeremy Fitzhardinge /* 131a42089ddSJeremy Fitzhardinge * Subflags for GTF_accept_transfer: 132a42089ddSJeremy Fitzhardinge * GTF_transfer_committed: Xen sets this flag to indicate that it is committed 133a42089ddSJeremy Fitzhardinge * to transferring ownership of a page frame. When a guest sees this flag 134a42089ddSJeremy Fitzhardinge * it must /not/ modify the grant entry until GTF_transfer_completed is 135a42089ddSJeremy Fitzhardinge * set by Xen. 136a42089ddSJeremy Fitzhardinge * GTF_transfer_completed: It is safe for the guest to spin-wait on this flag 137a42089ddSJeremy Fitzhardinge * after reading GTF_transfer_committed. Xen will always write the frame 138a42089ddSJeremy Fitzhardinge * address, followed by ORing this flag, in a timely manner. 139a42089ddSJeremy Fitzhardinge */ 140a42089ddSJeremy Fitzhardinge #define _GTF_transfer_committed (2) 141a42089ddSJeremy Fitzhardinge #define GTF_transfer_committed (1U<<_GTF_transfer_committed) 142a42089ddSJeremy Fitzhardinge #define _GTF_transfer_completed (3) 143a42089ddSJeremy Fitzhardinge #define GTF_transfer_completed (1U<<_GTF_transfer_completed) 144a42089ddSJeremy Fitzhardinge 145a42089ddSJeremy Fitzhardinge 146a42089ddSJeremy Fitzhardinge /*********************************** 147a42089ddSJeremy Fitzhardinge * GRANT TABLE QUERIES AND USES 148a42089ddSJeremy Fitzhardinge */ 149a42089ddSJeremy Fitzhardinge 150a42089ddSJeremy Fitzhardinge /* 151a42089ddSJeremy Fitzhardinge * Reference to a grant entry in a specified domain's grant table. 152a42089ddSJeremy Fitzhardinge */ 153a42089ddSJeremy Fitzhardinge typedef uint32_t grant_ref_t; 154a42089ddSJeremy Fitzhardinge 155a42089ddSJeremy Fitzhardinge /* 156a42089ddSJeremy Fitzhardinge * Handle to track a mapping created via a grant reference. 157a42089ddSJeremy Fitzhardinge */ 158a42089ddSJeremy Fitzhardinge typedef uint32_t grant_handle_t; 159a42089ddSJeremy Fitzhardinge 160a42089ddSJeremy Fitzhardinge /* 161a42089ddSJeremy Fitzhardinge * GNTTABOP_map_grant_ref: Map the grant entry (<dom>,<ref>) for access 162a42089ddSJeremy Fitzhardinge * by devices and/or host CPUs. If successful, <handle> is a tracking number 163a42089ddSJeremy Fitzhardinge * that must be presented later to destroy the mapping(s). On error, <handle> 164a42089ddSJeremy Fitzhardinge * is a negative status code. 165a42089ddSJeremy Fitzhardinge * NOTES: 166ad9a8612SJeremy Fitzhardinge * 1. If GNTMAP_device_map is specified then <dev_bus_addr> is the address 167a42089ddSJeremy Fitzhardinge * via which I/O devices may access the granted frame. 168ad9a8612SJeremy Fitzhardinge * 2. If GNTMAP_host_map is specified then a mapping will be added at 169a42089ddSJeremy Fitzhardinge * either a host virtual address in the current address space, or at 170a42089ddSJeremy Fitzhardinge * a PTE at the specified machine address. The type of mapping to 171a42089ddSJeremy Fitzhardinge * perform is selected through the GNTMAP_contains_pte flag, and the 172a42089ddSJeremy Fitzhardinge * address is specified in <host_addr>. 173a42089ddSJeremy Fitzhardinge * 3. Mappings should only be destroyed via GNTTABOP_unmap_grant_ref. If a 174a42089ddSJeremy Fitzhardinge * host mapping is destroyed by other means then it is *NOT* guaranteed 175a42089ddSJeremy Fitzhardinge * to be accounted to the correct grant reference! 176a42089ddSJeremy Fitzhardinge */ 177a42089ddSJeremy Fitzhardinge #define GNTTABOP_map_grant_ref 0 178a42089ddSJeremy Fitzhardinge struct gnttab_map_grant_ref { 179a42089ddSJeremy Fitzhardinge /* IN parameters. */ 180a42089ddSJeremy Fitzhardinge uint64_t host_addr; 181a42089ddSJeremy Fitzhardinge uint32_t flags; /* GNTMAP_* */ 182a42089ddSJeremy Fitzhardinge grant_ref_t ref; 183a42089ddSJeremy Fitzhardinge domid_t dom; 184a42089ddSJeremy Fitzhardinge /* OUT parameters. */ 185a42089ddSJeremy Fitzhardinge int16_t status; /* GNTST_* */ 186a42089ddSJeremy Fitzhardinge grant_handle_t handle; 187a42089ddSJeremy Fitzhardinge uint64_t dev_bus_addr; 188a42089ddSJeremy Fitzhardinge }; 18987e27cf6SIsaku Yamahata DEFINE_GUEST_HANDLE_STRUCT(gnttab_map_grant_ref); 190a42089ddSJeremy Fitzhardinge 191a42089ddSJeremy Fitzhardinge /* 192a42089ddSJeremy Fitzhardinge * GNTTABOP_unmap_grant_ref: Destroy one or more grant-reference mappings 193a42089ddSJeremy Fitzhardinge * tracked by <handle>. If <host_addr> or <dev_bus_addr> is zero, that 194a42089ddSJeremy Fitzhardinge * field is ignored. If non-zero, they must refer to a device/host mapping 195a42089ddSJeremy Fitzhardinge * that is tracked by <handle> 196a42089ddSJeremy Fitzhardinge * NOTES: 197a42089ddSJeremy Fitzhardinge * 1. The call may fail in an undefined manner if either mapping is not 198a42089ddSJeremy Fitzhardinge * tracked by <handle>. 199a42089ddSJeremy Fitzhardinge * 3. After executing a batch of unmaps, it is guaranteed that no stale 200a42089ddSJeremy Fitzhardinge * mappings will remain in the device or host TLBs. 201a42089ddSJeremy Fitzhardinge */ 202a42089ddSJeremy Fitzhardinge #define GNTTABOP_unmap_grant_ref 1 203a42089ddSJeremy Fitzhardinge struct gnttab_unmap_grant_ref { 204a42089ddSJeremy Fitzhardinge /* IN parameters. */ 205a42089ddSJeremy Fitzhardinge uint64_t host_addr; 206a42089ddSJeremy Fitzhardinge uint64_t dev_bus_addr; 207a42089ddSJeremy Fitzhardinge grant_handle_t handle; 208a42089ddSJeremy Fitzhardinge /* OUT parameters. */ 209a42089ddSJeremy Fitzhardinge int16_t status; /* GNTST_* */ 210a42089ddSJeremy Fitzhardinge }; 21187e27cf6SIsaku Yamahata DEFINE_GUEST_HANDLE_STRUCT(gnttab_unmap_grant_ref); 212a42089ddSJeremy Fitzhardinge 213a42089ddSJeremy Fitzhardinge /* 214a42089ddSJeremy Fitzhardinge * GNTTABOP_setup_table: Set up a grant table for <dom> comprising at least 215a42089ddSJeremy Fitzhardinge * <nr_frames> pages. The frame addresses are written to the <frame_list>. 216a42089ddSJeremy Fitzhardinge * Only <nr_frames> addresses are written, even if the table is larger. 217a42089ddSJeremy Fitzhardinge * NOTES: 218a42089ddSJeremy Fitzhardinge * 1. <dom> may be specified as DOMID_SELF. 219a42089ddSJeremy Fitzhardinge * 2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF. 220a42089ddSJeremy Fitzhardinge * 3. Xen may not support more than a single grant-table page per domain. 221a42089ddSJeremy Fitzhardinge */ 222a42089ddSJeremy Fitzhardinge #define GNTTABOP_setup_table 2 223a42089ddSJeremy Fitzhardinge struct gnttab_setup_table { 224a42089ddSJeremy Fitzhardinge /* IN parameters. */ 225a42089ddSJeremy Fitzhardinge domid_t dom; 226a42089ddSJeremy Fitzhardinge uint32_t nr_frames; 227a42089ddSJeremy Fitzhardinge /* OUT parameters. */ 228a42089ddSJeremy Fitzhardinge int16_t status; /* GNTST_* */ 22987e27cf6SIsaku Yamahata GUEST_HANDLE(ulong) frame_list; 230a42089ddSJeremy Fitzhardinge }; 23187e27cf6SIsaku Yamahata DEFINE_GUEST_HANDLE_STRUCT(gnttab_setup_table); 232a42089ddSJeremy Fitzhardinge 233a42089ddSJeremy Fitzhardinge /* 234a42089ddSJeremy Fitzhardinge * GNTTABOP_dump_table: Dump the contents of the grant table to the 235a42089ddSJeremy Fitzhardinge * xen console. Debugging use only. 236a42089ddSJeremy Fitzhardinge */ 237a42089ddSJeremy Fitzhardinge #define GNTTABOP_dump_table 3 238a42089ddSJeremy Fitzhardinge struct gnttab_dump_table { 239a42089ddSJeremy Fitzhardinge /* IN parameters. */ 240a42089ddSJeremy Fitzhardinge domid_t dom; 241a42089ddSJeremy Fitzhardinge /* OUT parameters. */ 242a42089ddSJeremy Fitzhardinge int16_t status; /* GNTST_* */ 243a42089ddSJeremy Fitzhardinge }; 24487e27cf6SIsaku Yamahata DEFINE_GUEST_HANDLE_STRUCT(gnttab_dump_table); 245a42089ddSJeremy Fitzhardinge 246a42089ddSJeremy Fitzhardinge /* 247a42089ddSJeremy Fitzhardinge * GNTTABOP_transfer_grant_ref: Transfer <frame> to a foreign domain. The 248a42089ddSJeremy Fitzhardinge * foreign domain has previously registered its interest in the transfer via 249a42089ddSJeremy Fitzhardinge * <domid, ref>. 250a42089ddSJeremy Fitzhardinge * 251a42089ddSJeremy Fitzhardinge * Note that, even if the transfer fails, the specified page no longer belongs 252a42089ddSJeremy Fitzhardinge * to the calling domain *unless* the error is GNTST_bad_page. 253a42089ddSJeremy Fitzhardinge */ 254a42089ddSJeremy Fitzhardinge #define GNTTABOP_transfer 4 255a42089ddSJeremy Fitzhardinge struct gnttab_transfer { 256a42089ddSJeremy Fitzhardinge /* IN parameters. */ 257a42089ddSJeremy Fitzhardinge unsigned long mfn; 258a42089ddSJeremy Fitzhardinge domid_t domid; 259a42089ddSJeremy Fitzhardinge grant_ref_t ref; 260a42089ddSJeremy Fitzhardinge /* OUT parameters. */ 261a42089ddSJeremy Fitzhardinge int16_t status; 262a42089ddSJeremy Fitzhardinge }; 26387e27cf6SIsaku Yamahata DEFINE_GUEST_HANDLE_STRUCT(gnttab_transfer); 264ad9a8612SJeremy Fitzhardinge 265ad9a8612SJeremy Fitzhardinge /* 266ad9a8612SJeremy Fitzhardinge * GNTTABOP_copy: Hypervisor based copy 267ad9a8612SJeremy Fitzhardinge * source and destinations can be eithers MFNs or, for foreign domains, 268ad9a8612SJeremy Fitzhardinge * grant references. the foreign domain has to grant read/write access 269ad9a8612SJeremy Fitzhardinge * in its grant table. 270ad9a8612SJeremy Fitzhardinge * 271ad9a8612SJeremy Fitzhardinge * The flags specify what type source and destinations are (either MFN 272ad9a8612SJeremy Fitzhardinge * or grant reference). 273ad9a8612SJeremy Fitzhardinge * 274ad9a8612SJeremy Fitzhardinge * Note that this can also be used to copy data between two domains 275ad9a8612SJeremy Fitzhardinge * via a third party if the source and destination domains had previously 276ad9a8612SJeremy Fitzhardinge * grant appropriate access to their pages to the third party. 277ad9a8612SJeremy Fitzhardinge * 278ad9a8612SJeremy Fitzhardinge * source_offset specifies an offset in the source frame, dest_offset 279ad9a8612SJeremy Fitzhardinge * the offset in the target frame and len specifies the number of 280ad9a8612SJeremy Fitzhardinge * bytes to be copied. 281ad9a8612SJeremy Fitzhardinge */ 282ad9a8612SJeremy Fitzhardinge 283ad9a8612SJeremy Fitzhardinge #define _GNTCOPY_source_gref (0) 284ad9a8612SJeremy Fitzhardinge #define GNTCOPY_source_gref (1<<_GNTCOPY_source_gref) 285ad9a8612SJeremy Fitzhardinge #define _GNTCOPY_dest_gref (1) 286ad9a8612SJeremy Fitzhardinge #define GNTCOPY_dest_gref (1<<_GNTCOPY_dest_gref) 287ad9a8612SJeremy Fitzhardinge 288ad9a8612SJeremy Fitzhardinge #define GNTTABOP_copy 5 289ad9a8612SJeremy Fitzhardinge struct gnttab_copy { 290ad9a8612SJeremy Fitzhardinge /* IN parameters. */ 291ad9a8612SJeremy Fitzhardinge struct { 292ad9a8612SJeremy Fitzhardinge union { 293ad9a8612SJeremy Fitzhardinge grant_ref_t ref; 294ad9a8612SJeremy Fitzhardinge unsigned long gmfn; 295ad9a8612SJeremy Fitzhardinge } u; 296ad9a8612SJeremy Fitzhardinge domid_t domid; 297ad9a8612SJeremy Fitzhardinge uint16_t offset; 298ad9a8612SJeremy Fitzhardinge } source, dest; 299ad9a8612SJeremy Fitzhardinge uint16_t len; 300ad9a8612SJeremy Fitzhardinge uint16_t flags; /* GNTCOPY_* */ 301ad9a8612SJeremy Fitzhardinge /* OUT parameters. */ 302ad9a8612SJeremy Fitzhardinge int16_t status; 303ad9a8612SJeremy Fitzhardinge }; 30487e27cf6SIsaku Yamahata DEFINE_GUEST_HANDLE_STRUCT(gnttab_copy); 305ad9a8612SJeremy Fitzhardinge 306ad9a8612SJeremy Fitzhardinge /* 307ad9a8612SJeremy Fitzhardinge * GNTTABOP_query_size: Query the current and maximum sizes of the shared 308ad9a8612SJeremy Fitzhardinge * grant table. 309ad9a8612SJeremy Fitzhardinge * NOTES: 310ad9a8612SJeremy Fitzhardinge * 1. <dom> may be specified as DOMID_SELF. 311ad9a8612SJeremy Fitzhardinge * 2. Only a sufficiently-privileged domain may specify <dom> != DOMID_SELF. 312ad9a8612SJeremy Fitzhardinge */ 313ad9a8612SJeremy Fitzhardinge #define GNTTABOP_query_size 6 314ad9a8612SJeremy Fitzhardinge struct gnttab_query_size { 315ad9a8612SJeremy Fitzhardinge /* IN parameters. */ 316ad9a8612SJeremy Fitzhardinge domid_t dom; 317ad9a8612SJeremy Fitzhardinge /* OUT parameters. */ 318ad9a8612SJeremy Fitzhardinge uint32_t nr_frames; 319ad9a8612SJeremy Fitzhardinge uint32_t max_nr_frames; 320ad9a8612SJeremy Fitzhardinge int16_t status; /* GNTST_* */ 321ad9a8612SJeremy Fitzhardinge }; 32287e27cf6SIsaku Yamahata DEFINE_GUEST_HANDLE_STRUCT(gnttab_query_size); 323a42089ddSJeremy Fitzhardinge 324a42089ddSJeremy Fitzhardinge /* 325a42089ddSJeremy Fitzhardinge * Bitfield values for update_pin_status.flags. 326a42089ddSJeremy Fitzhardinge */ 327a42089ddSJeremy Fitzhardinge /* Map the grant entry for access by I/O devices. */ 328a42089ddSJeremy Fitzhardinge #define _GNTMAP_device_map (0) 329a42089ddSJeremy Fitzhardinge #define GNTMAP_device_map (1<<_GNTMAP_device_map) 330a42089ddSJeremy Fitzhardinge /* Map the grant entry for access by host CPUs. */ 331a42089ddSJeremy Fitzhardinge #define _GNTMAP_host_map (1) 332a42089ddSJeremy Fitzhardinge #define GNTMAP_host_map (1<<_GNTMAP_host_map) 333a42089ddSJeremy Fitzhardinge /* Accesses to the granted frame will be restricted to read-only access. */ 334a42089ddSJeremy Fitzhardinge #define _GNTMAP_readonly (2) 335a42089ddSJeremy Fitzhardinge #define GNTMAP_readonly (1<<_GNTMAP_readonly) 336a42089ddSJeremy Fitzhardinge /* 337a42089ddSJeremy Fitzhardinge * GNTMAP_host_map subflag: 338a42089ddSJeremy Fitzhardinge * 0 => The host mapping is usable only by the guest OS. 339a42089ddSJeremy Fitzhardinge * 1 => The host mapping is usable by guest OS + current application. 340a42089ddSJeremy Fitzhardinge */ 341a42089ddSJeremy Fitzhardinge #define _GNTMAP_application_map (3) 342a42089ddSJeremy Fitzhardinge #define GNTMAP_application_map (1<<_GNTMAP_application_map) 343a42089ddSJeremy Fitzhardinge 344a42089ddSJeremy Fitzhardinge /* 345a42089ddSJeremy Fitzhardinge * GNTMAP_contains_pte subflag: 346a42089ddSJeremy Fitzhardinge * 0 => This map request contains a host virtual address. 347a42089ddSJeremy Fitzhardinge * 1 => This map request contains the machine addess of the PTE to update. 348a42089ddSJeremy Fitzhardinge */ 349a42089ddSJeremy Fitzhardinge #define _GNTMAP_contains_pte (4) 350a42089ddSJeremy Fitzhardinge #define GNTMAP_contains_pte (1<<_GNTMAP_contains_pte) 351a42089ddSJeremy Fitzhardinge 352a42089ddSJeremy Fitzhardinge /* 353a42089ddSJeremy Fitzhardinge * Values for error status returns. All errors are -ve. 354a42089ddSJeremy Fitzhardinge */ 355a42089ddSJeremy Fitzhardinge #define GNTST_okay (0) /* Normal return. */ 356a42089ddSJeremy Fitzhardinge #define GNTST_general_error (-1) /* General undefined error. */ 357a42089ddSJeremy Fitzhardinge #define GNTST_bad_domain (-2) /* Unrecognsed domain id. */ 358a42089ddSJeremy Fitzhardinge #define GNTST_bad_gntref (-3) /* Unrecognised or inappropriate gntref. */ 359a42089ddSJeremy Fitzhardinge #define GNTST_bad_handle (-4) /* Unrecognised or inappropriate handle. */ 360a42089ddSJeremy Fitzhardinge #define GNTST_bad_virt_addr (-5) /* Inappropriate virtual address to map. */ 361a42089ddSJeremy Fitzhardinge #define GNTST_bad_dev_addr (-6) /* Inappropriate device address to unmap.*/ 362a42089ddSJeremy Fitzhardinge #define GNTST_no_device_space (-7) /* Out of space in I/O MMU. */ 363a42089ddSJeremy Fitzhardinge #define GNTST_permission_denied (-8) /* Not enough privilege for operation. */ 364a42089ddSJeremy Fitzhardinge #define GNTST_bad_page (-9) /* Specified page was invalid for op. */ 365ad9a8612SJeremy Fitzhardinge #define GNTST_bad_copy_arg (-10) /* copy arguments cross page boundary */ 366a42089ddSJeremy Fitzhardinge 367a42089ddSJeremy Fitzhardinge #define GNTTABOP_error_msgs { \ 368a42089ddSJeremy Fitzhardinge "okay", \ 369a42089ddSJeremy Fitzhardinge "undefined error", \ 370a42089ddSJeremy Fitzhardinge "unrecognised domain id", \ 371a42089ddSJeremy Fitzhardinge "invalid grant reference", \ 372a42089ddSJeremy Fitzhardinge "invalid mapping handle", \ 373a42089ddSJeremy Fitzhardinge "invalid virtual address", \ 374a42089ddSJeremy Fitzhardinge "invalid device address", \ 375a42089ddSJeremy Fitzhardinge "no spare translation slot in the I/O MMU", \ 376a42089ddSJeremy Fitzhardinge "permission denied", \ 377ad9a8612SJeremy Fitzhardinge "bad page", \ 378ad9a8612SJeremy Fitzhardinge "copy arguments cross page boundary" \ 379a42089ddSJeremy Fitzhardinge } 380a42089ddSJeremy Fitzhardinge 381a42089ddSJeremy Fitzhardinge #endif /* __XEN_PUBLIC_GRANT_TABLE_H__ */ 382