xref: /illumos-gate/usr/src/uts/common/xen/public/memory.h (revision 349b53dd4e695e3d833b5380540385145b2d3ae8)
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