This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / include / xen / interface / domctl.h
1 /******************************************************************************
2  * domctl.h
3  * 
4  * Domain management operations. For use by node control stack.
5  * 
6  * Copyright (c) 2002-2003, B Dragovic
7  * Copyright (c) 2002-2006, K Fraser
8  */
9
10 #ifndef __XEN_PUBLIC_DOMCTL_H__
11 #define __XEN_PUBLIC_DOMCTL_H__
12
13 #if !defined(__XEN__) && !defined(__XEN_TOOLS__)
14 #error "domctl operations are intended for use by node control tools only"
15 #endif
16
17 #include "xen.h"
18
19 #define XEN_DOMCTL_INTERFACE_VERSION 0x00000003
20
21 struct xenctl_cpumap {
22     XEN_GUEST_HANDLE(uint8_t) bitmap;
23     uint32_t nr_cpus;
24 };
25
26 /*
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.
29  */
30 #define XEN_DOMCTL_createdomain       1
31 struct xen_domctl_createdomain {
32     /* IN parameters */
33     uint32_t ssidref;
34     xen_domain_handle_t handle;
35 };
36 typedef struct xen_domctl_createdomain xen_domctl_createdomain_t;
37 DEFINE_XEN_GUEST_HANDLE(xen_domctl_createdomain_t);
38
39 #define XEN_DOMCTL_destroydomain      2
40 #define XEN_DOMCTL_pausedomain        3
41 #define XEN_DOMCTL_unpausedomain      4
42
43 #define XEN_DOMCTL_getdomaininfo      5
44 struct xen_domctl_getdomaininfo {
45     /* OUT variables. */
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
56     uint32_t flags;
57     uint64_t tot_pages;
58     uint64_t max_pages;
59     uint64_t shared_info_frame;  /* MFN of shared_info struct */
60     uint64_t cpu_time;
61     uint32_t nr_online_vcpus;     /* Number of VCPUs currently online. */
62     uint32_t max_vcpu_id;         /* Maximum VCPUID in use by this domain. */
63     uint32_t ssidref;
64     xen_domain_handle_t handle;
65 };
66 typedef struct xen_domctl_getdomaininfo xen_domctl_getdomaininfo_t;
67 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getdomaininfo_t);
68
69
70 #define XEN_DOMCTL_getmemlist         6
71 struct xen_domctl_getmemlist {
72     /* IN variables. */
73     /* Max entries to write to output buffer. */
74     uint64_t max_pfns;
75     /* Start index in guest's page list. */
76     uint64_t start_pfn;
77     XEN_GUEST_HANDLE(xen_pfn_t) buffer;
78     /* OUT variables. */
79     uint64_t num_pfns;
80 };
81 typedef struct xen_domctl_getmemlist xen_domctl_getmemlist_t;
82 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getmemlist_t);
83
84
85 #define XEN_DOMCTL_getpageframeinfo   7
86
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)
97
98 struct xen_domctl_getpageframeinfo {
99     /* IN variables. */
100     uint64_t gmfn;        /* GMFN to query */
101     /* OUT variables. */
102     /* Is the page PINNED to a type? */
103     uint32_t type;         /* see above type defs */
104 };
105 typedef struct xen_domctl_getpageframeinfo xen_domctl_getpageframeinfo_t;
106 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo_t);
107
108
109 #define XEN_DOMCTL_getpageframeinfo2  8
110 struct xen_domctl_getpageframeinfo2 {
111     /* IN variables. */
112     uint64_t num;
113     /* IN/OUT variables. */
114     XEN_GUEST_HANDLE(ulong) array;
115 };
116 typedef struct xen_domctl_getpageframeinfo2 xen_domctl_getpageframeinfo2_t;
117 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo2_t);
118
119
120 /*
121  * Control shadow pagetables operation
122  */
123 #define XEN_DOMCTL_shadow_op         10
124
125 /* Disable shadow mode. */
126 #define XEN_DOMCTL_SHADOW_OP_OFF         0
127
128 /* Enable shadow mode (mode contains ORed XEN_DOMCTL_SHADOW_ENABLE_* flags). */
129 #define XEN_DOMCTL_SHADOW_OP_ENABLE      32
130
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
136
137 /* Memory allocation accessors. */
138 #define XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION   30
139 #define XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION   31
140
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
148
149 /* Mode flags for XEN_DOMCTL_SHADOW_OP_ENABLE. */
150  /*
151   * Shadow pagetables are refcounted: guest does not use explicit mmu
152   * operations nor write-protect its pagetables.
153   */
154 #define XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT  (1 << 1)
155  /*
156   * Log pages in a bitmap as they are dirtied.
157   * Used for live relocation to determine which pages must be re-sent.
158   */
159 #define XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY (1 << 2)
160  /*
161   * Automatically translate GPFNs into MFNs.
162   */
163 #define XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE (1 << 3)
164  /*
165   * Xen does not steal virtual address space from the guest.
166   * Requires HVM support.
167   */
168 #define XEN_DOMCTL_SHADOW_ENABLE_EXTERNAL  (1 << 4)
169
170 struct xen_domctl_shadow_op_stats {
171     uint32_t fault_count;
172     uint32_t dirty_count;
173 };
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);
176
177 struct xen_domctl_shadow_op {
178     /* IN variables. */
179     uint32_t       op;       /* XEN_DOMCTL_SHADOW_OP_* */
180
181     /* OP_ENABLE */
182     uint32_t       mode;     /* XEN_DOMCTL_SHADOW_ENABLE_* */
183
184     /* OP_GET_ALLOCATION / OP_SET_ALLOCATION */
185     uint32_t       mb;       /* Shadow memory allocation in MB */
186
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;
191 };
192 typedef struct xen_domctl_shadow_op xen_domctl_shadow_op_t;
193 DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_t);
194
195
196 #define XEN_DOMCTL_max_mem           11
197 struct xen_domctl_max_mem {
198     /* IN variables. */
199     uint64_t max_memkb;
200 };
201 typedef struct xen_domctl_max_mem xen_domctl_max_mem_t;
202 DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_mem_t);
203
204
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 */
210 };
211 typedef struct xen_domctl_vcpucontext xen_domctl_vcpucontext_t;
212 DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpucontext_t);
213
214
215 #define XEN_DOMCTL_getvcpuinfo       14
216 struct xen_domctl_getvcpuinfo {
217     /* IN variables. */
218     uint32_t vcpu;
219     /* OUT variables. */
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   */
225 };
226 typedef struct xen_domctl_getvcpuinfo xen_domctl_getvcpuinfo_t;
227 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getvcpuinfo_t);
228
229
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 */
236 };
237 typedef struct xen_domctl_vcpuaffinity xen_domctl_vcpuaffinity_t;
238 DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpuaffinity_t);
239
240
241 #define XEN_DOMCTL_max_vcpus         15
242 struct xen_domctl_max_vcpus {
243     uint32_t max;           /* maximum number of vcpus */
244 };
245 typedef struct xen_domctl_max_vcpus xen_domctl_max_vcpus_t;
246 DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_vcpus_t);
247
248
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_* */
259     union {
260         struct xen_domctl_sched_sedf {
261             uint64_t period;
262             uint64_t slice;
263             uint64_t latency;
264             uint32_t extratime;
265             uint32_t weight;
266         } sedf;
267         struct xen_domctl_sched_credit {
268             uint16_t weight;
269             uint16_t cap;
270         } credit;
271     } u;
272 };
273 typedef struct xen_domctl_scheduler_op xen_domctl_scheduler_op_t;
274 DEFINE_XEN_GUEST_HANDLE(xen_domctl_scheduler_op_t);
275
276
277 #define XEN_DOMCTL_setdomainhandle   17
278 struct xen_domctl_setdomainhandle {
279     xen_domain_handle_t handle;
280 };
281 typedef struct xen_domctl_setdomainhandle xen_domctl_setdomainhandle_t;
282 DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdomainhandle_t);
283
284
285 #define XEN_DOMCTL_setdebugging      18
286 struct xen_domctl_setdebugging {
287     uint8_t enable;
288 };
289 typedef struct xen_domctl_setdebugging xen_domctl_setdebugging_t;
290 DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdebugging_t);
291
292
293 #define XEN_DOMCTL_irq_permission    19
294 struct xen_domctl_irq_permission {
295     uint8_t pirq;
296     uint8_t allow_access;    /* flag to specify enable/disable of IRQ access */
297 };
298 typedef struct xen_domctl_irq_permission xen_domctl_irq_permission_t;
299 DEFINE_XEN_GUEST_HANDLE(xen_domctl_irq_permission_t);
300
301
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? */
307 };
308 typedef struct xen_domctl_iomem_permission xen_domctl_iomem_permission_t;
309 DEFINE_XEN_GUEST_HANDLE(xen_domctl_iomem_permission_t);
310
311
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? */
317 };
318 typedef struct xen_domctl_ioport_permission xen_domctl_ioport_permission_t;
319 DEFINE_XEN_GUEST_HANDLE(xen_domctl_ioport_permission_t);
320
321 #define XEN_DOMCTL_hypercall_init    22
322 struct xen_domctl_hypercall_init {
323     uint64_t  gmfn;            /* GMFN to be initialised */
324 };
325 typedef struct xen_domctl_hypercall_init xen_domctl_hypercall_init_t;
326 DEFINE_XEN_GUEST_HANDLE(xen_domctl_hypercall_init_t);
327
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_* */
335 #ifdef __ia64__
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.  */
340 #endif
341 } xen_domctl_arch_setup_t;
342 DEFINE_XEN_GUEST_HANDLE(xen_domctl_arch_setup_t);
343
344 #define XEN_DOMCTL_settimeoffset     24
345 struct xen_domctl_settimeoffset {
346     int32_t  time_offset_seconds; /* applied to domain wallclock time */
347 };
348 typedef struct xen_domctl_settimeoffset xen_domctl_settimeoffset_t;
349 DEFINE_XEN_GUEST_HANDLE(xen_domctl_settimeoffset_t);
350
351 struct xen_domctl {
352     uint32_t cmd;
353     uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */
354     domid_t  domain;
355     union {
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;
376         uint8_t                             pad[128];
377     } u;
378 };
379 typedef struct xen_domctl xen_domctl_t;
380 DEFINE_XEN_GUEST_HANDLE(xen_domctl_t);
381
382 #endif /* __XEN_PUBLIC_DOMCTL_H__ */
383
384 /*
385  * Local variables:
386  * mode: C
387  * c-set-style: "BSD"
388  * c-basic-offset: 4
389  * tab-width: 4
390  * indent-tabs-mode: nil
391  * End:
392  */