domctl.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  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. #ifndef __XEN_PUBLIC_DOMCTL_H__
  28. #define __XEN_PUBLIC_DOMCTL_H__
  29. #if !defined(__XEN__) && !defined(__XEN_TOOLS__)
  30. #error "domctl operations are intended for use by node control tools only"
  31. #endif
  32. #include "xen.h"
  33. #define XEN_DOMCTL_INTERFACE_VERSION 0x00000005
  34. struct xenctl_cpumap {
  35. XEN_GUEST_HANDLE_64(uint8) bitmap;
  36. uint32_t nr_cpus;
  37. };
  38. /*
  39. * NB. xen_domctl.domain is an IN/OUT parameter for this operation.
  40. * If it is specified as zero, an id is auto-allocated and returned.
  41. */
  42. #define XEN_DOMCTL_createdomain 1
  43. struct xen_domctl_createdomain {
  44. /* IN parameters */
  45. uint32_t ssidref;
  46. xen_domain_handle_t handle;
  47. /* Is this an HVM guest (as opposed to a PV guest)? */
  48. #define _XEN_DOMCTL_CDF_hvm_guest 0
  49. #define XEN_DOMCTL_CDF_hvm_guest (1U<<_XEN_DOMCTL_CDF_hvm_guest)
  50. /* Use hardware-assisted paging if available? */
  51. #define _XEN_DOMCTL_CDF_hap 1
  52. #define XEN_DOMCTL_CDF_hap (1U<<_XEN_DOMCTL_CDF_hap)
  53. uint32_t flags;
  54. };
  55. typedef struct xen_domctl_createdomain xen_domctl_createdomain_t;
  56. DEFINE_XEN_GUEST_HANDLE(xen_domctl_createdomain_t);
  57. #define XEN_DOMCTL_destroydomain 2
  58. #define XEN_DOMCTL_pausedomain 3
  59. #define XEN_DOMCTL_unpausedomain 4
  60. #define XEN_DOMCTL_resumedomain 27
  61. #define XEN_DOMCTL_getdomaininfo 5
  62. struct xen_domctl_getdomaininfo {
  63. /* OUT variables. */
  64. domid_t domain; /* Also echoed in domctl.domain */
  65. /* Domain is scheduled to die. */
  66. #define _XEN_DOMINF_dying 0
  67. #define XEN_DOMINF_dying (1U<<_XEN_DOMINF_dying)
  68. /* Domain is an HVM guest (as opposed to a PV guest). */
  69. #define _XEN_DOMINF_hvm_guest 1
  70. #define XEN_DOMINF_hvm_guest (1U<<_XEN_DOMINF_hvm_guest)
  71. /* The guest OS has shut down. */
  72. #define _XEN_DOMINF_shutdown 2
  73. #define XEN_DOMINF_shutdown (1U<<_XEN_DOMINF_shutdown)
  74. /* Currently paused by control software. */
  75. #define _XEN_DOMINF_paused 3
  76. #define XEN_DOMINF_paused (1U<<_XEN_DOMINF_paused)
  77. /* Currently blocked pending an event. */
  78. #define _XEN_DOMINF_blocked 4
  79. #define XEN_DOMINF_blocked (1U<<_XEN_DOMINF_blocked)
  80. /* Domain is currently running. */
  81. #define _XEN_DOMINF_running 5
  82. #define XEN_DOMINF_running (1U<<_XEN_DOMINF_running)
  83. /* Being debugged. */
  84. #define _XEN_DOMINF_debugged 6
  85. #define XEN_DOMINF_debugged (1U<<_XEN_DOMINF_debugged)
  86. /* CPU to which this domain is bound. */
  87. #define XEN_DOMINF_cpumask 255
  88. #define XEN_DOMINF_cpushift 8
  89. /* XEN_DOMINF_shutdown guest-supplied code. */
  90. #define XEN_DOMINF_shutdownmask 255
  91. #define XEN_DOMINF_shutdownshift 16
  92. uint32_t flags; /* XEN_DOMINF_* */
  93. uint64_aligned_t tot_pages;
  94. uint64_aligned_t max_pages;
  95. uint64_aligned_t shared_info_frame; /* GMFN of shared_info struct */
  96. uint64_aligned_t cpu_time;
  97. uint32_t nr_online_vcpus; /* Number of VCPUs currently online. */
  98. uint32_t max_vcpu_id; /* Maximum VCPUID in use by this domain. */
  99. uint32_t ssidref;
  100. xen_domain_handle_t handle;
  101. };
  102. typedef struct xen_domctl_getdomaininfo xen_domctl_getdomaininfo_t;
  103. DEFINE_XEN_GUEST_HANDLE(xen_domctl_getdomaininfo_t);
  104. #define XEN_DOMCTL_getmemlist 6
  105. struct xen_domctl_getmemlist {
  106. /* IN variables. */
  107. /* Max entries to write to output buffer. */
  108. uint64_aligned_t max_pfns;
  109. /* Start index in guest's page list. */
  110. uint64_aligned_t start_pfn;
  111. XEN_GUEST_HANDLE_64(uint64) buffer;
  112. /* OUT variables. */
  113. uint64_aligned_t num_pfns;
  114. };
  115. typedef struct xen_domctl_getmemlist xen_domctl_getmemlist_t;
  116. DEFINE_XEN_GUEST_HANDLE(xen_domctl_getmemlist_t);
  117. #define XEN_DOMCTL_getpageframeinfo 7
  118. #define XEN_DOMCTL_PFINFO_LTAB_SHIFT 28
  119. #define XEN_DOMCTL_PFINFO_NOTAB (0x0U<<28)
  120. #define XEN_DOMCTL_PFINFO_L1TAB (0x1U<<28)
  121. #define XEN_DOMCTL_PFINFO_L2TAB (0x2U<<28)
  122. #define XEN_DOMCTL_PFINFO_L3TAB (0x3U<<28)
  123. #define XEN_DOMCTL_PFINFO_L4TAB (0x4U<<28)
  124. #define XEN_DOMCTL_PFINFO_LTABTYPE_MASK (0x7U<<28)
  125. #define XEN_DOMCTL_PFINFO_LPINTAB (0x1U<<31)
  126. #define XEN_DOMCTL_PFINFO_XTAB (0xfU<<28) /* invalid page */
  127. #define XEN_DOMCTL_PFINFO_LTAB_MASK (0xfU<<28)
  128. struct xen_domctl_getpageframeinfo {
  129. /* IN variables. */
  130. uint64_aligned_t gmfn; /* GMFN to query */
  131. /* OUT variables. */
  132. /* Is the page PINNED to a type? */
  133. uint32_t type; /* see above type defs */
  134. };
  135. typedef struct xen_domctl_getpageframeinfo xen_domctl_getpageframeinfo_t;
  136. DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo_t);
  137. #define XEN_DOMCTL_getpageframeinfo2 8
  138. struct xen_domctl_getpageframeinfo2 {
  139. /* IN variables. */
  140. uint64_aligned_t num;
  141. /* IN/OUT variables. */
  142. XEN_GUEST_HANDLE_64(uint32) array;
  143. };
  144. typedef struct xen_domctl_getpageframeinfo2 xen_domctl_getpageframeinfo2_t;
  145. DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo2_t);
  146. /*
  147. * Control shadow pagetables operation
  148. */
  149. #define XEN_DOMCTL_shadow_op 10
  150. /* Disable shadow mode. */
  151. #define XEN_DOMCTL_SHADOW_OP_OFF 0
  152. /* Enable shadow mode (mode contains ORed XEN_DOMCTL_SHADOW_ENABLE_* flags). */
  153. #define XEN_DOMCTL_SHADOW_OP_ENABLE 32
  154. /* Log-dirty bitmap operations. */
  155. /* Return the bitmap and clean internal copy for next round. */
  156. #define XEN_DOMCTL_SHADOW_OP_CLEAN 11
  157. /* Return the bitmap but do not modify internal copy. */
  158. #define XEN_DOMCTL_SHADOW_OP_PEEK 12
  159. /* Memory allocation accessors. */
  160. #define XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION 30
  161. #define XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION 31
  162. /* Legacy enable operations. */
  163. /* Equiv. to ENABLE with no mode flags. */
  164. #define XEN_DOMCTL_SHADOW_OP_ENABLE_TEST 1
  165. /* Equiv. to ENABLE with mode flag ENABLE_LOG_DIRTY. */
  166. #define XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY 2
  167. /* Equiv. to ENABLE with mode flags ENABLE_REFCOUNT and ENABLE_TRANSLATE. */
  168. #define XEN_DOMCTL_SHADOW_OP_ENABLE_TRANSLATE 3
  169. /* Mode flags for XEN_DOMCTL_SHADOW_OP_ENABLE. */
  170. /*
  171. * Shadow pagetables are refcounted: guest does not use explicit mmu
  172. * operations nor write-protect its pagetables.
  173. */
  174. #define XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT (1 << 1)
  175. /*
  176. * Log pages in a bitmap as they are dirtied.
  177. * Used for live relocation to determine which pages must be re-sent.
  178. */
  179. #define XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY (1 << 2)
  180. /*
  181. * Automatically translate GPFNs into MFNs.
  182. */
  183. #define XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE (1 << 3)
  184. /*
  185. * Xen does not steal virtual address space from the guest.
  186. * Requires HVM support.
  187. */
  188. #define XEN_DOMCTL_SHADOW_ENABLE_EXTERNAL (1 << 4)
  189. struct xen_domctl_shadow_op_stats {
  190. uint32_t fault_count;
  191. uint32_t dirty_count;
  192. };
  193. typedef struct xen_domctl_shadow_op_stats xen_domctl_shadow_op_stats_t;
  194. DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_stats_t);
  195. struct xen_domctl_shadow_op {
  196. /* IN variables. */
  197. uint32_t op; /* XEN_DOMCTL_SHADOW_OP_* */
  198. /* OP_ENABLE */
  199. uint32_t mode; /* XEN_DOMCTL_SHADOW_ENABLE_* */
  200. /* OP_GET_ALLOCATION / OP_SET_ALLOCATION */
  201. uint32_t mb; /* Shadow memory allocation in MB */
  202. /* OP_PEEK / OP_CLEAN */
  203. XEN_GUEST_HANDLE_64(uint8) dirty_bitmap;
  204. uint64_aligned_t pages; /* Size of buffer. Updated with actual size. */
  205. struct xen_domctl_shadow_op_stats stats;
  206. };
  207. typedef struct xen_domctl_shadow_op xen_domctl_shadow_op_t;
  208. DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_t);
  209. #define XEN_DOMCTL_max_mem 11
  210. struct xen_domctl_max_mem {
  211. /* IN variables. */
  212. uint64_aligned_t max_memkb;
  213. };
  214. typedef struct xen_domctl_max_mem xen_domctl_max_mem_t;
  215. DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_mem_t);
  216. #define XEN_DOMCTL_setvcpucontext 12
  217. #define XEN_DOMCTL_getvcpucontext 13
  218. struct xen_domctl_vcpucontext {
  219. uint32_t vcpu; /* IN */
  220. XEN_GUEST_HANDLE_64(vcpu_guest_context_t) ctxt; /* IN/OUT */
  221. };
  222. typedef struct xen_domctl_vcpucontext xen_domctl_vcpucontext_t;
  223. DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpucontext_t);
  224. #define XEN_DOMCTL_getvcpuinfo 14
  225. struct xen_domctl_getvcpuinfo {
  226. /* IN variables. */
  227. uint32_t vcpu;
  228. /* OUT variables. */
  229. uint8_t online; /* currently online (not hotplugged)? */
  230. uint8_t blocked; /* blocked waiting for an event? */
  231. uint8_t running; /* currently scheduled on its CPU? */
  232. uint64_aligned_t cpu_time; /* total cpu time consumed (ns) */
  233. uint32_t cpu; /* current mapping */
  234. };
  235. typedef struct xen_domctl_getvcpuinfo xen_domctl_getvcpuinfo_t;
  236. DEFINE_XEN_GUEST_HANDLE(xen_domctl_getvcpuinfo_t);
  237. /* Get/set which physical cpus a vcpu can execute on. */
  238. #define XEN_DOMCTL_setvcpuaffinity 9
  239. #define XEN_DOMCTL_getvcpuaffinity 25
  240. struct xen_domctl_vcpuaffinity {
  241. uint32_t vcpu; /* IN */
  242. struct xenctl_cpumap cpumap; /* IN/OUT */
  243. };
  244. typedef struct xen_domctl_vcpuaffinity xen_domctl_vcpuaffinity_t;
  245. DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpuaffinity_t);
  246. #define XEN_DOMCTL_max_vcpus 15
  247. struct xen_domctl_max_vcpus {
  248. uint32_t max; /* maximum number of vcpus */
  249. };
  250. typedef struct xen_domctl_max_vcpus xen_domctl_max_vcpus_t;
  251. DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_vcpus_t);
  252. #define XEN_DOMCTL_scheduler_op 16
  253. /* Scheduler types. */
  254. #define XEN_SCHEDULER_SEDF 4
  255. #define XEN_SCHEDULER_CREDIT 5
  256. /* Set or get info? */
  257. #define XEN_DOMCTL_SCHEDOP_putinfo 0
  258. #define XEN_DOMCTL_SCHEDOP_getinfo 1
  259. struct xen_domctl_scheduler_op {
  260. uint32_t sched_id; /* XEN_SCHEDULER_* */
  261. uint32_t cmd; /* XEN_DOMCTL_SCHEDOP_* */
  262. union {
  263. struct xen_domctl_sched_sedf {
  264. uint64_aligned_t period;
  265. uint64_aligned_t slice;
  266. uint64_aligned_t latency;
  267. uint32_t extratime;
  268. uint32_t weight;
  269. } sedf;
  270. struct xen_domctl_sched_credit {
  271. uint16_t weight;
  272. uint16_t cap;
  273. } credit;
  274. } u;
  275. };
  276. typedef struct xen_domctl_scheduler_op xen_domctl_scheduler_op_t;
  277. DEFINE_XEN_GUEST_HANDLE(xen_domctl_scheduler_op_t);
  278. #define XEN_DOMCTL_setdomainhandle 17
  279. struct xen_domctl_setdomainhandle {
  280. xen_domain_handle_t handle;
  281. };
  282. typedef struct xen_domctl_setdomainhandle xen_domctl_setdomainhandle_t;
  283. DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdomainhandle_t);
  284. #define XEN_DOMCTL_setdebugging 18
  285. struct xen_domctl_setdebugging {
  286. uint8_t enable;
  287. };
  288. typedef struct xen_domctl_setdebugging xen_domctl_setdebugging_t;
  289. DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdebugging_t);
  290. #define XEN_DOMCTL_irq_permission 19
  291. struct xen_domctl_irq_permission {
  292. uint8_t pirq;
  293. uint8_t allow_access; /* flag to specify enable/disable of IRQ access */
  294. };
  295. typedef struct xen_domctl_irq_permission xen_domctl_irq_permission_t;
  296. DEFINE_XEN_GUEST_HANDLE(xen_domctl_irq_permission_t);
  297. #define XEN_DOMCTL_iomem_permission 20
  298. struct xen_domctl_iomem_permission {
  299. uint64_aligned_t first_mfn;/* first page (physical page number) in range */
  300. uint64_aligned_t nr_mfns; /* number of pages in range (>0) */
  301. uint8_t allow_access; /* allow (!0) or deny (0) access to range? */
  302. };
  303. typedef struct xen_domctl_iomem_permission xen_domctl_iomem_permission_t;
  304. DEFINE_XEN_GUEST_HANDLE(xen_domctl_iomem_permission_t);
  305. #define XEN_DOMCTL_ioport_permission 21
  306. struct xen_domctl_ioport_permission {
  307. uint32_t first_port; /* first port int range */
  308. uint32_t nr_ports; /* size of port range */
  309. uint8_t allow_access; /* allow or deny access to range? */
  310. };
  311. typedef struct xen_domctl_ioport_permission xen_domctl_ioport_permission_t;
  312. DEFINE_XEN_GUEST_HANDLE(xen_domctl_ioport_permission_t);
  313. #define XEN_DOMCTL_hypercall_init 22
  314. struct xen_domctl_hypercall_init {
  315. uint64_aligned_t gmfn; /* GMFN to be initialised */
  316. };
  317. typedef struct xen_domctl_hypercall_init xen_domctl_hypercall_init_t;
  318. DEFINE_XEN_GUEST_HANDLE(xen_domctl_hypercall_init_t);
  319. #define XEN_DOMCTL_arch_setup 23
  320. #define _XEN_DOMAINSETUP_hvm_guest 0
  321. #define XEN_DOMAINSETUP_hvm_guest (1UL<<_XEN_DOMAINSETUP_hvm_guest)
  322. #define _XEN_DOMAINSETUP_query 1 /* Get parameters (for save) */
  323. #define XEN_DOMAINSETUP_query (1UL<<_XEN_DOMAINSETUP_query)
  324. #define _XEN_DOMAINSETUP_sioemu_guest 2
  325. #define XEN_DOMAINSETUP_sioemu_guest (1UL<<_XEN_DOMAINSETUP_sioemu_guest)
  326. typedef struct xen_domctl_arch_setup {
  327. uint64_aligned_t flags; /* XEN_DOMAINSETUP_* */
  328. #ifdef __ia64__
  329. uint64_aligned_t bp; /* mpaddr of boot param area */
  330. uint64_aligned_t maxmem; /* Highest memory address for MDT. */
  331. uint64_aligned_t xsi_va; /* Xen shared_info area virtual address. */
  332. uint32_t hypercall_imm; /* Break imm for Xen hypercalls. */
  333. int8_t vhpt_size_log2; /* Log2 of VHPT size. */
  334. #endif
  335. } xen_domctl_arch_setup_t;
  336. DEFINE_XEN_GUEST_HANDLE(xen_domctl_arch_setup_t);
  337. #define XEN_DOMCTL_settimeoffset 24
  338. struct xen_domctl_settimeoffset {
  339. int32_t time_offset_seconds; /* applied to domain wallclock time */
  340. };
  341. typedef struct xen_domctl_settimeoffset xen_domctl_settimeoffset_t;
  342. DEFINE_XEN_GUEST_HANDLE(xen_domctl_settimeoffset_t);
  343. #define XEN_DOMCTL_gethvmcontext 33
  344. #define XEN_DOMCTL_sethvmcontext 34
  345. typedef struct xen_domctl_hvmcontext {
  346. uint32_t size; /* IN/OUT: size of buffer / bytes filled */
  347. XEN_GUEST_HANDLE_64(uint8) buffer; /* IN/OUT: data, or call
  348. * gethvmcontext with NULL
  349. * buffer to get size req'd */
  350. } xen_domctl_hvmcontext_t;
  351. DEFINE_XEN_GUEST_HANDLE(xen_domctl_hvmcontext_t);
  352. #define XEN_DOMCTL_set_address_size 35
  353. #define XEN_DOMCTL_get_address_size 36
  354. typedef struct xen_domctl_address_size {
  355. uint32_t size;
  356. } xen_domctl_address_size_t;
  357. DEFINE_XEN_GUEST_HANDLE(xen_domctl_address_size_t);
  358. #define XEN_DOMCTL_real_mode_area 26
  359. struct xen_domctl_real_mode_area {
  360. uint32_t log; /* log2 of Real Mode Area size */
  361. };
  362. typedef struct xen_domctl_real_mode_area xen_domctl_real_mode_area_t;
  363. DEFINE_XEN_GUEST_HANDLE(xen_domctl_real_mode_area_t);
  364. #define XEN_DOMCTL_sendtrigger 28
  365. #define XEN_DOMCTL_SENDTRIGGER_NMI 0
  366. #define XEN_DOMCTL_SENDTRIGGER_RESET 1
  367. #define XEN_DOMCTL_SENDTRIGGER_INIT 2
  368. struct xen_domctl_sendtrigger {
  369. uint32_t trigger; /* IN */
  370. uint32_t vcpu; /* IN */
  371. };
  372. typedef struct xen_domctl_sendtrigger xen_domctl_sendtrigger_t;
  373. DEFINE_XEN_GUEST_HANDLE(xen_domctl_sendtrigger_t);
  374. /* Assign PCI device to HVM guest. Sets up IOMMU structures. */
  375. #define XEN_DOMCTL_assign_device 37
  376. #define XEN_DOMCTL_test_assign_device 45
  377. #define XEN_DOMCTL_deassign_device 47
  378. struct xen_domctl_assign_device {
  379. uint32_t machine_bdf; /* machine PCI ID of assigned device */
  380. };
  381. typedef struct xen_domctl_assign_device xen_domctl_assign_device_t;
  382. DEFINE_XEN_GUEST_HANDLE(xen_domctl_assign_device_t);
  383. /* Retrieve sibling devices infomation of machine_bdf */
  384. #define XEN_DOMCTL_get_device_group 50
  385. struct xen_domctl_get_device_group {
  386. uint32_t machine_bdf; /* IN */
  387. uint32_t max_sdevs; /* IN */
  388. uint32_t num_sdevs; /* OUT */
  389. XEN_GUEST_HANDLE_64(uint32) sdev_array; /* OUT */
  390. };
  391. typedef struct xen_domctl_get_device_group xen_domctl_get_device_group_t;
  392. DEFINE_XEN_GUEST_HANDLE(xen_domctl_get_device_group_t);
  393. /* Pass-through interrupts: bind real irq -> hvm devfn. */
  394. #define XEN_DOMCTL_bind_pt_irq 38
  395. #define XEN_DOMCTL_unbind_pt_irq 48
  396. typedef enum pt_irq_type_e {
  397. PT_IRQ_TYPE_PCI,
  398. PT_IRQ_TYPE_ISA,
  399. PT_IRQ_TYPE_MSI,
  400. } pt_irq_type_t;
  401. struct xen_domctl_bind_pt_irq {
  402. uint32_t machine_irq;
  403. pt_irq_type_t irq_type;
  404. uint32_t hvm_domid;
  405. union {
  406. struct {
  407. uint8_t isa_irq;
  408. } isa;
  409. struct {
  410. uint8_t bus;
  411. uint8_t device;
  412. uint8_t intx;
  413. } pci;
  414. struct {
  415. uint8_t gvec;
  416. uint32_t gflags;
  417. } msi;
  418. } u;
  419. };
  420. typedef struct xen_domctl_bind_pt_irq xen_domctl_bind_pt_irq_t;
  421. DEFINE_XEN_GUEST_HANDLE(xen_domctl_bind_pt_irq_t);
  422. /* Bind machine I/O address range -> HVM address range. */
  423. #define XEN_DOMCTL_memory_mapping 39
  424. #define DPCI_ADD_MAPPING 1
  425. #define DPCI_REMOVE_MAPPING 0
  426. struct xen_domctl_memory_mapping {
  427. uint64_aligned_t first_gfn; /* first page (hvm guest phys page) in range */
  428. uint64_aligned_t first_mfn; /* first page (machine page) in range */
  429. uint64_aligned_t nr_mfns; /* number of pages in range (>0) */
  430. uint32_t add_mapping; /* add or remove mapping */
  431. uint32_t padding; /* padding for 64-bit aligned structure */
  432. };
  433. typedef struct xen_domctl_memory_mapping xen_domctl_memory_mapping_t;
  434. DEFINE_XEN_GUEST_HANDLE(xen_domctl_memory_mapping_t);
  435. /* Bind machine I/O port range -> HVM I/O port range. */
  436. #define XEN_DOMCTL_ioport_mapping 40
  437. struct xen_domctl_ioport_mapping {
  438. uint32_t first_gport; /* first guest IO port*/
  439. uint32_t first_mport; /* first machine IO port */
  440. uint32_t nr_ports; /* size of port range */
  441. uint32_t add_mapping; /* add or remove mapping */
  442. };
  443. typedef struct xen_domctl_ioport_mapping xen_domctl_ioport_mapping_t;
  444. DEFINE_XEN_GUEST_HANDLE(xen_domctl_ioport_mapping_t);
  445. /*
  446. * Pin caching type of RAM space for x86 HVM domU.
  447. */
  448. #define XEN_DOMCTL_pin_mem_cacheattr 41
  449. /* Caching types: these happen to be the same as x86 MTRR/PAT type codes. */
  450. #define XEN_DOMCTL_MEM_CACHEATTR_UC 0
  451. #define XEN_DOMCTL_MEM_CACHEATTR_WC 1
  452. #define XEN_DOMCTL_MEM_CACHEATTR_WT 4
  453. #define XEN_DOMCTL_MEM_CACHEATTR_WP 5
  454. #define XEN_DOMCTL_MEM_CACHEATTR_WB 6
  455. #define XEN_DOMCTL_MEM_CACHEATTR_UCM 7
  456. struct xen_domctl_pin_mem_cacheattr {
  457. uint64_aligned_t start, end;
  458. unsigned int type; /* XEN_DOMCTL_MEM_CACHEATTR_* */
  459. };
  460. typedef struct xen_domctl_pin_mem_cacheattr xen_domctl_pin_mem_cacheattr_t;
  461. DEFINE_XEN_GUEST_HANDLE(xen_domctl_pin_mem_cacheattr_t);
  462. #define XEN_DOMCTL_set_ext_vcpucontext 42
  463. #define XEN_DOMCTL_get_ext_vcpucontext 43
  464. struct xen_domctl_ext_vcpucontext {
  465. /* IN: VCPU that this call applies to. */
  466. uint32_t vcpu;
  467. /*
  468. * SET: Size of struct (IN)
  469. * GET: Size of struct (OUT)
  470. */
  471. uint32_t size;
  472. #if defined(__i386__) || defined(__x86_64__)
  473. /* SYSCALL from 32-bit mode and SYSENTER callback information. */
  474. /* NB. SYSCALL from 64-bit mode is contained in vcpu_guest_context_t */
  475. uint64_aligned_t syscall32_callback_eip;
  476. uint64_aligned_t sysenter_callback_eip;
  477. uint16_t syscall32_callback_cs;
  478. uint16_t sysenter_callback_cs;
  479. uint8_t syscall32_disables_events;
  480. uint8_t sysenter_disables_events;
  481. #endif
  482. };
  483. typedef struct xen_domctl_ext_vcpucontext xen_domctl_ext_vcpucontext_t;
  484. DEFINE_XEN_GUEST_HANDLE(xen_domctl_ext_vcpucontext_t);
  485. /*
  486. * Set optimizaton features for a domain
  487. */
  488. #define XEN_DOMCTL_set_opt_feature 44
  489. struct xen_domctl_set_opt_feature {
  490. #if defined(__ia64__)
  491. struct xen_ia64_opt_feature optf;
  492. #else
  493. /* Make struct non-empty: do not depend on this field name! */
  494. uint64_t dummy;
  495. #endif
  496. };
  497. typedef struct xen_domctl_set_opt_feature xen_domctl_set_opt_feature_t;
  498. DEFINE_XEN_GUEST_HANDLE(xen_domctl_set_opt_feature_t);
  499. /*
  500. * Set the target domain for a domain
  501. */
  502. #define XEN_DOMCTL_set_target 46
  503. struct xen_domctl_set_target {
  504. domid_t target;
  505. };
  506. typedef struct xen_domctl_set_target xen_domctl_set_target_t;
  507. DEFINE_XEN_GUEST_HANDLE(xen_domctl_set_target_t);
  508. #if defined(__i386__) || defined(__x86_64__)
  509. # define XEN_CPUID_INPUT_UNUSED 0xFFFFFFFF
  510. # define XEN_DOMCTL_set_cpuid 49
  511. struct xen_domctl_cpuid {
  512. unsigned int input[2];
  513. unsigned int eax;
  514. unsigned int ebx;
  515. unsigned int ecx;
  516. unsigned int edx;
  517. };
  518. typedef struct xen_domctl_cpuid xen_domctl_cpuid_t;
  519. DEFINE_XEN_GUEST_HANDLE(xen_domctl_cpuid_t);
  520. #endif
  521. #define XEN_DOMCTL_subscribe 29
  522. struct xen_domctl_subscribe {
  523. uint32_t port; /* IN */
  524. };
  525. typedef struct xen_domctl_subscribe xen_domctl_subscribe_t;
  526. DEFINE_XEN_GUEST_HANDLE(xen_domctl_subscribe_t);
  527. /*
  528. * Define the maximum machine address size which should be allocated
  529. * to a guest.
  530. */
  531. #define XEN_DOMCTL_set_machine_address_size 51
  532. #define XEN_DOMCTL_get_machine_address_size 52
  533. /*
  534. * Do not inject spurious page faults into this domain.
  535. */
  536. #define XEN_DOMCTL_suppress_spurious_page_faults 53
  537. struct xen_domctl {
  538. uint32_t cmd;
  539. uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */
  540. domid_t domain;
  541. union {
  542. struct xen_domctl_createdomain createdomain;
  543. struct xen_domctl_getdomaininfo getdomaininfo;
  544. struct xen_domctl_getmemlist getmemlist;
  545. struct xen_domctl_getpageframeinfo getpageframeinfo;
  546. struct xen_domctl_getpageframeinfo2 getpageframeinfo2;
  547. struct xen_domctl_vcpuaffinity vcpuaffinity;
  548. struct xen_domctl_shadow_op shadow_op;
  549. struct xen_domctl_max_mem max_mem;
  550. struct xen_domctl_vcpucontext vcpucontext;
  551. struct xen_domctl_getvcpuinfo getvcpuinfo;
  552. struct xen_domctl_max_vcpus max_vcpus;
  553. struct xen_domctl_scheduler_op scheduler_op;
  554. struct xen_domctl_setdomainhandle setdomainhandle;
  555. struct xen_domctl_setdebugging setdebugging;
  556. struct xen_domctl_irq_permission irq_permission;
  557. struct xen_domctl_iomem_permission iomem_permission;
  558. struct xen_domctl_ioport_permission ioport_permission;
  559. struct xen_domctl_hypercall_init hypercall_init;
  560. struct xen_domctl_arch_setup arch_setup;
  561. struct xen_domctl_settimeoffset settimeoffset;
  562. struct xen_domctl_real_mode_area real_mode_area;
  563. struct xen_domctl_hvmcontext hvmcontext;
  564. struct xen_domctl_address_size address_size;
  565. struct xen_domctl_sendtrigger sendtrigger;
  566. struct xen_domctl_get_device_group get_device_group;
  567. struct xen_domctl_assign_device assign_device;
  568. struct xen_domctl_bind_pt_irq bind_pt_irq;
  569. struct xen_domctl_memory_mapping memory_mapping;
  570. struct xen_domctl_ioport_mapping ioport_mapping;
  571. struct xen_domctl_pin_mem_cacheattr pin_mem_cacheattr;
  572. struct xen_domctl_ext_vcpucontext ext_vcpucontext;
  573. struct xen_domctl_set_opt_feature set_opt_feature;
  574. struct xen_domctl_set_target set_target;
  575. struct xen_domctl_subscribe subscribe;
  576. #if defined(__i386__) || defined(__x86_64__)
  577. struct xen_domctl_cpuid cpuid;
  578. #endif
  579. uint8_t pad[128];
  580. } u;
  581. };
  582. typedef struct xen_domctl xen_domctl_t;
  583. DEFINE_XEN_GUEST_HANDLE(xen_domctl_t);
  584. #endif /* __XEN_PUBLIC_DOMCTL_H__ */
  585. /*
  586. * Local variables:
  587. * mode: C
  588. * c-set-style: "BSD"
  589. * c-basic-offset: 4
  590. * tab-width: 4
  591. * indent-tabs-mode: nil
  592. * End:
  593. */