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