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 <keir@xensource.com> 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/* Flag to populate physmap with populate-on-demand entries */ 52#define XENMEMF_populate_on_demand (1<<16) 53#endif 54 55struct xen_memory_reservation { 56 57 /* 58 * XENMEM_increase_reservation: 59 * OUT: MFN (*not* GMFN) bases of extents that were allocated 60 * XENMEM_decrease_reservation: 61 * IN: GMFN bases of extents to free 62 * XENMEM_populate_physmap: 63 * IN: GPFN bases of extents to populate with memory 64 * OUT: GMFN bases of extents that were allocated 65 * (NB. This command also updates the mach_to_phys translation table) 66 */ 67 XEN_GUEST_HANDLE(xen_pfn_t) extent_start; 68 69 /* Number of extents, and size/alignment of each (2^extent_order pages). */ 70 xen_ulong_t nr_extents; 71 unsigned int extent_order; 72 73#if __XEN_INTERFACE_VERSION__ >= 0x00030209 74 /* XENMEMF flags. */ 75 unsigned int mem_flags; 76#else 77 unsigned int address_bits; 78#endif 79 80 /* 81 * Domain whose reservation is being changed. 82 * Unprivileged domains can specify only DOMID_SELF. 83 */ 84 domid_t domid; 85}; 86typedef struct xen_memory_reservation xen_memory_reservation_t; 87DEFINE_XEN_GUEST_HANDLE(xen_memory_reservation_t); 88 89/* 90 * An atomic exchange of memory pages. If return code is zero then 91 * @out.extent_list provides GMFNs of the newly-allocated memory. 92 * Returns zero on complete success, otherwise a negative error code. 93 * On complete success then always @nr_exchanged == @in.nr_extents. 94 * On partial success @nr_exchanged indicates how much work was done. 95 */ 96#define XENMEM_exchange 11 97struct xen_memory_exchange { 98 /* 99 * [IN] Details of memory extents to be exchanged (GMFN bases). 100 * Note that @in.address_bits is ignored and unused. 101 */ 102 struct xen_memory_reservation in; 103 104 /* 105 * [IN/OUT] Details of new memory extents. 106 * We require that: 107 * 1. @in.domid == @out.domid 108 * 2. @in.nr_extents << @in.extent_order == 109 * @out.nr_extents << @out.extent_order 110 * 3. @in.extent_start and @out.extent_start lists must not overlap 111 * 4. @out.extent_start lists GPFN bases to be populated 112 * 5. @out.extent_start is overwritten with allocated GMFN bases 113 */ 114 struct xen_memory_reservation out; 115 116 /* 117 * [OUT] Number of input extents that were successfully exchanged: 118 * 1. The first @nr_exchanged input extents were successfully 119 * deallocated. 120 * 2. The corresponding first entries in the output extent list correctly 121 * indicate the GMFNs that were successfully exchanged. 122 * 3. All other input and output extents are untouched. 123 * 4. If not all input exents are exchanged then the return code of this 124 * command will be non-zero. 125 * 5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER! 126 */ 127 xen_ulong_t nr_exchanged; 128}; 129typedef struct xen_memory_exchange xen_memory_exchange_t; 130DEFINE_XEN_GUEST_HANDLE(xen_memory_exchange_t); 131 132/* 133 * Returns the maximum machine frame number of mapped RAM in this system. 134 * This command always succeeds (it never returns an error code). 135 * arg == NULL. 136 */ 137#define XENMEM_maximum_ram_page 2 138 139/* 140 * Returns the current or maximum memory reservation, in pages, of the 141 * specified domain (may be DOMID_SELF). Returns -ve errcode on failure. 142 * arg == addr of domid_t. 143 */ 144#define XENMEM_current_reservation 3 145#define XENMEM_maximum_reservation 4 146 147/* 148 * Returns the maximum GPFN in use by the guest, or -ve errcode on failure. 149 */ 150#define XENMEM_maximum_gpfn 14 151 152/* 153 * Returns a list of MFN bases of 2MB extents comprising the machine_to_phys 154 * mapping table. Architectures which do not have a m2p table do not implement 155 * this command. 156 * arg == addr of xen_machphys_mfn_list_t. 157 */ 158#define XENMEM_machphys_mfn_list 5 159struct xen_machphys_mfn_list { 160 /* 161 * Size of the 'extent_start' array. Fewer entries will be filled if the 162 * machphys table is smaller than max_extents * 2MB. 163 */ 164 unsigned int max_extents; 165 166 /* 167 * Pointer to buffer to fill with list of extent starts. If there are 168 * any large discontiguities in the machine address space, 2MB gaps in 169 * the machphys table will be represented by an MFN base of zero. 170 */ 171 XEN_GUEST_HANDLE(xen_pfn_t) extent_start; 172 173 /* 174 * Number of extents written to the above array. This will be smaller 175 * than 'max_extents' if the machphys table is smaller than max_e * 2MB. 176 */ 177 unsigned int nr_extents; 178}; 179typedef struct xen_machphys_mfn_list xen_machphys_mfn_list_t; 180DEFINE_XEN_GUEST_HANDLE(xen_machphys_mfn_list_t); 181 182/* 183 * Returns the location in virtual address space of the machine_to_phys 184 * mapping table. Architectures which do not have a m2p table, or which do not 185 * map it by default into guest address space, do not implement this command. 186 * arg == addr of xen_machphys_mapping_t. 187 */ 188#define XENMEM_machphys_mapping 12 189struct xen_machphys_mapping { 190 xen_ulong_t v_start, v_end; /* Start and end virtual addresses. */ 191 xen_ulong_t max_mfn; /* Maximum MFN that can be looked up. */ 192}; 193typedef struct xen_machphys_mapping xen_machphys_mapping_t; 194DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t); 195 196/* 197 * Sets the GPFN at which a particular page appears in the specified guest's 198 * pseudophysical address space. 199 * arg == addr of xen_add_to_physmap_t. 200 */ 201#define XENMEM_add_to_physmap 7 202struct xen_add_to_physmap { 203 /* Which domain to change the mapping for. */ 204 domid_t domid; 205 206 /* Source mapping space. */ 207#define XENMAPSPACE_shared_info 0 /* shared info page */ 208#define XENMAPSPACE_grant_table 1 /* grant table page */ 209#define XENMAPSPACE_gmfn 2 /* GMFN */ 210 unsigned int space; 211 212 /* Index into source mapping space. */ 213 xen_ulong_t idx; 214 215 /* GPFN where the source mapping page should appear. */ 216 xen_pfn_t gpfn; 217}; 218typedef struct xen_add_to_physmap xen_add_to_physmap_t; 219DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t); 220 221/*** REMOVED ***/ 222/*#define XENMEM_translate_gpfn_list 8*/ 223 224/* 225 * Returns the pseudo-physical memory map as it was when the domain 226 * was started (specified by XENMEM_set_memory_map). 227 * arg == addr of xen_memory_map_t. 228 */ 229#define XENMEM_memory_map 9 230struct xen_memory_map { 231 /* 232 * On call the number of entries which can be stored in buffer. On 233 * return the number of entries which have been stored in 234 * buffer. 235 */ 236 unsigned int nr_entries; 237 238 /* 239 * Entries in the buffer are in the same format as returned by the 240 * BIOS INT 0x15 EAX=0xE820 call. 241 */ 242 XEN_GUEST_HANDLE(void) buffer; 243}; 244typedef struct xen_memory_map xen_memory_map_t; 245DEFINE_XEN_GUEST_HANDLE(xen_memory_map_t); 246 247/* 248 * Returns the real physical memory map. Passes the same structure as 249 * XENMEM_memory_map. 250 * arg == addr of xen_memory_map_t. 251 */ 252#define XENMEM_machine_memory_map 10 253 254/* 255 * Set the pseudo-physical memory map of a domain, as returned by 256 * XENMEM_memory_map. 257 * arg == addr of xen_foreign_memory_map_t. 258 */ 259#define XENMEM_set_memory_map 13 260struct xen_foreign_memory_map { 261 domid_t domid; 262 struct xen_memory_map map; 263}; 264typedef struct xen_foreign_memory_map xen_foreign_memory_map_t; 265DEFINE_XEN_GUEST_HANDLE(xen_foreign_memory_map_t); 266 267#define XENMEM_set_pod_target 16 268#define XENMEM_get_pod_target 17 269struct xen_pod_target { 270 /* IN */ 271 uint64_t target_pages; 272 /* OUT */ 273 uint64_t tot_pages; 274 uint64_t pod_cache_pages; 275 uint64_t pod_entries; 276 /* IN */ 277 domid_t domid; 278}; 279typedef struct xen_pod_target xen_pod_target_t; 280#endif /* __XEN_PUBLIC_MEMORY_H__ */ 281 282/* 283 * Local variables: 284 * mode: C 285 * c-set-style: "BSD" 286 * c-basic-offset: 4 287 * tab-width: 4 288 * indent-tabs-mode: nil 289 * End: 290 */ 291