interface.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. /******************************************************************************
  2. * arch-ia64/hypervisor-if.h
  3. *
  4. * Guest OS interface to IA64 Xen.
  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 by those who contributed. (in alphabetical order)
  25. *
  26. * Anthony Xu <anthony.xu@intel.com>
  27. * Eddie Dong <eddie.dong@intel.com>
  28. * Fred Yang <fred.yang@intel.com>
  29. * Kevin Tian <kevin.tian@intel.com>
  30. * Alex Williamson <alex.williamson@hp.com>
  31. * Chris Wright <chrisw@sous-sol.org>
  32. * Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
  33. * Dietmar Hahn <dietmar.hahn@fujitsu-siemens.com>
  34. * Hollis Blanchard <hollisb@us.ibm.com>
  35. * Isaku Yamahata <yamahata@valinux.co.jp>
  36. * Jan Beulich <jbeulich@novell.com>
  37. * John Levon <john.levon@sun.com>
  38. * Kazuhiro Suzuki <kaz@jp.fujitsu.com>
  39. * Keir Fraser <keir.fraser@citrix.com>
  40. * Kouya Shimura <kouya@jp.fujitsu.com>
  41. * Masaki Kanno <kanno.masaki@jp.fujitsu.com>
  42. * Matt Chapman <matthewc@hp.com>
  43. * Matthew Chapman <matthewc@hp.com>
  44. * Samuel Thibault <samuel.thibault@eu.citrix.com>
  45. * Tomonari Horikoshi <t.horikoshi@jp.fujitsu.com>
  46. * Tristan Gingold <tgingold@free.fr>
  47. * Tsunehisa Doi <Doi.Tsunehisa@jp.fujitsu.com>
  48. * Yutaka Ezaki <yutaka.ezaki@jp.fujitsu.com>
  49. * Zhang Xin <xing.z.zhang@intel.com>
  50. * Zhang xiantao <xiantao.zhang@intel.com>
  51. * dan.magenheimer@hp.com
  52. * ian.pratt@cl.cam.ac.uk
  53. * michael.fetterman@cl.cam.ac.uk
  54. */
  55. #ifndef _ASM_IA64_XEN_INTERFACE_H
  56. #define _ASM_IA64_XEN_INTERFACE_H
  57. #define __DEFINE_GUEST_HANDLE(name, type) \
  58. typedef struct { type *p; } __guest_handle_ ## name
  59. #define DEFINE_GUEST_HANDLE_STRUCT(name) \
  60. __DEFINE_GUEST_HANDLE(name, struct name)
  61. #define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name)
  62. #define GUEST_HANDLE(name) __guest_handle_ ## name
  63. #define GUEST_HANDLE_64(name) GUEST_HANDLE(name)
  64. #define set_xen_guest_handle(hnd, val) do { (hnd).p = val; } while (0)
  65. #ifndef __ASSEMBLY__
  66. /* Explicitly size integers that represent pfns in the public interface
  67. * with Xen so that we could have one ABI that works for 32 and 64 bit
  68. * guests. */
  69. typedef unsigned long xen_pfn_t;
  70. /* Guest handles for primitive C types. */
  71. __DEFINE_GUEST_HANDLE(uchar, unsigned char);
  72. __DEFINE_GUEST_HANDLE(uint, unsigned int);
  73. __DEFINE_GUEST_HANDLE(ulong, unsigned long);
  74. DEFINE_GUEST_HANDLE(char);
  75. DEFINE_GUEST_HANDLE(int);
  76. DEFINE_GUEST_HANDLE(long);
  77. DEFINE_GUEST_HANDLE(void);
  78. DEFINE_GUEST_HANDLE(uint64_t);
  79. DEFINE_GUEST_HANDLE(uint32_t);
  80. DEFINE_GUEST_HANDLE(xen_pfn_t);
  81. #define PRI_xen_pfn "lx"
  82. #endif
  83. /* Arch specific VIRQs definition */
  84. #define VIRQ_ITC VIRQ_ARCH_0 /* V. Virtual itc timer */
  85. #define VIRQ_MCA_CMC VIRQ_ARCH_1 /* MCA cmc interrupt */
  86. #define VIRQ_MCA_CPE VIRQ_ARCH_2 /* MCA cpe interrupt */
  87. /* Maximum number of virtual CPUs in multi-processor guests. */
  88. /* keep sizeof(struct shared_page) <= PAGE_SIZE.
  89. * this is checked in arch/ia64/xen/hypervisor.c. */
  90. #define MAX_VIRT_CPUS 64
  91. #ifndef __ASSEMBLY__
  92. #define INVALID_MFN (~0UL)
  93. union vac {
  94. unsigned long value;
  95. struct {
  96. int a_int:1;
  97. int a_from_int_cr:1;
  98. int a_to_int_cr:1;
  99. int a_from_psr:1;
  100. int a_from_cpuid:1;
  101. int a_cover:1;
  102. int a_bsw:1;
  103. long reserved:57;
  104. };
  105. };
  106. union vdc {
  107. unsigned long value;
  108. struct {
  109. int d_vmsw:1;
  110. int d_extint:1;
  111. int d_ibr_dbr:1;
  112. int d_pmc:1;
  113. int d_to_pmd:1;
  114. int d_itm:1;
  115. long reserved:58;
  116. };
  117. };
  118. struct mapped_regs {
  119. union vac vac;
  120. union vdc vdc;
  121. unsigned long virt_env_vaddr;
  122. unsigned long reserved1[29];
  123. unsigned long vhpi;
  124. unsigned long reserved2[95];
  125. union {
  126. unsigned long vgr[16];
  127. unsigned long bank1_regs[16]; /* bank1 regs (r16-r31)
  128. when bank0 active */
  129. };
  130. union {
  131. unsigned long vbgr[16];
  132. unsigned long bank0_regs[16]; /* bank0 regs (r16-r31)
  133. when bank1 active */
  134. };
  135. unsigned long vnat;
  136. unsigned long vbnat;
  137. unsigned long vcpuid[5];
  138. unsigned long reserved3[11];
  139. unsigned long vpsr;
  140. unsigned long vpr;
  141. unsigned long reserved4[76];
  142. union {
  143. unsigned long vcr[128];
  144. struct {
  145. unsigned long dcr; /* CR0 */
  146. unsigned long itm;
  147. unsigned long iva;
  148. unsigned long rsv1[5];
  149. unsigned long pta; /* CR8 */
  150. unsigned long rsv2[7];
  151. unsigned long ipsr; /* CR16 */
  152. unsigned long isr;
  153. unsigned long rsv3;
  154. unsigned long iip;
  155. unsigned long ifa;
  156. unsigned long itir;
  157. unsigned long iipa;
  158. unsigned long ifs;
  159. unsigned long iim; /* CR24 */
  160. unsigned long iha;
  161. unsigned long rsv4[38];
  162. unsigned long lid; /* CR64 */
  163. unsigned long ivr;
  164. unsigned long tpr;
  165. unsigned long eoi;
  166. unsigned long irr[4];
  167. unsigned long itv; /* CR72 */
  168. unsigned long pmv;
  169. unsigned long cmcv;
  170. unsigned long rsv5[5];
  171. unsigned long lrr0; /* CR80 */
  172. unsigned long lrr1;
  173. unsigned long rsv6[46];
  174. };
  175. };
  176. union {
  177. unsigned long reserved5[128];
  178. struct {
  179. unsigned long precover_ifs;
  180. unsigned long unat; /* not sure if this is needed
  181. until NaT arch is done */
  182. int interrupt_collection_enabled; /* virtual psr.ic */
  183. /* virtual interrupt deliverable flag is
  184. * evtchn_upcall_mask in shared info area now.
  185. * interrupt_mask_addr is the address
  186. * of evtchn_upcall_mask for current vcpu
  187. */
  188. unsigned char *interrupt_mask_addr;
  189. int pending_interruption;
  190. unsigned char vpsr_pp;
  191. unsigned char vpsr_dfh;
  192. unsigned char hpsr_dfh;
  193. unsigned char hpsr_mfh;
  194. unsigned long reserved5_1[4];
  195. int metaphysical_mode; /* 1 = use metaphys mapping
  196. 0 = use virtual */
  197. int banknum; /* 0 or 1, which virtual
  198. register bank is active */
  199. unsigned long rrs[8]; /* region registers */
  200. unsigned long krs[8]; /* kernel registers */
  201. unsigned long tmp[16]; /* temp registers
  202. (e.g. for hyperprivops) */
  203. /* itc paravirtualization
  204. * vAR.ITC = mAR.ITC + itc_offset
  205. * itc_last is one which was lastly passed to
  206. * the guest OS in order to prevent it from
  207. * going backwords.
  208. */
  209. unsigned long itc_offset;
  210. unsigned long itc_last;
  211. };
  212. };
  213. };
  214. struct arch_vcpu_info {
  215. /* nothing */
  216. };
  217. /*
  218. * This structure is used for magic page in domain pseudo physical address
  219. * space and the result of XENMEM_machine_memory_map.
  220. * As the XENMEM_machine_memory_map result,
  221. * xen_memory_map::nr_entries indicates the size in bytes
  222. * including struct xen_ia64_memmap_info. Not the number of entries.
  223. */
  224. struct xen_ia64_memmap_info {
  225. uint64_t efi_memmap_size; /* size of EFI memory map */
  226. uint64_t efi_memdesc_size; /* size of an EFI memory map
  227. * descriptor */
  228. uint32_t efi_memdesc_version; /* memory descriptor version */
  229. void *memdesc[0]; /* array of efi_memory_desc_t */
  230. };
  231. struct arch_shared_info {
  232. /* PFN of the start_info page. */
  233. unsigned long start_info_pfn;
  234. /* Interrupt vector for event channel. */
  235. int evtchn_vector;
  236. /* PFN of memmap_info page */
  237. unsigned int memmap_info_num_pages; /* currently only = 1 case is
  238. supported. */
  239. unsigned long memmap_info_pfn;
  240. uint64_t pad[31];
  241. };
  242. struct xen_callback {
  243. unsigned long ip;
  244. };
  245. typedef struct xen_callback xen_callback_t;
  246. #endif /* !__ASSEMBLY__ */
  247. #include <asm/pvclock-abi.h>
  248. /* Size of the shared_info area (this is not related to page size). */
  249. #define XSI_SHIFT 14
  250. #define XSI_SIZE (1 << XSI_SHIFT)
  251. /* Log size of mapped_regs area (64 KB - only 4KB is used). */
  252. #define XMAPPEDREGS_SHIFT 12
  253. #define XMAPPEDREGS_SIZE (1 << XMAPPEDREGS_SHIFT)
  254. /* Offset of XASI (Xen arch shared info) wrt XSI_BASE. */
  255. #define XMAPPEDREGS_OFS XSI_SIZE
  256. /* Hyperprivops. */
  257. #define HYPERPRIVOP_START 0x1
  258. #define HYPERPRIVOP_RFI (HYPERPRIVOP_START + 0x0)
  259. #define HYPERPRIVOP_RSM_DT (HYPERPRIVOP_START + 0x1)
  260. #define HYPERPRIVOP_SSM_DT (HYPERPRIVOP_START + 0x2)
  261. #define HYPERPRIVOP_COVER (HYPERPRIVOP_START + 0x3)
  262. #define HYPERPRIVOP_ITC_D (HYPERPRIVOP_START + 0x4)
  263. #define HYPERPRIVOP_ITC_I (HYPERPRIVOP_START + 0x5)
  264. #define HYPERPRIVOP_SSM_I (HYPERPRIVOP_START + 0x6)
  265. #define HYPERPRIVOP_GET_IVR (HYPERPRIVOP_START + 0x7)
  266. #define HYPERPRIVOP_GET_TPR (HYPERPRIVOP_START + 0x8)
  267. #define HYPERPRIVOP_SET_TPR (HYPERPRIVOP_START + 0x9)
  268. #define HYPERPRIVOP_EOI (HYPERPRIVOP_START + 0xa)
  269. #define HYPERPRIVOP_SET_ITM (HYPERPRIVOP_START + 0xb)
  270. #define HYPERPRIVOP_THASH (HYPERPRIVOP_START + 0xc)
  271. #define HYPERPRIVOP_PTC_GA (HYPERPRIVOP_START + 0xd)
  272. #define HYPERPRIVOP_ITR_D (HYPERPRIVOP_START + 0xe)
  273. #define HYPERPRIVOP_GET_RR (HYPERPRIVOP_START + 0xf)
  274. #define HYPERPRIVOP_SET_RR (HYPERPRIVOP_START + 0x10)
  275. #define HYPERPRIVOP_SET_KR (HYPERPRIVOP_START + 0x11)
  276. #define HYPERPRIVOP_FC (HYPERPRIVOP_START + 0x12)
  277. #define HYPERPRIVOP_GET_CPUID (HYPERPRIVOP_START + 0x13)
  278. #define HYPERPRIVOP_GET_PMD (HYPERPRIVOP_START + 0x14)
  279. #define HYPERPRIVOP_GET_EFLAG (HYPERPRIVOP_START + 0x15)
  280. #define HYPERPRIVOP_SET_EFLAG (HYPERPRIVOP_START + 0x16)
  281. #define HYPERPRIVOP_RSM_BE (HYPERPRIVOP_START + 0x17)
  282. #define HYPERPRIVOP_GET_PSR (HYPERPRIVOP_START + 0x18)
  283. #define HYPERPRIVOP_SET_RR0_TO_RR4 (HYPERPRIVOP_START + 0x19)
  284. #define HYPERPRIVOP_MAX (0x1a)
  285. /* Fast and light hypercalls. */
  286. #define __HYPERVISOR_ia64_fast_eoi __HYPERVISOR_arch_1
  287. /* Xencomm macros. */
  288. #define XENCOMM_INLINE_MASK 0xf800000000000000UL
  289. #define XENCOMM_INLINE_FLAG 0x8000000000000000UL
  290. #ifndef __ASSEMBLY__
  291. /*
  292. * Optimization features.
  293. * The hypervisor may do some special optimizations for guests. This hypercall
  294. * can be used to switch on/of these special optimizations.
  295. */
  296. #define __HYPERVISOR_opt_feature 0x700UL
  297. #define XEN_IA64_OPTF_OFF 0x0
  298. #define XEN_IA64_OPTF_ON 0x1
  299. /*
  300. * If this feature is switched on, the hypervisor inserts the
  301. * tlb entries without calling the guests traphandler.
  302. * This is useful in guests using region 7 for identity mapping
  303. * like the linux kernel does.
  304. */
  305. #define XEN_IA64_OPTF_IDENT_MAP_REG7 1
  306. /* Identity mapping of region 4 addresses in HVM. */
  307. #define XEN_IA64_OPTF_IDENT_MAP_REG4 2
  308. /* Identity mapping of region 5 addresses in HVM. */
  309. #define XEN_IA64_OPTF_IDENT_MAP_REG5 3
  310. #define XEN_IA64_OPTF_IDENT_MAP_NOT_SET (0)
  311. struct xen_ia64_opt_feature {
  312. unsigned long cmd; /* Which feature */
  313. unsigned char on; /* Switch feature on/off */
  314. union {
  315. struct {
  316. /* The page protection bit mask of the pte.
  317. * This will be or'ed with the pte. */
  318. unsigned long pgprot;
  319. unsigned long key; /* A protection key for itir.*/
  320. };
  321. };
  322. };
  323. #endif /* __ASSEMBLY__ */
  324. #endif /* _ASM_IA64_XEN_INTERFACE_H */