1 /******************************************************************************
4 * Domain management operations. For use by node control stack.
6 * Copyright (c) 2002-2003, B Dragovic
7 * Copyright (c) 2002-2006, K Fraser
10 #ifndef __XEN_PUBLIC_DOMCTL_H__
11 #define __XEN_PUBLIC_DOMCTL_H__
13 #if !defined(__XEN__) && !defined(__XEN_TOOLS__)
14 #error "domctl operations are intended for use by node control tools only"
19 #define XEN_DOMCTL_INTERFACE_VERSION 0x00000003
21 struct xenctl_cpumap {
22 XEN_GUEST_HANDLE(uint8_t) bitmap;
27 * NB. xen_domctl.domain is an IN/OUT parameter for this operation.
28 * If it is specified as zero, an id is auto-allocated and returned.
30 #define XEN_DOMCTL_createdomain 1
31 struct xen_domctl_createdomain {
34 xen_domain_handle_t handle;
36 typedef struct xen_domctl_createdomain xen_domctl_createdomain_t;
37 DEFINE_XEN_GUEST_HANDLE(xen_domctl_createdomain_t);
39 #define XEN_DOMCTL_destroydomain 2
40 #define XEN_DOMCTL_pausedomain 3
41 #define XEN_DOMCTL_unpausedomain 4
43 #define XEN_DOMCTL_getdomaininfo 5
44 struct xen_domctl_getdomaininfo {
46 domid_t domain; /* Also echoed in domctl.domain */
47 #define DOMFLAGS_DYING (1<<0) /* Domain is scheduled to die. */
48 #define DOMFLAGS_SHUTDOWN (1<<2) /* The guest OS has shut down. */
49 #define DOMFLAGS_PAUSED (1<<3) /* Currently paused by control software. */
50 #define DOMFLAGS_BLOCKED (1<<4) /* Currently blocked pending an event. */
51 #define DOMFLAGS_RUNNING (1<<5) /* Domain is currently running. */
52 #define DOMFLAGS_CPUMASK 255 /* CPU to which this domain is bound. */
53 #define DOMFLAGS_CPUSHIFT 8
54 #define DOMFLAGS_SHUTDOWNMASK 255 /* DOMFLAGS_SHUTDOWN guest-supplied code. */
55 #define DOMFLAGS_SHUTDOWNSHIFT 16
59 uint64_t shared_info_frame; /* MFN of shared_info struct */
61 uint32_t nr_online_vcpus; /* Number of VCPUs currently online. */
62 uint32_t max_vcpu_id; /* Maximum VCPUID in use by this domain. */
64 xen_domain_handle_t handle;
66 typedef struct xen_domctl_getdomaininfo xen_domctl_getdomaininfo_t;
67 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getdomaininfo_t);
70 #define XEN_DOMCTL_getmemlist 6
71 struct xen_domctl_getmemlist {
73 /* Max entries to write to output buffer. */
75 /* Start index in guest's page list. */
77 XEN_GUEST_HANDLE(xen_pfn_t) buffer;
81 typedef struct xen_domctl_getmemlist xen_domctl_getmemlist_t;
82 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getmemlist_t);
85 #define XEN_DOMCTL_getpageframeinfo 7
87 #define XEN_DOMCTL_PFINFO_LTAB_SHIFT 28
88 #define XEN_DOMCTL_PFINFO_NOTAB (0x0<<28)
89 #define XEN_DOMCTL_PFINFO_L1TAB (0x1<<28)
90 #define XEN_DOMCTL_PFINFO_L2TAB (0x2<<28)
91 #define XEN_DOMCTL_PFINFO_L3TAB (0x3<<28)
92 #define XEN_DOMCTL_PFINFO_L4TAB (0x4<<28)
93 #define XEN_DOMCTL_PFINFO_LTABTYPE_MASK (0x7<<28)
94 #define XEN_DOMCTL_PFINFO_LPINTAB (0x1<<31)
95 #define XEN_DOMCTL_PFINFO_XTAB (0xf<<28) /* invalid page */
96 #define XEN_DOMCTL_PFINFO_LTAB_MASK (0xf<<28)
98 struct xen_domctl_getpageframeinfo {
100 uint64_t gmfn; /* GMFN to query */
102 /* Is the page PINNED to a type? */
103 uint32_t type; /* see above type defs */
105 typedef struct xen_domctl_getpageframeinfo xen_domctl_getpageframeinfo_t;
106 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo_t);
109 #define XEN_DOMCTL_getpageframeinfo2 8
110 struct xen_domctl_getpageframeinfo2 {
113 /* IN/OUT variables. */
114 XEN_GUEST_HANDLE(ulong) array;
116 typedef struct xen_domctl_getpageframeinfo2 xen_domctl_getpageframeinfo2_t;
117 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo2_t);
121 * Control shadow pagetables operation
123 #define XEN_DOMCTL_shadow_op 10
125 /* Disable shadow mode. */
126 #define XEN_DOMCTL_SHADOW_OP_OFF 0
128 /* Enable shadow mode (mode contains ORed XEN_DOMCTL_SHADOW_ENABLE_* flags). */
129 #define XEN_DOMCTL_SHADOW_OP_ENABLE 32
131 /* Log-dirty bitmap operations. */
132 /* Return the bitmap and clean internal copy for next round. */
133 #define XEN_DOMCTL_SHADOW_OP_CLEAN 11
134 /* Return the bitmap but do not modify internal copy. */
135 #define XEN_DOMCTL_SHADOW_OP_PEEK 12
137 /* Memory allocation accessors. */
138 #define XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION 30
139 #define XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION 31
141 /* Legacy enable operations. */
142 /* Equiv. to ENABLE with no mode flags. */
143 #define XEN_DOMCTL_SHADOW_OP_ENABLE_TEST 1
144 /* Equiv. to ENABLE with mode flag ENABLE_LOG_DIRTY. */
145 #define XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY 2
146 /* Equiv. to ENABLE with mode flags ENABLE_REFCOUNT and ENABLE_TRANSLATE. */
147 #define XEN_DOMCTL_SHADOW_OP_ENABLE_TRANSLATE 3
149 /* Mode flags for XEN_DOMCTL_SHADOW_OP_ENABLE. */
151 * Shadow pagetables are refcounted: guest does not use explicit mmu
152 * operations nor write-protect its pagetables.
154 #define XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT (1 << 1)
156 * Log pages in a bitmap as they are dirtied.
157 * Used for live relocation to determine which pages must be re-sent.
159 #define XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY (1 << 2)
161 * Automatically translate GPFNs into MFNs.
163 #define XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE (1 << 3)
165 * Xen does not steal virtual address space from the guest.
166 * Requires HVM support.
168 #define XEN_DOMCTL_SHADOW_ENABLE_EXTERNAL (1 << 4)
170 struct xen_domctl_shadow_op_stats {
171 uint32_t fault_count;
172 uint32_t dirty_count;
174 typedef struct xen_domctl_shadow_op_stats xen_domctl_shadow_op_stats_t;
175 DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_stats_t);
177 struct xen_domctl_shadow_op {
179 uint32_t op; /* XEN_DOMCTL_SHADOW_OP_* */
182 uint32_t mode; /* XEN_DOMCTL_SHADOW_ENABLE_* */
184 /* OP_GET_ALLOCATION / OP_SET_ALLOCATION */
185 uint32_t mb; /* Shadow memory allocation in MB */
187 /* OP_PEEK / OP_CLEAN */
188 XEN_GUEST_HANDLE(ulong) dirty_bitmap;
189 uint64_t pages; /* Size of buffer. Updated with actual size. */
190 struct xen_domctl_shadow_op_stats stats;
192 typedef struct xen_domctl_shadow_op xen_domctl_shadow_op_t;
193 DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_t);
196 #define XEN_DOMCTL_max_mem 11
197 struct xen_domctl_max_mem {
201 typedef struct xen_domctl_max_mem xen_domctl_max_mem_t;
202 DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_mem_t);
205 #define XEN_DOMCTL_setvcpucontext 12
206 #define XEN_DOMCTL_getvcpucontext 13
207 struct xen_domctl_vcpucontext {
208 uint32_t vcpu; /* IN */
209 XEN_GUEST_HANDLE(vcpu_guest_context_t) ctxt; /* IN/OUT */
211 typedef struct xen_domctl_vcpucontext xen_domctl_vcpucontext_t;
212 DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpucontext_t);
215 #define XEN_DOMCTL_getvcpuinfo 14
216 struct xen_domctl_getvcpuinfo {
220 uint8_t online; /* currently online (not hotplugged)? */
221 uint8_t blocked; /* blocked waiting for an event? */
222 uint8_t running; /* currently scheduled on its CPU? */
223 uint64_t cpu_time; /* total cpu time consumed (ns) */
224 uint32_t cpu; /* current mapping */
226 typedef struct xen_domctl_getvcpuinfo xen_domctl_getvcpuinfo_t;
227 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getvcpuinfo_t);
230 /* Get/set which physical cpus a vcpu can execute on. */
231 #define XEN_DOMCTL_setvcpuaffinity 9
232 #define XEN_DOMCTL_getvcpuaffinity 25
233 struct xen_domctl_vcpuaffinity {
234 uint32_t vcpu; /* IN */
235 struct xenctl_cpumap cpumap; /* IN/OUT */
237 typedef struct xen_domctl_vcpuaffinity xen_domctl_vcpuaffinity_t;
238 DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpuaffinity_t);
241 #define XEN_DOMCTL_max_vcpus 15
242 struct xen_domctl_max_vcpus {
243 uint32_t max; /* maximum number of vcpus */
245 typedef struct xen_domctl_max_vcpus xen_domctl_max_vcpus_t;
246 DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_vcpus_t);
249 #define XEN_DOMCTL_scheduler_op 16
250 /* Scheduler types. */
251 #define XEN_SCHEDULER_SEDF 4
252 #define XEN_SCHEDULER_CREDIT 5
253 /* Set or get info? */
254 #define XEN_DOMCTL_SCHEDOP_putinfo 0
255 #define XEN_DOMCTL_SCHEDOP_getinfo 1
256 struct xen_domctl_scheduler_op {
257 uint32_t sched_id; /* XEN_SCHEDULER_* */
258 uint32_t cmd; /* XEN_DOMCTL_SCHEDOP_* */
260 struct xen_domctl_sched_sedf {
267 struct xen_domctl_sched_credit {
273 typedef struct xen_domctl_scheduler_op xen_domctl_scheduler_op_t;
274 DEFINE_XEN_GUEST_HANDLE(xen_domctl_scheduler_op_t);
277 #define XEN_DOMCTL_setdomainhandle 17
278 struct xen_domctl_setdomainhandle {
279 xen_domain_handle_t handle;
281 typedef struct xen_domctl_setdomainhandle xen_domctl_setdomainhandle_t;
282 DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdomainhandle_t);
285 #define XEN_DOMCTL_setdebugging 18
286 struct xen_domctl_setdebugging {
289 typedef struct xen_domctl_setdebugging xen_domctl_setdebugging_t;
290 DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdebugging_t);
293 #define XEN_DOMCTL_irq_permission 19
294 struct xen_domctl_irq_permission {
296 uint8_t allow_access; /* flag to specify enable/disable of IRQ access */
298 typedef struct xen_domctl_irq_permission xen_domctl_irq_permission_t;
299 DEFINE_XEN_GUEST_HANDLE(xen_domctl_irq_permission_t);
302 #define XEN_DOMCTL_iomem_permission 20
303 struct xen_domctl_iomem_permission {
304 uint64_t first_mfn; /* first page (physical page number) in range */
305 uint64_t nr_mfns; /* number of pages in range (>0) */
306 uint8_t allow_access; /* allow (!0) or deny (0) access to range? */
308 typedef struct xen_domctl_iomem_permission xen_domctl_iomem_permission_t;
309 DEFINE_XEN_GUEST_HANDLE(xen_domctl_iomem_permission_t);
312 #define XEN_DOMCTL_ioport_permission 21
313 struct xen_domctl_ioport_permission {
314 uint32_t first_port; /* first port int range */
315 uint32_t nr_ports; /* size of port range */
316 uint8_t allow_access; /* allow or deny access to range? */
318 typedef struct xen_domctl_ioport_permission xen_domctl_ioport_permission_t;
319 DEFINE_XEN_GUEST_HANDLE(xen_domctl_ioport_permission_t);
321 #define XEN_DOMCTL_hypercall_init 22
322 struct xen_domctl_hypercall_init {
323 uint64_t gmfn; /* GMFN to be initialised */
325 typedef struct xen_domctl_hypercall_init xen_domctl_hypercall_init_t;
326 DEFINE_XEN_GUEST_HANDLE(xen_domctl_hypercall_init_t);
328 #define XEN_DOMCTL_arch_setup 23
329 #define _XEN_DOMAINSETUP_hvm_guest 0
330 #define XEN_DOMAINSETUP_hvm_guest (1UL<<_XEN_DOMAINSETUP_hvm_guest)
331 #define _XEN_DOMAINSETUP_query 1 /* Get parameters (for save) */
332 #define XEN_DOMAINSETUP_query (1UL<<_XEN_DOMAINSETUP_query)
333 typedef struct xen_domctl_arch_setup {
334 uint64_t flags; /* XEN_DOMAINSETUP_* */
336 uint64_t bp; /* mpaddr of boot param area */
337 uint64_t maxmem; /* Highest memory address for MDT. */
338 uint64_t xsi_va; /* Xen shared_info area virtual address. */
339 uint32_t hypercall_imm; /* Break imm for Xen hypercalls. */
341 } xen_domctl_arch_setup_t;
342 DEFINE_XEN_GUEST_HANDLE(xen_domctl_arch_setup_t);
344 #define XEN_DOMCTL_settimeoffset 24
345 struct xen_domctl_settimeoffset {
346 int32_t time_offset_seconds; /* applied to domain wallclock time */
348 typedef struct xen_domctl_settimeoffset xen_domctl_settimeoffset_t;
349 DEFINE_XEN_GUEST_HANDLE(xen_domctl_settimeoffset_t);
353 uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */
356 struct xen_domctl_createdomain createdomain;
357 struct xen_domctl_getdomaininfo getdomaininfo;
358 struct xen_domctl_getmemlist getmemlist;
359 struct xen_domctl_getpageframeinfo getpageframeinfo;
360 struct xen_domctl_getpageframeinfo2 getpageframeinfo2;
361 struct xen_domctl_vcpuaffinity vcpuaffinity;
362 struct xen_domctl_shadow_op shadow_op;
363 struct xen_domctl_max_mem max_mem;
364 struct xen_domctl_vcpucontext vcpucontext;
365 struct xen_domctl_getvcpuinfo getvcpuinfo;
366 struct xen_domctl_max_vcpus max_vcpus;
367 struct xen_domctl_scheduler_op scheduler_op;
368 struct xen_domctl_setdomainhandle setdomainhandle;
369 struct xen_domctl_setdebugging setdebugging;
370 struct xen_domctl_irq_permission irq_permission;
371 struct xen_domctl_iomem_permission iomem_permission;
372 struct xen_domctl_ioport_permission ioport_permission;
373 struct xen_domctl_hypercall_init hypercall_init;
374 struct xen_domctl_arch_setup arch_setup;
375 struct xen_domctl_settimeoffset settimeoffset;
379 typedef struct xen_domctl xen_domctl_t;
380 DEFINE_XEN_GUEST_HANDLE(xen_domctl_t);
382 #endif /* __XEN_PUBLIC_DOMCTL_H__ */
390 * indent-tabs-mode: nil