xref: /illumos-gate/usr/src/uts/common/xen/public/memory.h (revision a576ab5b)
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
38843e1988Sjohnlev struct xen_memory_reservation {
39843e1988Sjohnlev 
40843e1988Sjohnlev     /*
41843e1988Sjohnlev      * XENMEM_increase_reservation:
42843e1988Sjohnlev      *   OUT: MFN (*not* GMFN) bases of extents that were allocated
43843e1988Sjohnlev      * XENMEM_decrease_reservation:
44843e1988Sjohnlev      *   IN:  GMFN bases of extents to free
45843e1988Sjohnlev      * XENMEM_populate_physmap:
46843e1988Sjohnlev      *   IN:  GPFN bases of extents to populate with memory
47843e1988Sjohnlev      *   OUT: GMFN bases of extents that were allocated
48843e1988Sjohnlev      *   (NB. This command also updates the mach_to_phys translation table)
49843e1988Sjohnlev      */
50843e1988Sjohnlev     XEN_GUEST_HANDLE(xen_pfn_t) extent_start;
51843e1988Sjohnlev 
52843e1988Sjohnlev     /* Number of extents, and size/alignment of each (2^extent_order pages). */
53843e1988Sjohnlev     xen_ulong_t    nr_extents;
54843e1988Sjohnlev     unsigned int   extent_order;
55843e1988Sjohnlev 
56843e1988Sjohnlev     /*
57843e1988Sjohnlev      * Maximum # bits addressable by the user of the allocated region (e.g.,
58843e1988Sjohnlev      * I/O devices often have a 32-bit limitation even in 64-bit systems). If
59843e1988Sjohnlev      * zero then the user has no addressing restriction.
60843e1988Sjohnlev      * This field is not used by XENMEM_decrease_reservation.
61843e1988Sjohnlev      */
62843e1988Sjohnlev     unsigned int   address_bits;
63843e1988Sjohnlev 
64843e1988Sjohnlev     /*
65843e1988Sjohnlev      * Domain whose reservation is being changed.
66843e1988Sjohnlev      * Unprivileged domains can specify only DOMID_SELF.
67843e1988Sjohnlev      */
68843e1988Sjohnlev     domid_t        domid;
69843e1988Sjohnlev };
70843e1988Sjohnlev typedef struct xen_memory_reservation xen_memory_reservation_t;
71843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_memory_reservation_t);
72843e1988Sjohnlev 
73843e1988Sjohnlev /*
74843e1988Sjohnlev  * An atomic exchange of memory pages. If return code is zero then
75843e1988Sjohnlev  * @out.extent_list provides GMFNs of the newly-allocated memory.
76843e1988Sjohnlev  * Returns zero on complete success, otherwise a negative error code.
77843e1988Sjohnlev  * On complete success then always @nr_exchanged == @in.nr_extents.
78843e1988Sjohnlev  * On partial success @nr_exchanged indicates how much work was done.
79843e1988Sjohnlev  */
80843e1988Sjohnlev #define XENMEM_exchange             11
81843e1988Sjohnlev struct xen_memory_exchange {
82843e1988Sjohnlev     /*
83843e1988Sjohnlev      * [IN] Details of memory extents to be exchanged (GMFN bases).
84843e1988Sjohnlev      * Note that @in.address_bits is ignored and unused.
85843e1988Sjohnlev      */
86843e1988Sjohnlev     struct xen_memory_reservation in;
87843e1988Sjohnlev 
88843e1988Sjohnlev     /*
89843e1988Sjohnlev      * [IN/OUT] Details of new memory extents.
90843e1988Sjohnlev      * We require that:
91843e1988Sjohnlev      *  1. @in.domid == @out.domid
92843e1988Sjohnlev      *  2. @in.nr_extents  << @in.extent_order ==
93843e1988Sjohnlev      *     @out.nr_extents << @out.extent_order
94843e1988Sjohnlev      *  3. @in.extent_start and @out.extent_start lists must not overlap
95843e1988Sjohnlev      *  4. @out.extent_start lists GPFN bases to be populated
96843e1988Sjohnlev      *  5. @out.extent_start is overwritten with allocated GMFN bases
97843e1988Sjohnlev      */
98843e1988Sjohnlev     struct xen_memory_reservation out;
99843e1988Sjohnlev 
100843e1988Sjohnlev     /*
101843e1988Sjohnlev      * [OUT] Number of input extents that were successfully exchanged:
102843e1988Sjohnlev      *  1. The first @nr_exchanged input extents were successfully
103843e1988Sjohnlev      *     deallocated.
104843e1988Sjohnlev      *  2. The corresponding first entries in the output extent list correctly
105843e1988Sjohnlev      *     indicate the GMFNs that were successfully exchanged.
106843e1988Sjohnlev      *  3. All other input and output extents are untouched.
107843e1988Sjohnlev      *  4. If not all input exents are exchanged then the return code of this
108843e1988Sjohnlev      *     command will be non-zero.
109843e1988Sjohnlev      *  5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER!
110843e1988Sjohnlev      */
111843e1988Sjohnlev     xen_ulong_t nr_exchanged;
112843e1988Sjohnlev };
113843e1988Sjohnlev typedef struct xen_memory_exchange xen_memory_exchange_t;
114843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_memory_exchange_t);
115843e1988Sjohnlev 
116843e1988Sjohnlev /*
117843e1988Sjohnlev  * Returns the maximum machine frame number of mapped RAM in this system.
118843e1988Sjohnlev  * This command always succeeds (it never returns an error code).
119843e1988Sjohnlev  * arg == NULL.
120843e1988Sjohnlev  */
121843e1988Sjohnlev #define XENMEM_maximum_ram_page     2
122843e1988Sjohnlev 
123843e1988Sjohnlev /*
124843e1988Sjohnlev  * Returns the current or maximum memory reservation, in pages, of the
125843e1988Sjohnlev  * specified domain (may be DOMID_SELF). Returns -ve errcode on failure.
126843e1988Sjohnlev  * arg == addr of domid_t.
127843e1988Sjohnlev  */
128843e1988Sjohnlev #define XENMEM_current_reservation  3
129843e1988Sjohnlev #define XENMEM_maximum_reservation  4
130843e1988Sjohnlev 
131*a576ab5bSrab /*
132*a576ab5bSrab  * Returns the maximum GPFN in use by the guest, or -ve errcode on failure.
133*a576ab5bSrab  */
134*a576ab5bSrab #define XENMEM_maximum_gpfn         14
135*a576ab5bSrab 
136843e1988Sjohnlev /*
137843e1988Sjohnlev  * Returns a list of MFN bases of 2MB extents comprising the machine_to_phys
138843e1988Sjohnlev  * mapping table. Architectures which do not have a m2p table do not implement
139843e1988Sjohnlev  * this command.
140843e1988Sjohnlev  * arg == addr of xen_machphys_mfn_list_t.
141843e1988Sjohnlev  */
142843e1988Sjohnlev #define XENMEM_machphys_mfn_list    5
143843e1988Sjohnlev struct xen_machphys_mfn_list {
144843e1988Sjohnlev     /*
145843e1988Sjohnlev      * Size of the 'extent_start' array. Fewer entries will be filled if the
146843e1988Sjohnlev      * machphys table is smaller than max_extents * 2MB.
147843e1988Sjohnlev      */
148843e1988Sjohnlev     unsigned int max_extents;
149843e1988Sjohnlev 
150843e1988Sjohnlev     /*
151843e1988Sjohnlev      * Pointer to buffer to fill with list of extent starts. If there are
152843e1988Sjohnlev      * any large discontiguities in the machine address space, 2MB gaps in
153843e1988Sjohnlev      * the machphys table will be represented by an MFN base of zero.
154843e1988Sjohnlev      */
155843e1988Sjohnlev     XEN_GUEST_HANDLE(xen_pfn_t) extent_start;
156843e1988Sjohnlev 
157843e1988Sjohnlev     /*
158843e1988Sjohnlev      * Number of extents written to the above array. This will be smaller
159843e1988Sjohnlev      * than 'max_extents' if the machphys table is smaller than max_e * 2MB.
160843e1988Sjohnlev      */
161843e1988Sjohnlev     unsigned int nr_extents;
162843e1988Sjohnlev };
163843e1988Sjohnlev typedef struct xen_machphys_mfn_list xen_machphys_mfn_list_t;
164843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_machphys_mfn_list_t);
165843e1988Sjohnlev 
166843e1988Sjohnlev /*
167843e1988Sjohnlev  * Returns the location in virtual address space of the machine_to_phys
168843e1988Sjohnlev  * mapping table. Architectures which do not have a m2p table, or which do not
169843e1988Sjohnlev  * map it by default into guest address space, do not implement this command.
170843e1988Sjohnlev  * arg == addr of xen_machphys_mapping_t.
171843e1988Sjohnlev  */
172843e1988Sjohnlev #define XENMEM_machphys_mapping     12
173843e1988Sjohnlev struct xen_machphys_mapping {
174843e1988Sjohnlev     xen_ulong_t v_start, v_end; /* Start and end virtual addresses.   */
175843e1988Sjohnlev     xen_ulong_t max_mfn;        /* Maximum MFN that can be looked up. */
176843e1988Sjohnlev };
177843e1988Sjohnlev typedef struct xen_machphys_mapping xen_machphys_mapping_t;
178843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t);
179843e1988Sjohnlev 
180843e1988Sjohnlev /*
181843e1988Sjohnlev  * Sets the GPFN at which a particular page appears in the specified guest's
182843e1988Sjohnlev  * pseudophysical address space.
183843e1988Sjohnlev  * arg == addr of xen_add_to_physmap_t.
184843e1988Sjohnlev  */
185843e1988Sjohnlev #define XENMEM_add_to_physmap      7
186843e1988Sjohnlev struct xen_add_to_physmap {
187843e1988Sjohnlev     /* Which domain to change the mapping for. */
188843e1988Sjohnlev     domid_t domid;
189843e1988Sjohnlev 
190843e1988Sjohnlev     /* Source mapping space. */
191843e1988Sjohnlev #define XENMAPSPACE_shared_info 0 /* shared info page */
192843e1988Sjohnlev #define XENMAPSPACE_grant_table 1 /* grant table page */
193843e1988Sjohnlev     unsigned int space;
194843e1988Sjohnlev 
195843e1988Sjohnlev     /* Index into source mapping space. */
196843e1988Sjohnlev     xen_ulong_t idx;
197843e1988Sjohnlev 
198843e1988Sjohnlev     /* GPFN where the source mapping page should appear. */
199843e1988Sjohnlev     xen_pfn_t     gpfn;
200843e1988Sjohnlev };
201843e1988Sjohnlev typedef struct xen_add_to_physmap xen_add_to_physmap_t;
202843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t);
203843e1988Sjohnlev 
204843e1988Sjohnlev /*
205843e1988Sjohnlev  * Translates a list of domain-specific GPFNs into MFNs. Returns a -ve error
206843e1988Sjohnlev  * code on failure. This call only works for auto-translated guests.
207843e1988Sjohnlev  */
208843e1988Sjohnlev #define XENMEM_translate_gpfn_list  8
209843e1988Sjohnlev struct xen_translate_gpfn_list {
210843e1988Sjohnlev     /* Which domain to translate for? */
211843e1988Sjohnlev     domid_t domid;
212843e1988Sjohnlev 
213843e1988Sjohnlev     /* Length of list. */
214843e1988Sjohnlev     xen_ulong_t nr_gpfns;
215843e1988Sjohnlev 
216843e1988Sjohnlev     /* List of GPFNs to translate. */
217843e1988Sjohnlev     XEN_GUEST_HANDLE(xen_pfn_t) gpfn_list;
218843e1988Sjohnlev 
219843e1988Sjohnlev     /*
220843e1988Sjohnlev      * Output list to contain MFN translations. May be the same as the input
221843e1988Sjohnlev      * list (in which case each input GPFN is overwritten with the output MFN).
222843e1988Sjohnlev      */
223843e1988Sjohnlev     XEN_GUEST_HANDLE(xen_pfn_t) mfn_list;
224843e1988Sjohnlev };
225843e1988Sjohnlev typedef struct xen_translate_gpfn_list xen_translate_gpfn_list_t;
226843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_translate_gpfn_list_t);
227843e1988Sjohnlev 
228843e1988Sjohnlev /*
229843e1988Sjohnlev  * Returns the pseudo-physical memory map as it was when the domain
230843e1988Sjohnlev  * was started (specified by XENMEM_set_memory_map).
231843e1988Sjohnlev  * arg == addr of xen_memory_map_t.
232843e1988Sjohnlev  */
233843e1988Sjohnlev #define XENMEM_memory_map           9
234843e1988Sjohnlev struct xen_memory_map {
235843e1988Sjohnlev     /*
236843e1988Sjohnlev      * On call the number of entries which can be stored in buffer. On
237843e1988Sjohnlev      * return the number of entries which have been stored in
238843e1988Sjohnlev      * buffer.
239843e1988Sjohnlev      */
240843e1988Sjohnlev     unsigned int nr_entries;
241843e1988Sjohnlev 
242843e1988Sjohnlev     /*
243843e1988Sjohnlev      * Entries in the buffer are in the same format as returned by the
244843e1988Sjohnlev      * BIOS INT 0x15 EAX=0xE820 call.
245843e1988Sjohnlev      */
246843e1988Sjohnlev     XEN_GUEST_HANDLE(void) buffer;
247843e1988Sjohnlev };
248843e1988Sjohnlev typedef struct xen_memory_map xen_memory_map_t;
249843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_memory_map_t);
250843e1988Sjohnlev 
251843e1988Sjohnlev /*
252843e1988Sjohnlev  * Returns the real physical memory map. Passes the same structure as
253843e1988Sjohnlev  * XENMEM_memory_map.
254843e1988Sjohnlev  * arg == addr of xen_memory_map_t.
255843e1988Sjohnlev  */
256843e1988Sjohnlev #define XENMEM_machine_memory_map   10
257843e1988Sjohnlev 
258843e1988Sjohnlev /*
259843e1988Sjohnlev  * Set the pseudo-physical memory map of a domain, as returned by
260843e1988Sjohnlev  * XENMEM_memory_map.
261843e1988Sjohnlev  * arg == addr of xen_foreign_memory_map_t.
262843e1988Sjohnlev  */
263843e1988Sjohnlev #define XENMEM_set_memory_map       13
264843e1988Sjohnlev struct xen_foreign_memory_map {
265843e1988Sjohnlev     domid_t domid;
266843e1988Sjohnlev     struct xen_memory_map map;
267843e1988Sjohnlev };
268843e1988Sjohnlev typedef struct xen_foreign_memory_map xen_foreign_memory_map_t;
269843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_foreign_memory_map_t);
270843e1988Sjohnlev 
271843e1988Sjohnlev #endif /* __XEN_PUBLIC_MEMORY_H__ */
272843e1988Sjohnlev 
273843e1988Sjohnlev /*
274843e1988Sjohnlev  * Local variables:
275843e1988Sjohnlev  * mode: C
276843e1988Sjohnlev  * c-set-style: "BSD"
277843e1988Sjohnlev  * c-basic-offset: 4
278843e1988Sjohnlev  * tab-width: 4
279843e1988Sjohnlev  * indent-tabs-mode: nil
280843e1988Sjohnlev  * End:
281843e1988Sjohnlev  */
282