1 /****************************************************************************** 2 * domctl.h 3 * 4 * Domain management operations. For use by node control stack. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to 8 * deal in the Software without restriction, including without limitation the 9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10 * sell copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 * DEALINGS IN THE SOFTWARE. 23 * 24 * Copyright (c) 2002-2003, B Dragovic 25 * Copyright (c) 2002-2006, K Fraser 26 */ 27 28 #ifndef __XEN_PUBLIC_DOMCTL_H__ 29 #define __XEN_PUBLIC_DOMCTL_H__ 30 31 /* 32 * XXPV - We need sysctl (physinfo) in the solaris kernel, which includes 33 * this file 34 */ 35 #if 0 36 37 #if !defined(__XEN__) && !defined(__XEN_TOOLS__) 38 #error "domctl operations are intended for use by node control tools only" 39 #endif 40 41 #endif /* XXPV */ 42 43 #include "xen.h" 44 45 #define XEN_DOMCTL_INTERFACE_VERSION 0x00000004 46 47 struct xenctl_cpumap { 48 XEN_GUEST_HANDLE(uint8_t) bitmap; 49 uint32_t nr_cpus; 50 }; 51 52 /* 53 * NB. xen_domctl.domain is an IN/OUT parameter for this operation. 54 * If it is specified as zero, an id is auto-allocated and returned. 55 */ 56 #define XEN_DOMCTL_createdomain 1 57 struct xen_domctl_createdomain { 58 /* IN parameters */ 59 uint32_t ssidref; 60 xen_domain_handle_t handle; 61 /* Is this an HVM guest (as opposed to a PV guest)? */ 62 #define _XEN_DOMCTL_CDF_hvm_guest 0 63 #define XEN_DOMCTL_CDF_hvm_guest (1U<<_XEN_DOMCTL_CDF_hvm_guest) 64 uint32_t flags; 65 }; 66 typedef struct xen_domctl_createdomain xen_domctl_createdomain_t; 67 DEFINE_XEN_GUEST_HANDLE(xen_domctl_createdomain_t); 68 69 #define XEN_DOMCTL_destroydomain 2 70 #define XEN_DOMCTL_pausedomain 3 71 #define XEN_DOMCTL_unpausedomain 4 72 73 #define XEN_DOMCTL_getdomaininfo 5 74 struct xen_domctl_getdomaininfo { 75 /* OUT variables. */ 76 domid_t domain; /* Also echoed in domctl.domain */ 77 /* Domain is scheduled to die. */ 78 #define _XEN_DOMINF_dying 0 79 #define XEN_DOMINF_dying (1U<<_XEN_DOMINF_dying) 80 /* Domain is an HVM guest (as opposed to a PV guest). */ 81 #define _XEN_DOMINF_hvm_guest 1 82 #define XEN_DOMINF_hvm_guest (1U<<_XEN_DOMINF_hvm_guest) 83 /* The guest OS has shut down. */ 84 #define _XEN_DOMINF_shutdown 2 85 #define XEN_DOMINF_shutdown (1U<<_XEN_DOMINF_shutdown) 86 /* Currently paused by control software. */ 87 #define _XEN_DOMINF_paused 3 88 #define XEN_DOMINF_paused (1U<<_XEN_DOMINF_paused) 89 /* Currently blocked pending an event. */ 90 #define _XEN_DOMINF_blocked 4 91 #define XEN_DOMINF_blocked (1U<<_XEN_DOMINF_blocked) 92 /* Domain is currently running. */ 93 #define _XEN_DOMINF_running 5 94 #define XEN_DOMINF_running (1U<<_XEN_DOMINF_running) 95 /* CPU to which this domain is bound. */ 96 #define XEN_DOMINF_cpumask 255 97 #define XEN_DOMINF_cpushift 8 98 /* XEN_DOMINF_shutdown guest-supplied code. */ 99 #define XEN_DOMINF_shutdownmask 255 100 #define XEN_DOMINF_shutdownshift 16 101 uint32_t flags; /* XEN_DOMINF_* */ 102 uint64_t tot_pages; 103 uint64_t max_pages; 104 uint64_t shared_info_frame; /* GMFN of shared_info struct */ 105 uint64_t cpu_time; 106 uint32_t nr_online_vcpus; /* Number of VCPUs currently online. */ 107 uint32_t max_vcpu_id; /* Maximum VCPUID in use by this domain. */ 108 uint32_t ssidref; 109 xen_domain_handle_t handle; 110 }; 111 typedef struct xen_domctl_getdomaininfo xen_domctl_getdomaininfo_t; 112 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getdomaininfo_t); 113 114 115 #define XEN_DOMCTL_getmemlist 6 116 struct xen_domctl_getmemlist { 117 /* IN variables. */ 118 /* Max entries to write to output buffer. */ 119 uint64_t max_pfns; 120 /* Start index in guest's page list. */ 121 uint64_t start_pfn; 122 XEN_GUEST_HANDLE(xen_pfn_t) buffer; 123 /* OUT variables. */ 124 uint64_t num_pfns; 125 }; 126 typedef struct xen_domctl_getmemlist xen_domctl_getmemlist_t; 127 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getmemlist_t); 128 129 130 #define XEN_DOMCTL_getpageframeinfo 7 131 132 #define XEN_DOMCTL_PFINFO_LTAB_SHIFT 28 133 #define XEN_DOMCTL_PFINFO_NOTAB (0x0<<28) 134 #define XEN_DOMCTL_PFINFO_L1TAB (0x1<<28) 135 #define XEN_DOMCTL_PFINFO_L2TAB (0x2<<28) 136 #define XEN_DOMCTL_PFINFO_L3TAB (0x3<<28) 137 #define XEN_DOMCTL_PFINFO_L4TAB (0x4<<28) 138 #define XEN_DOMCTL_PFINFO_LTABTYPE_MASK (0x7<<28) 139 #define XEN_DOMCTL_PFINFO_LPINTAB (0x1<<31) 140 #define XEN_DOMCTL_PFINFO_XTAB (0xf<<28) /* invalid page */ 141 #define XEN_DOMCTL_PFINFO_LTAB_MASK (0xf<<28) 142 143 struct xen_domctl_getpageframeinfo { 144 /* IN variables. */ 145 uint64_t gmfn; /* GMFN to query */ 146 /* OUT variables. */ 147 /* Is the page PINNED to a type? */ 148 uint32_t type; /* see above type defs */ 149 }; 150 typedef struct xen_domctl_getpageframeinfo xen_domctl_getpageframeinfo_t; 151 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo_t); 152 153 154 #define XEN_DOMCTL_getpageframeinfo2 8 155 struct xen_domctl_getpageframeinfo2 { 156 /* IN variables. */ 157 uint64_t num; 158 /* IN/OUT variables. */ 159 XEN_GUEST_HANDLE(ulong) array; 160 }; 161 typedef struct xen_domctl_getpageframeinfo2 xen_domctl_getpageframeinfo2_t; 162 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo2_t); 163 164 165 /* 166 * Control shadow pagetables operation 167 */ 168 #define XEN_DOMCTL_shadow_op 10 169 170 /* Disable shadow mode. */ 171 #define XEN_DOMCTL_SHADOW_OP_OFF 0 172 173 /* Enable shadow mode (mode contains ORed XEN_DOMCTL_SHADOW_ENABLE_* flags). */ 174 #define XEN_DOMCTL_SHADOW_OP_ENABLE 32 175 176 /* Log-dirty bitmap operations. */ 177 /* Return the bitmap and clean internal copy for next round. */ 178 #define XEN_DOMCTL_SHADOW_OP_CLEAN 11 179 /* Return the bitmap but do not modify internal copy. */ 180 #define XEN_DOMCTL_SHADOW_OP_PEEK 12 181 182 /* Memory allocation accessors. */ 183 #define XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION 30 184 #define XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION 31 185 186 /* Legacy enable operations. */ 187 /* Equiv. to ENABLE with no mode flags. */ 188 #define XEN_DOMCTL_SHADOW_OP_ENABLE_TEST 1 189 /* Equiv. to ENABLE with mode flag ENABLE_LOG_DIRTY. */ 190 #define XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY 2 191 /* Equiv. to ENABLE with mode flags ENABLE_REFCOUNT and ENABLE_TRANSLATE. */ 192 #define XEN_DOMCTL_SHADOW_OP_ENABLE_TRANSLATE 3 193 194 /* Mode flags for XEN_DOMCTL_SHADOW_OP_ENABLE. */ 195 /* 196 * Shadow pagetables are refcounted: guest does not use explicit mmu 197 * operations nor write-protect its pagetables. 198 */ 199 #define XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT (1 << 1) 200 /* 201 * Log pages in a bitmap as they are dirtied. 202 * Used for live relocation to determine which pages must be re-sent. 203 */ 204 #define XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY (1 << 2) 205 /* 206 * Automatically translate GPFNs into MFNs. 207 */ 208 #define XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE (1 << 3) 209 /* 210 * Xen does not steal virtual address space from the guest. 211 * Requires HVM support. 212 */ 213 #define XEN_DOMCTL_SHADOW_ENABLE_EXTERNAL (1 << 4) 214 215 struct xen_domctl_shadow_op_stats { 216 uint32_t fault_count; 217 uint32_t dirty_count; 218 }; 219 typedef struct xen_domctl_shadow_op_stats xen_domctl_shadow_op_stats_t; 220 DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_stats_t); 221 222 struct xen_domctl_shadow_op { 223 /* IN variables. */ 224 uint32_t op; /* XEN_DOMCTL_SHADOW_OP_* */ 225 226 /* OP_ENABLE */ 227 uint32_t mode; /* XEN_DOMCTL_SHADOW_ENABLE_* */ 228 229 /* OP_GET_ALLOCATION / OP_SET_ALLOCATION */ 230 uint32_t mb; /* Shadow memory allocation in MB */ 231 232 /* OP_PEEK / OP_CLEAN */ 233 XEN_GUEST_HANDLE(ulong) dirty_bitmap; 234 uint64_t pages; /* Size of buffer. Updated with actual size. */ 235 struct xen_domctl_shadow_op_stats stats; 236 }; 237 typedef struct xen_domctl_shadow_op xen_domctl_shadow_op_t; 238 DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_t); 239 240 241 #define XEN_DOMCTL_max_mem 11 242 struct xen_domctl_max_mem { 243 /* IN variables. */ 244 uint64_t max_memkb; 245 }; 246 typedef struct xen_domctl_max_mem xen_domctl_max_mem_t; 247 DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_mem_t); 248 249 250 #define XEN_DOMCTL_setvcpucontext 12 251 #define XEN_DOMCTL_getvcpucontext 13 252 struct xen_domctl_vcpucontext { 253 uint32_t vcpu; /* IN */ 254 XEN_GUEST_HANDLE(vcpu_guest_context_t) ctxt; /* IN/OUT */ 255 }; 256 typedef struct xen_domctl_vcpucontext xen_domctl_vcpucontext_t; 257 DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpucontext_t); 258 259 260 #define XEN_DOMCTL_getvcpuinfo 14 261 struct xen_domctl_getvcpuinfo { 262 /* IN variables. */ 263 uint32_t vcpu; 264 /* OUT variables. */ 265 uint8_t online; /* currently online (not hotplugged)? */ 266 uint8_t blocked; /* blocked waiting for an event? */ 267 uint8_t running; /* currently scheduled on its CPU? */ 268 uint64_t cpu_time; /* total cpu time consumed (ns) */ 269 uint32_t cpu; /* current mapping */ 270 }; 271 typedef struct xen_domctl_getvcpuinfo xen_domctl_getvcpuinfo_t; 272 DEFINE_XEN_GUEST_HANDLE(xen_domctl_getvcpuinfo_t); 273 274 275 /* Get/set which physical cpus a vcpu can execute on. */ 276 #define XEN_DOMCTL_setvcpuaffinity 9 277 #define XEN_DOMCTL_getvcpuaffinity 25 278 struct xen_domctl_vcpuaffinity { 279 uint32_t vcpu; /* IN */ 280 struct xenctl_cpumap cpumap; /* IN/OUT */ 281 }; 282 typedef struct xen_domctl_vcpuaffinity xen_domctl_vcpuaffinity_t; 283 DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpuaffinity_t); 284 285 286 #define XEN_DOMCTL_max_vcpus 15 287 struct xen_domctl_max_vcpus { 288 uint32_t max; /* maximum number of vcpus */ 289 }; 290 typedef struct xen_domctl_max_vcpus xen_domctl_max_vcpus_t; 291 DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_vcpus_t); 292 293 294 #define XEN_DOMCTL_scheduler_op 16 295 /* Scheduler types. */ 296 #define XEN_SCHEDULER_SEDF 4 297 #define XEN_SCHEDULER_CREDIT 5 298 /* Set or get info? */ 299 #define XEN_DOMCTL_SCHEDOP_putinfo 0 300 #define XEN_DOMCTL_SCHEDOP_getinfo 1 301 struct xen_domctl_scheduler_op { 302 uint32_t sched_id; /* XEN_SCHEDULER_* */ 303 uint32_t cmd; /* XEN_DOMCTL_SCHEDOP_* */ 304 union { 305 struct xen_domctl_sched_sedf { 306 uint64_t period; 307 uint64_t slice; 308 uint64_t latency; 309 uint32_t extratime; 310 uint32_t weight; 311 } sedf; 312 struct xen_domctl_sched_credit { 313 uint16_t weight; 314 uint16_t cap; 315 } credit; 316 } u; 317 }; 318 typedef struct xen_domctl_scheduler_op xen_domctl_scheduler_op_t; 319 DEFINE_XEN_GUEST_HANDLE(xen_domctl_scheduler_op_t); 320 321 322 #define XEN_DOMCTL_setdomainhandle 17 323 struct xen_domctl_setdomainhandle { 324 xen_domain_handle_t handle; 325 }; 326 typedef struct xen_domctl_setdomainhandle xen_domctl_setdomainhandle_t; 327 DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdomainhandle_t); 328 329 330 #define XEN_DOMCTL_setdebugging 18 331 struct xen_domctl_setdebugging { 332 uint8_t enable; 333 }; 334 typedef struct xen_domctl_setdebugging xen_domctl_setdebugging_t; 335 DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdebugging_t); 336 337 338 #define XEN_DOMCTL_irq_permission 19 339 struct xen_domctl_irq_permission { 340 uint8_t pirq; 341 uint8_t allow_access; /* flag to specify enable/disable of IRQ access */ 342 }; 343 typedef struct xen_domctl_irq_permission xen_domctl_irq_permission_t; 344 DEFINE_XEN_GUEST_HANDLE(xen_domctl_irq_permission_t); 345 346 347 #define XEN_DOMCTL_iomem_permission 20 348 struct xen_domctl_iomem_permission { 349 uint64_t first_mfn; /* first page (physical page number) in range */ 350 uint64_t nr_mfns; /* number of pages in range (>0) */ 351 uint8_t allow_access; /* allow (!0) or deny (0) access to range? */ 352 }; 353 typedef struct xen_domctl_iomem_permission xen_domctl_iomem_permission_t; 354 DEFINE_XEN_GUEST_HANDLE(xen_domctl_iomem_permission_t); 355 356 357 #define XEN_DOMCTL_ioport_permission 21 358 struct xen_domctl_ioport_permission { 359 uint32_t first_port; /* first port int range */ 360 uint32_t nr_ports; /* size of port range */ 361 uint8_t allow_access; /* allow or deny access to range? */ 362 }; 363 typedef struct xen_domctl_ioport_permission xen_domctl_ioport_permission_t; 364 DEFINE_XEN_GUEST_HANDLE(xen_domctl_ioport_permission_t); 365 366 #define XEN_DOMCTL_hypercall_init 22 367 struct xen_domctl_hypercall_init { 368 uint64_t gmfn; /* GMFN to be initialised */ 369 }; 370 typedef struct xen_domctl_hypercall_init xen_domctl_hypercall_init_t; 371 DEFINE_XEN_GUEST_HANDLE(xen_domctl_hypercall_init_t); 372 373 #define XEN_DOMCTL_arch_setup 23 374 #define _XEN_DOMAINSETUP_hvm_guest 0 375 #define XEN_DOMAINSETUP_hvm_guest (1UL<<_XEN_DOMAINSETUP_hvm_guest) 376 #define _XEN_DOMAINSETUP_query 1 /* Get parameters (for save) */ 377 #define XEN_DOMAINSETUP_query (1UL<<_XEN_DOMAINSETUP_query) 378 typedef struct xen_domctl_arch_setup { 379 uint64_t flags; /* XEN_DOMAINSETUP_* */ 380 #ifdef __ia64__ 381 uint64_t bp; /* mpaddr of boot param area */ 382 uint64_t maxmem; /* Highest memory address for MDT. */ 383 uint64_t xsi_va; /* Xen shared_info area virtual address. */ 384 uint32_t hypercall_imm; /* Break imm for Xen hypercalls. */ 385 #endif 386 } xen_domctl_arch_setup_t; 387 DEFINE_XEN_GUEST_HANDLE(xen_domctl_arch_setup_t); 388 389 #define XEN_DOMCTL_settimeoffset 24 390 struct xen_domctl_settimeoffset { 391 int32_t time_offset_seconds; /* applied to domain wallclock time */ 392 }; 393 typedef struct xen_domctl_settimeoffset xen_domctl_settimeoffset_t; 394 DEFINE_XEN_GUEST_HANDLE(xen_domctl_settimeoffset_t); 395 396 #define XEN_DOMCTL_real_mode_area 26 397 struct xen_domctl_real_mode_area { 398 uint32_t log; /* log2 of Real Mode Area size */ 399 }; 400 typedef struct xen_domctl_real_mode_area xen_domctl_real_mode_area_t; 401 DEFINE_XEN_GUEST_HANDLE(xen_domctl_real_mode_area_t); 402 403 struct xen_domctl { 404 uint32_t cmd; 405 uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */ 406 domid_t domain; 407 union { 408 struct xen_domctl_createdomain createdomain; 409 struct xen_domctl_getdomaininfo getdomaininfo; 410 struct xen_domctl_getmemlist getmemlist; 411 struct xen_domctl_getpageframeinfo getpageframeinfo; 412 struct xen_domctl_getpageframeinfo2 getpageframeinfo2; 413 struct xen_domctl_vcpuaffinity vcpuaffinity; 414 struct xen_domctl_shadow_op shadow_op; 415 struct xen_domctl_max_mem max_mem; 416 struct xen_domctl_vcpucontext vcpucontext; 417 struct xen_domctl_getvcpuinfo getvcpuinfo; 418 struct xen_domctl_max_vcpus max_vcpus; 419 struct xen_domctl_scheduler_op scheduler_op; 420 struct xen_domctl_setdomainhandle setdomainhandle; 421 struct xen_domctl_setdebugging setdebugging; 422 struct xen_domctl_irq_permission irq_permission; 423 struct xen_domctl_iomem_permission iomem_permission; 424 struct xen_domctl_ioport_permission ioport_permission; 425 struct xen_domctl_hypercall_init hypercall_init; 426 struct xen_domctl_arch_setup arch_setup; 427 struct xen_domctl_settimeoffset settimeoffset; 428 struct xen_domctl_real_mode_area real_mode_area; 429 uint8_t pad[128]; 430 } u; 431 }; 432 typedef struct xen_domctl xen_domctl_t; 433 DEFINE_XEN_GUEST_HANDLE(xen_domctl_t); 434 435 #endif /* __XEN_PUBLIC_DOMCTL_H__ */ 436 437 /* 438 * Local variables: 439 * mode: C 440 * c-set-style: "BSD" 441 * c-basic-offset: 4 442 * tab-width: 4 443 * indent-tabs-mode: nil 444 * End: 445 */ 446