1843e1988Sjohnlev /****************************************************************************** 2843e1988Sjohnlev * memory.h 3843e1988Sjohnlev * 4843e1988Sjohnlev * Memory reservation and information. 5843e1988Sjohnlev * 6843e1988Sjohnlev * Permission is hereby granted, free of charge, to any person obtaining a copy 7843e1988Sjohnlev * of this software and associated documentation files (the "Software"), to 8843e1988Sjohnlev * deal in the Software without restriction, including without limitation the 9843e1988Sjohnlev * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10843e1988Sjohnlev * sell copies of the Software, and to permit persons to whom the Software is 11843e1988Sjohnlev * furnished to do so, subject to the following conditions: 12843e1988Sjohnlev * 13843e1988Sjohnlev * The above copyright notice and this permission notice shall be included in 14843e1988Sjohnlev * all copies or substantial portions of the Software. 15843e1988Sjohnlev * 16843e1988Sjohnlev * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17843e1988Sjohnlev * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18843e1988Sjohnlev * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19843e1988Sjohnlev * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20843e1988Sjohnlev * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21843e1988Sjohnlev * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22843e1988Sjohnlev * DEALINGS IN THE SOFTWARE. 23843e1988Sjohnlev * 24843e1988Sjohnlev * Copyright (c) 2005, Keir Fraser <keir@xensource.com> 25843e1988Sjohnlev */ 26843e1988Sjohnlev 27843e1988Sjohnlev #ifndef __XEN_PUBLIC_MEMORY_H__ 28843e1988Sjohnlev #define __XEN_PUBLIC_MEMORY_H__ 29843e1988Sjohnlev 30843e1988Sjohnlev /* 31843e1988Sjohnlev * Increase or decrease the specified domain's memory reservation. Returns the 32843e1988Sjohnlev * number of extents successfully allocated or freed. 33843e1988Sjohnlev * arg == addr of struct xen_memory_reservation. 34843e1988Sjohnlev */ 35843e1988Sjohnlev #define XENMEM_increase_reservation 0 36843e1988Sjohnlev #define XENMEM_decrease_reservation 1 37843e1988Sjohnlev #define XENMEM_populate_physmap 6 38*349b53ddSStuart Maybee 39*349b53ddSStuart Maybee #if __XEN_INTERFACE_VERSION__ >= 0x00030209 40*349b53ddSStuart Maybee /* 41*349b53ddSStuart Maybee * Maximum # bits addressable by the user of the allocated region (e.g., I/O 42*349b53ddSStuart Maybee * devices often have a 32-bit limitation even in 64-bit systems). If zero 43*349b53ddSStuart Maybee * then the user has no addressing restriction. This field is not used by 44*349b53ddSStuart Maybee * XENMEM_decrease_reservation. 45*349b53ddSStuart Maybee */ 46*349b53ddSStuart Maybee #define XENMEMF_address_bits(x) (x) 47*349b53ddSStuart Maybee #define XENMEMF_get_address_bits(x) ((x) & 0xffu) 48*349b53ddSStuart Maybee /* NUMA node to allocate from. */ 49*349b53ddSStuart Maybee #define XENMEMF_node(x) (((x) + 1) << 8) 50*349b53ddSStuart Maybee #define XENMEMF_get_node(x) ((((x) >> 8) - 1) & 0xffu) 51*349b53ddSStuart Maybee #endif 52*349b53ddSStuart Maybee 53843e1988Sjohnlev struct xen_memory_reservation { 54843e1988Sjohnlev 55843e1988Sjohnlev /* 56843e1988Sjohnlev * XENMEM_increase_reservation: 57843e1988Sjohnlev * OUT: MFN (*not* GMFN) bases of extents that were allocated 58843e1988Sjohnlev * XENMEM_decrease_reservation: 59843e1988Sjohnlev * IN: GMFN bases of extents to free 60843e1988Sjohnlev * XENMEM_populate_physmap: 61843e1988Sjohnlev * IN: GPFN bases of extents to populate with memory 62843e1988Sjohnlev * OUT: GMFN bases of extents that were allocated 63843e1988Sjohnlev * (NB. This command also updates the mach_to_phys translation table) 64843e1988Sjohnlev */ 65843e1988Sjohnlev XEN_GUEST_HANDLE(xen_pfn_t) extent_start; 66843e1988Sjohnlev 67843e1988Sjohnlev /* Number of extents, and size/alignment of each (2^extent_order pages). */ 68843e1988Sjohnlev xen_ulong_t nr_extents; 69843e1988Sjohnlev unsigned int extent_order; 70843e1988Sjohnlev 71*349b53ddSStuart Maybee #if __XEN_INTERFACE_VERSION__ >= 0x00030209 72*349b53ddSStuart Maybee /* XENMEMF flags. */ 73*349b53ddSStuart Maybee unsigned int mem_flags; 74*349b53ddSStuart Maybee #else 75843e1988Sjohnlev unsigned int address_bits; 76*349b53ddSStuart Maybee #endif 77843e1988Sjohnlev 78843e1988Sjohnlev /* 79843e1988Sjohnlev * Domain whose reservation is being changed. 80843e1988Sjohnlev * Unprivileged domains can specify only DOMID_SELF. 81843e1988Sjohnlev */ 82843e1988Sjohnlev domid_t domid; 83843e1988Sjohnlev }; 84843e1988Sjohnlev typedef struct xen_memory_reservation xen_memory_reservation_t; 85843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_memory_reservation_t); 86843e1988Sjohnlev 87843e1988Sjohnlev /* 88843e1988Sjohnlev * An atomic exchange of memory pages. If return code is zero then 89843e1988Sjohnlev * @out.extent_list provides GMFNs of the newly-allocated memory. 90843e1988Sjohnlev * Returns zero on complete success, otherwise a negative error code. 91843e1988Sjohnlev * On complete success then always @nr_exchanged == @in.nr_extents. 92843e1988Sjohnlev * On partial success @nr_exchanged indicates how much work was done. 93843e1988Sjohnlev */ 94843e1988Sjohnlev #define XENMEM_exchange 11 95843e1988Sjohnlev struct xen_memory_exchange { 96843e1988Sjohnlev /* 97843e1988Sjohnlev * [IN] Details of memory extents to be exchanged (GMFN bases). 98843e1988Sjohnlev * Note that @in.address_bits is ignored and unused. 99843e1988Sjohnlev */ 100843e1988Sjohnlev struct xen_memory_reservation in; 101843e1988Sjohnlev 102843e1988Sjohnlev /* 103843e1988Sjohnlev * [IN/OUT] Details of new memory extents. 104843e1988Sjohnlev * We require that: 105843e1988Sjohnlev * 1. @in.domid == @out.domid 106843e1988Sjohnlev * 2. @in.nr_extents << @in.extent_order == 107843e1988Sjohnlev * @out.nr_extents << @out.extent_order 108843e1988Sjohnlev * 3. @in.extent_start and @out.extent_start lists must not overlap 109843e1988Sjohnlev * 4. @out.extent_start lists GPFN bases to be populated 110843e1988Sjohnlev * 5. @out.extent_start is overwritten with allocated GMFN bases 111843e1988Sjohnlev */ 112843e1988Sjohnlev struct xen_memory_reservation out; 113843e1988Sjohnlev 114843e1988Sjohnlev /* 115843e1988Sjohnlev * [OUT] Number of input extents that were successfully exchanged: 116843e1988Sjohnlev * 1. The first @nr_exchanged input extents were successfully 117843e1988Sjohnlev * deallocated. 118843e1988Sjohnlev * 2. The corresponding first entries in the output extent list correctly 119843e1988Sjohnlev * indicate the GMFNs that were successfully exchanged. 120843e1988Sjohnlev * 3. All other input and output extents are untouched. 121843e1988Sjohnlev * 4. If not all input exents are exchanged then the return code of this 122843e1988Sjohnlev * command will be non-zero. 123843e1988Sjohnlev * 5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER! 124843e1988Sjohnlev */ 125843e1988Sjohnlev xen_ulong_t nr_exchanged; 126843e1988Sjohnlev }; 127843e1988Sjohnlev typedef struct xen_memory_exchange xen_memory_exchange_t; 128843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_memory_exchange_t); 129843e1988Sjohnlev 130843e1988Sjohnlev /* 131843e1988Sjohnlev * Returns the maximum machine frame number of mapped RAM in this system. 132843e1988Sjohnlev * This command always succeeds (it never returns an error code). 133843e1988Sjohnlev * arg == NULL. 134843e1988Sjohnlev */ 135843e1988Sjohnlev #define XENMEM_maximum_ram_page 2 136843e1988Sjohnlev 137843e1988Sjohnlev /* 138843e1988Sjohnlev * Returns the current or maximum memory reservation, in pages, of the 139843e1988Sjohnlev * specified domain (may be DOMID_SELF). Returns -ve errcode on failure. 140843e1988Sjohnlev * arg == addr of domid_t. 141843e1988Sjohnlev */ 142843e1988Sjohnlev #define XENMEM_current_reservation 3 143843e1988Sjohnlev #define XENMEM_maximum_reservation 4 144843e1988Sjohnlev 145a576ab5bSrab /* 146a576ab5bSrab * Returns the maximum GPFN in use by the guest, or -ve errcode on failure. 147a576ab5bSrab */ 148a576ab5bSrab #define XENMEM_maximum_gpfn 14 149a576ab5bSrab 150843e1988Sjohnlev /* 151843e1988Sjohnlev * Returns a list of MFN bases of 2MB extents comprising the machine_to_phys 152843e1988Sjohnlev * mapping table. Architectures which do not have a m2p table do not implement 153843e1988Sjohnlev * this command. 154843e1988Sjohnlev * arg == addr of xen_machphys_mfn_list_t. 155843e1988Sjohnlev */ 156843e1988Sjohnlev #define XENMEM_machphys_mfn_list 5 157843e1988Sjohnlev struct xen_machphys_mfn_list { 158843e1988Sjohnlev /* 159843e1988Sjohnlev * Size of the 'extent_start' array. Fewer entries will be filled if the 160843e1988Sjohnlev * machphys table is smaller than max_extents * 2MB. 161843e1988Sjohnlev */ 162843e1988Sjohnlev unsigned int max_extents; 163843e1988Sjohnlev 164843e1988Sjohnlev /* 165843e1988Sjohnlev * Pointer to buffer to fill with list of extent starts. If there are 166843e1988Sjohnlev * any large discontiguities in the machine address space, 2MB gaps in 167843e1988Sjohnlev * the machphys table will be represented by an MFN base of zero. 168843e1988Sjohnlev */ 169843e1988Sjohnlev XEN_GUEST_HANDLE(xen_pfn_t) extent_start; 170843e1988Sjohnlev 171843e1988Sjohnlev /* 172843e1988Sjohnlev * Number of extents written to the above array. This will be smaller 173843e1988Sjohnlev * than 'max_extents' if the machphys table is smaller than max_e * 2MB. 174843e1988Sjohnlev */ 175843e1988Sjohnlev unsigned int nr_extents; 176843e1988Sjohnlev }; 177843e1988Sjohnlev typedef struct xen_machphys_mfn_list xen_machphys_mfn_list_t; 178843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_machphys_mfn_list_t); 179843e1988Sjohnlev 180843e1988Sjohnlev /* 181843e1988Sjohnlev * Returns the location in virtual address space of the machine_to_phys 182843e1988Sjohnlev * mapping table. Architectures which do not have a m2p table, or which do not 183843e1988Sjohnlev * map it by default into guest address space, do not implement this command. 184843e1988Sjohnlev * arg == addr of xen_machphys_mapping_t. 185843e1988Sjohnlev */ 186843e1988Sjohnlev #define XENMEM_machphys_mapping 12 187843e1988Sjohnlev struct xen_machphys_mapping { 188843e1988Sjohnlev xen_ulong_t v_start, v_end; /* Start and end virtual addresses. */ 189843e1988Sjohnlev xen_ulong_t max_mfn; /* Maximum MFN that can be looked up. */ 190843e1988Sjohnlev }; 191843e1988Sjohnlev typedef struct xen_machphys_mapping xen_machphys_mapping_t; 192843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t); 193843e1988Sjohnlev 194843e1988Sjohnlev /* 195843e1988Sjohnlev * Sets the GPFN at which a particular page appears in the specified guest's 196843e1988Sjohnlev * pseudophysical address space. 197843e1988Sjohnlev * arg == addr of xen_add_to_physmap_t. 198843e1988Sjohnlev */ 199843e1988Sjohnlev #define XENMEM_add_to_physmap 7 200843e1988Sjohnlev struct xen_add_to_physmap { 201843e1988Sjohnlev /* Which domain to change the mapping for. */ 202843e1988Sjohnlev domid_t domid; 203843e1988Sjohnlev 204843e1988Sjohnlev /* Source mapping space. */ 205843e1988Sjohnlev #define XENMAPSPACE_shared_info 0 /* shared info page */ 206843e1988Sjohnlev #define XENMAPSPACE_grant_table 1 /* grant table page */ 207843e1988Sjohnlev unsigned int space; 208843e1988Sjohnlev 209843e1988Sjohnlev /* Index into source mapping space. */ 210843e1988Sjohnlev xen_ulong_t idx; 211843e1988Sjohnlev 212843e1988Sjohnlev /* GPFN where the source mapping page should appear. */ 213843e1988Sjohnlev xen_pfn_t gpfn; 214843e1988Sjohnlev }; 215843e1988Sjohnlev typedef struct xen_add_to_physmap xen_add_to_physmap_t; 216843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t); 217843e1988Sjohnlev 218843e1988Sjohnlev /* 219843e1988Sjohnlev * Translates a list of domain-specific GPFNs into MFNs. Returns a -ve error 220843e1988Sjohnlev * code on failure. This call only works for auto-translated guests. 221843e1988Sjohnlev */ 222843e1988Sjohnlev #define XENMEM_translate_gpfn_list 8 223843e1988Sjohnlev struct xen_translate_gpfn_list { 224843e1988Sjohnlev /* Which domain to translate for? */ 225843e1988Sjohnlev domid_t domid; 226843e1988Sjohnlev 227843e1988Sjohnlev /* Length of list. */ 228843e1988Sjohnlev xen_ulong_t nr_gpfns; 229843e1988Sjohnlev 230843e1988Sjohnlev /* List of GPFNs to translate. */ 231843e1988Sjohnlev XEN_GUEST_HANDLE(xen_pfn_t) gpfn_list; 232843e1988Sjohnlev 233843e1988Sjohnlev /* 234843e1988Sjohnlev * Output list to contain MFN translations. May be the same as the input 235843e1988Sjohnlev * list (in which case each input GPFN is overwritten with the output MFN). 236843e1988Sjohnlev */ 237843e1988Sjohnlev XEN_GUEST_HANDLE(xen_pfn_t) mfn_list; 238843e1988Sjohnlev }; 239843e1988Sjohnlev typedef struct xen_translate_gpfn_list xen_translate_gpfn_list_t; 240843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_translate_gpfn_list_t); 241843e1988Sjohnlev 242843e1988Sjohnlev /* 243843e1988Sjohnlev * Returns the pseudo-physical memory map as it was when the domain 244843e1988Sjohnlev * was started (specified by XENMEM_set_memory_map). 245843e1988Sjohnlev * arg == addr of xen_memory_map_t. 246843e1988Sjohnlev */ 247843e1988Sjohnlev #define XENMEM_memory_map 9 248843e1988Sjohnlev struct xen_memory_map { 249843e1988Sjohnlev /* 250843e1988Sjohnlev * On call the number of entries which can be stored in buffer. On 251843e1988Sjohnlev * return the number of entries which have been stored in 252843e1988Sjohnlev * buffer. 253843e1988Sjohnlev */ 254843e1988Sjohnlev unsigned int nr_entries; 255843e1988Sjohnlev 256843e1988Sjohnlev /* 257843e1988Sjohnlev * Entries in the buffer are in the same format as returned by the 258843e1988Sjohnlev * BIOS INT 0x15 EAX=0xE820 call. 259843e1988Sjohnlev */ 260843e1988Sjohnlev XEN_GUEST_HANDLE(void) buffer; 261843e1988Sjohnlev }; 262843e1988Sjohnlev typedef struct xen_memory_map xen_memory_map_t; 263843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_memory_map_t); 264843e1988Sjohnlev 265843e1988Sjohnlev /* 266843e1988Sjohnlev * Returns the real physical memory map. Passes the same structure as 267843e1988Sjohnlev * XENMEM_memory_map. 268843e1988Sjohnlev * arg == addr of xen_memory_map_t. 269843e1988Sjohnlev */ 270843e1988Sjohnlev #define XENMEM_machine_memory_map 10 271843e1988Sjohnlev 272843e1988Sjohnlev /* 273843e1988Sjohnlev * Set the pseudo-physical memory map of a domain, as returned by 274843e1988Sjohnlev * XENMEM_memory_map. 275843e1988Sjohnlev * arg == addr of xen_foreign_memory_map_t. 276843e1988Sjohnlev */ 277843e1988Sjohnlev #define XENMEM_set_memory_map 13 278843e1988Sjohnlev struct xen_foreign_memory_map { 279843e1988Sjohnlev domid_t domid; 280843e1988Sjohnlev struct xen_memory_map map; 281843e1988Sjohnlev }; 282843e1988Sjohnlev typedef struct xen_foreign_memory_map xen_foreign_memory_map_t; 283843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_foreign_memory_map_t); 284843e1988Sjohnlev 285843e1988Sjohnlev #endif /* __XEN_PUBLIC_MEMORY_H__ */ 286843e1988Sjohnlev 287843e1988Sjohnlev /* 288843e1988Sjohnlev * Local variables: 289843e1988Sjohnlev * mode: C 290843e1988Sjohnlev * c-set-style: "BSD" 291843e1988Sjohnlev * c-basic-offset: 4 292843e1988Sjohnlev * tab-width: 4 293843e1988Sjohnlev * indent-tabs-mode: nil 294843e1988Sjohnlev * End: 295843e1988Sjohnlev */ 296