|
|
1.1 ! root 1: /****************************************************************************** ! 2: * memory.h ! 3: * ! 4: * Memory reservation and information. ! 5: * ! 6: * Permission is hereby granted, free of charge, to any person obtaining a copy ! 7: * of this software and associated documentation files (the "Software"), to ! 8: * deal in the Software without restriction, including without limitation the ! 9: * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ! 10: * sell copies of the Software, and to permit persons to whom the Software is ! 11: * furnished to do so, subject to the following conditions: ! 12: * ! 13: * The above copyright notice and this permission notice shall be included in ! 14: * all copies or substantial portions of the Software. ! 15: * ! 16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ! 17: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ! 19: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ! 20: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ! 21: * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ! 22: * DEALINGS IN THE SOFTWARE. ! 23: * ! 24: * Copyright (c) 2005, Keir Fraser <[email protected]> ! 25: */ ! 26: ! 27: #ifndef __XEN_PUBLIC_MEMORY_H__ ! 28: #define __XEN_PUBLIC_MEMORY_H__ ! 29: ! 30: /* ! 31: * Increase or decrease the specified domain's memory reservation. Returns the ! 32: * number of extents successfully allocated or freed. ! 33: * arg == addr of struct xen_memory_reservation. ! 34: */ ! 35: #define XENMEM_increase_reservation 0 ! 36: #define XENMEM_decrease_reservation 1 ! 37: #define XENMEM_populate_physmap 6 ! 38: ! 39: #if __XEN_INTERFACE_VERSION__ >= 0x00030209 ! 40: /* ! 41: * Maximum # bits addressable by the user of the allocated region (e.g., I/O ! 42: * devices often have a 32-bit limitation even in 64-bit systems). If zero ! 43: * then the user has no addressing restriction. This field is not used by ! 44: * XENMEM_decrease_reservation. ! 45: */ ! 46: #define XENMEMF_address_bits(x) (x) ! 47: #define XENMEMF_get_address_bits(x) ((x) & 0xffu) ! 48: /* NUMA node to allocate from. */ ! 49: #define XENMEMF_node(x) (((x) + 1) << 8) ! 50: #define XENMEMF_get_node(x) ((((x) >> 8) - 1) & 0xffu) ! 51: #endif ! 52: ! 53: struct xen_memory_reservation { ! 54: ! 55: /* ! 56: * XENMEM_increase_reservation: ! 57: * OUT: MFN (*not* GMFN) bases of extents that were allocated ! 58: * XENMEM_decrease_reservation: ! 59: * IN: GMFN bases of extents to free ! 60: * XENMEM_populate_physmap: ! 61: * IN: GPFN bases of extents to populate with memory ! 62: * OUT: GMFN bases of extents that were allocated ! 63: * (NB. This command also updates the mach_to_phys translation table) ! 64: */ ! 65: XEN_GUEST_HANDLE(xen_pfn_t) extent_start; ! 66: ! 67: /* Number of extents, and size/alignment of each (2^extent_order pages). */ ! 68: xen_ulong_t nr_extents; ! 69: unsigned int extent_order; ! 70: ! 71: #if __XEN_INTERFACE_VERSION__ >= 0x00030209 ! 72: /* XENMEMF flags. */ ! 73: unsigned int mem_flags; ! 74: #else ! 75: unsigned int address_bits; ! 76: #endif ! 77: ! 78: /* ! 79: * Domain whose reservation is being changed. ! 80: * Unprivileged domains can specify only DOMID_SELF. ! 81: */ ! 82: domid_t domid; ! 83: }; ! 84: typedef struct xen_memory_reservation xen_memory_reservation_t; ! 85: DEFINE_XEN_GUEST_HANDLE(xen_memory_reservation_t); ! 86: ! 87: /* ! 88: * An atomic exchange of memory pages. If return code is zero then ! 89: * @out.extent_list provides GMFNs of the newly-allocated memory. ! 90: * Returns zero on complete success, otherwise a negative error code. ! 91: * On complete success then always @nr_exchanged == @in.nr_extents. ! 92: * On partial success @nr_exchanged indicates how much work was done. ! 93: */ ! 94: #define XENMEM_exchange 11 ! 95: struct xen_memory_exchange { ! 96: /* ! 97: * [IN] Details of memory extents to be exchanged (GMFN bases). ! 98: * Note that @in.address_bits is ignored and unused. ! 99: */ ! 100: struct xen_memory_reservation in; ! 101: ! 102: /* ! 103: * [IN/OUT] Details of new memory extents. ! 104: * We require that: ! 105: * 1. @in.domid == @out.domid ! 106: * 2. @in.nr_extents << @in.extent_order == ! 107: * @out.nr_extents << @out.extent_order ! 108: * 3. @in.extent_start and @out.extent_start lists must not overlap ! 109: * 4. @out.extent_start lists GPFN bases to be populated ! 110: * 5. @out.extent_start is overwritten with allocated GMFN bases ! 111: */ ! 112: struct xen_memory_reservation out; ! 113: ! 114: /* ! 115: * [OUT] Number of input extents that were successfully exchanged: ! 116: * 1. The first @nr_exchanged input extents were successfully ! 117: * deallocated. ! 118: * 2. The corresponding first entries in the output extent list correctly ! 119: * indicate the GMFNs that were successfully exchanged. ! 120: * 3. All other input and output extents are untouched. ! 121: * 4. If not all input exents are exchanged then the return code of this ! 122: * command will be non-zero. ! 123: * 5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER! ! 124: */ ! 125: xen_ulong_t nr_exchanged; ! 126: }; ! 127: typedef struct xen_memory_exchange xen_memory_exchange_t; ! 128: DEFINE_XEN_GUEST_HANDLE(xen_memory_exchange_t); ! 129: ! 130: /* ! 131: * Returns the maximum machine frame number of mapped RAM in this system. ! 132: * This command always succeeds (it never returns an error code). ! 133: * arg == NULL. ! 134: */ ! 135: #define XENMEM_maximum_ram_page 2 ! 136: ! 137: /* ! 138: * Returns the current or maximum memory reservation, in pages, of the ! 139: * specified domain (may be DOMID_SELF). Returns -ve errcode on failure. ! 140: * arg == addr of domid_t. ! 141: */ ! 142: #define XENMEM_current_reservation 3 ! 143: #define XENMEM_maximum_reservation 4 ! 144: ! 145: /* ! 146: * Returns the maximum GPFN in use by the guest, or -ve errcode on failure. ! 147: */ ! 148: #define XENMEM_maximum_gpfn 14 ! 149: ! 150: /* ! 151: * Returns a list of MFN bases of 2MB extents comprising the machine_to_phys ! 152: * mapping table. Architectures which do not have a m2p table do not implement ! 153: * this command. ! 154: * arg == addr of xen_machphys_mfn_list_t. ! 155: */ ! 156: #define XENMEM_machphys_mfn_list 5 ! 157: struct xen_machphys_mfn_list { ! 158: /* ! 159: * Size of the 'extent_start' array. Fewer entries will be filled if the ! 160: * machphys table is smaller than max_extents * 2MB. ! 161: */ ! 162: unsigned int max_extents; ! 163: ! 164: /* ! 165: * Pointer to buffer to fill with list of extent starts. If there are ! 166: * any large discontiguities in the machine address space, 2MB gaps in ! 167: * the machphys table will be represented by an MFN base of zero. ! 168: */ ! 169: XEN_GUEST_HANDLE(xen_pfn_t) extent_start; ! 170: ! 171: /* ! 172: * Number of extents written to the above array. This will be smaller ! 173: * than 'max_extents' if the machphys table is smaller than max_e * 2MB. ! 174: */ ! 175: unsigned int nr_extents; ! 176: }; ! 177: typedef struct xen_machphys_mfn_list xen_machphys_mfn_list_t; ! 178: DEFINE_XEN_GUEST_HANDLE(xen_machphys_mfn_list_t); ! 179: ! 180: /* ! 181: * Returns the location in virtual address space of the machine_to_phys ! 182: * mapping table. Architectures which do not have a m2p table, or which do not ! 183: * map it by default into guest address space, do not implement this command. ! 184: * arg == addr of xen_machphys_mapping_t. ! 185: */ ! 186: #define XENMEM_machphys_mapping 12 ! 187: struct xen_machphys_mapping { ! 188: xen_ulong_t v_start, v_end; /* Start and end virtual addresses. */ ! 189: xen_ulong_t max_mfn; /* Maximum MFN that can be looked up. */ ! 190: }; ! 191: typedef struct xen_machphys_mapping xen_machphys_mapping_t; ! 192: DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t); ! 193: ! 194: /* ! 195: * Sets the GPFN at which a particular page appears in the specified guest's ! 196: * pseudophysical address space. ! 197: * arg == addr of xen_add_to_physmap_t. ! 198: */ ! 199: #define XENMEM_add_to_physmap 7 ! 200: struct xen_add_to_physmap { ! 201: /* Which domain to change the mapping for. */ ! 202: domid_t domid; ! 203: ! 204: /* Source mapping space. */ ! 205: #define XENMAPSPACE_shared_info 0 /* shared info page */ ! 206: #define XENMAPSPACE_grant_table 1 /* grant table page */ ! 207: #define XENMAPSPACE_mfn 2 /* usual MFN */ ! 208: unsigned int space; ! 209: ! 210: /* Index into source mapping space. */ ! 211: xen_ulong_t idx; ! 212: ! 213: /* GPFN where the source mapping page should appear. */ ! 214: xen_pfn_t gpfn; ! 215: }; ! 216: typedef struct xen_add_to_physmap xen_add_to_physmap_t; ! 217: DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t); ! 218: ! 219: /* ! 220: * Unmaps the page appearing at a particular GPFN from the specified guest's ! 221: * pseudophysical address space. ! 222: * arg == addr of xen_remove_from_physmap_t. ! 223: */ ! 224: #define XENMEM_remove_from_physmap 15 ! 225: struct xen_remove_from_physmap { ! 226: /* Which domain to change the mapping for. */ ! 227: domid_t domid; ! 228: ! 229: /* GPFN of the current mapping of the page. */ ! 230: xen_pfn_t gpfn; ! 231: }; ! 232: typedef struct xen_remove_from_physmap xen_remove_from_physmap_t; ! 233: DEFINE_XEN_GUEST_HANDLE(xen_remove_from_physmap_t); ! 234: ! 235: /* ! 236: * Translates a list of domain-specific GPFNs into MFNs. Returns a -ve error ! 237: * code on failure. This call only works for auto-translated guests. ! 238: */ ! 239: #define XENMEM_translate_gpfn_list 8 ! 240: struct xen_translate_gpfn_list { ! 241: /* Which domain to translate for? */ ! 242: domid_t domid; ! 243: ! 244: /* Length of list. */ ! 245: xen_ulong_t nr_gpfns; ! 246: ! 247: /* List of GPFNs to translate. */ ! 248: XEN_GUEST_HANDLE(xen_pfn_t) gpfn_list; ! 249: ! 250: /* ! 251: * Output list to contain MFN translations. May be the same as the input ! 252: * list (in which case each input GPFN is overwritten with the output MFN). ! 253: */ ! 254: XEN_GUEST_HANDLE(xen_pfn_t) mfn_list; ! 255: }; ! 256: typedef struct xen_translate_gpfn_list xen_translate_gpfn_list_t; ! 257: DEFINE_XEN_GUEST_HANDLE(xen_translate_gpfn_list_t); ! 258: ! 259: /* ! 260: * Returns the pseudo-physical memory map as it was when the domain ! 261: * was started (specified by XENMEM_set_memory_map). ! 262: * arg == addr of xen_memory_map_t. ! 263: */ ! 264: #define XENMEM_memory_map 9 ! 265: struct xen_memory_map { ! 266: /* ! 267: * On call the number of entries which can be stored in buffer. On ! 268: * return the number of entries which have been stored in ! 269: * buffer. ! 270: */ ! 271: unsigned int nr_entries; ! 272: ! 273: /* ! 274: * Entries in the buffer are in the same format as returned by the ! 275: * BIOS INT 0x15 EAX=0xE820 call. ! 276: */ ! 277: XEN_GUEST_HANDLE(void) buffer; ! 278: }; ! 279: typedef struct xen_memory_map xen_memory_map_t; ! 280: DEFINE_XEN_GUEST_HANDLE(xen_memory_map_t); ! 281: ! 282: /* ! 283: * Returns the real physical memory map. Passes the same structure as ! 284: * XENMEM_memory_map. ! 285: * arg == addr of xen_memory_map_t. ! 286: */ ! 287: #define XENMEM_machine_memory_map 10 ! 288: ! 289: /* ! 290: * Set the pseudo-physical memory map of a domain, as returned by ! 291: * XENMEM_memory_map. ! 292: * arg == addr of xen_foreign_memory_map_t. ! 293: */ ! 294: #define XENMEM_set_memory_map 13 ! 295: struct xen_foreign_memory_map { ! 296: domid_t domid; ! 297: struct xen_memory_map map; ! 298: }; ! 299: typedef struct xen_foreign_memory_map xen_foreign_memory_map_t; ! 300: DEFINE_XEN_GUEST_HANDLE(xen_foreign_memory_map_t); ! 301: ! 302: #endif /* __XEN_PUBLIC_MEMORY_H__ */ ! 303: ! 304: /* ! 305: * Local variables: ! 306: * mode: C ! 307: * c-set-style: "BSD" ! 308: * c-basic-offset: 4 ! 309: * tab-width: 4 ! 310: * indent-tabs-mode: nil ! 311: * End: ! 312: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.