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 56#ifndef _ASM_IA64_XEN_INTERFACE_H 57#define _ASM_IA64_XEN_INTERFACE_H 58 59#define __DEFINE_GUEST_HANDLE(name, type) \ 60 typedef struct { type *p; } __guest_handle_ ## name 61 62#define DEFINE_GUEST_HANDLE_STRUCT(name) \ 63 __DEFINE_GUEST_HANDLE(name, struct name) 64#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) 65#define GUEST_HANDLE(name) __guest_handle_ ## name 66#define GUEST_HANDLE_64(name) GUEST_HANDLE(name) 67#define set_xen_guest_handle(hnd, val) do { (hnd).p = val; } while (0) 68 69#ifndef __ASSEMBLY__ 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(u64, unsigned long); 75DEFINE_GUEST_HANDLE(char); 76DEFINE_GUEST_HANDLE(int); 77DEFINE_GUEST_HANDLE(long); 78DEFINE_GUEST_HANDLE(void); 79 80typedef unsigned long xen_pfn_t; 81DEFINE_GUEST_HANDLE(xen_pfn_t); 82#define PRI_xen_pfn "lx" 83#endif 84 85/* Arch specific VIRQs definition */ 86#define VIRQ_ITC VIRQ_ARCH_0 /* V. Virtual itc timer */ 87#define VIRQ_MCA_CMC VIRQ_ARCH_1 /* MCA cmc interrupt */ 88#define VIRQ_MCA_CPE VIRQ_ARCH_2 /* MCA cpe interrupt */ 89 90/* Maximum number of virtual CPUs in multi-processor guests. */ 91/* keep sizeof(struct shared_page) <= PAGE_SIZE. 92 * this is checked in arch/ia64/xen/hypervisor.c. */ 93#define MAX_VIRT_CPUS 64 94 95#ifndef __ASSEMBLY__ 96 97#define INVALID_MFN (~0UL) 98 99union vac { 100 unsigned long value; 101 struct { 102 int a_int:1; 103 int a_from_int_cr:1; 104 int a_to_int_cr:1; 105 int a_from_psr:1; 106 int a_from_cpuid:1; 107 int a_cover:1; 108 int a_bsw:1; 109 long reserved:57; 110 }; 111}; 112 113union vdc { 114 unsigned long value; 115 struct { 116 int d_vmsw:1; 117 int d_extint:1; 118 int d_ibr_dbr:1; 119 int d_pmc:1; 120 int d_to_pmd:1; 121 int d_itm:1; 122 long reserved:58; 123 }; 124}; 125 126struct mapped_regs { 127 union vac vac; 128 union vdc vdc; 129 unsigned long virt_env_vaddr; 130 unsigned long reserved1[29]; 131 unsigned long vhpi; 132 unsigned long reserved2[95]; 133 union { 134 unsigned long vgr[16]; 135 unsigned long bank1_regs[16]; /* bank1 regs (r16-r31) 136 when bank0 active */ 137 }; 138 union { 139 unsigned long vbgr[16]; 140 unsigned long bank0_regs[16]; /* bank0 regs (r16-r31) 141 when bank1 active */ 142 }; 143 unsigned long vnat; 144 unsigned long vbnat; 145 unsigned long vcpuid[5]; 146 unsigned long reserved3[11]; 147 unsigned long vpsr; 148 unsigned long vpr; 149 unsigned long reserved4[76]; 150 union { 151 unsigned long vcr[128]; 152 struct { 153 unsigned long dcr; /* CR0 */ 154 unsigned long itm; 155 unsigned long iva; 156 unsigned long rsv1[5]; 157 unsigned long pta; /* CR8 */ 158 unsigned long rsv2[7]; 159 unsigned long ipsr; /* CR16 */ 160 unsigned long isr; 161 unsigned long rsv3; 162 unsigned long iip; 163 unsigned long ifa; 164 unsigned long itir; 165 unsigned long iipa; 166 unsigned long ifs; 167 unsigned long iim; /* CR24 */ 168 unsigned long iha; 169 unsigned long rsv4[38]; 170 unsigned long lid; /* CR64 */ 171 unsigned long ivr; 172 unsigned long tpr; 173 unsigned long eoi; 174 unsigned long irr[4]; 175 unsigned long itv; /* CR72 */ 176 unsigned long pmv; 177 unsigned long cmcv; 178 unsigned long rsv5[5]; 179 unsigned long lrr0; /* CR80 */ 180 unsigned long lrr1; 181 unsigned long rsv6[46]; 182 }; 183 }; 184 union { 185 unsigned long reserved5[128]; 186 struct { 187 unsigned long precover_ifs; 188 unsigned long unat; /* not sure if this is needed 189 until NaT arch is done */ 190 int interrupt_collection_enabled; /* virtual psr.ic */ 191 192 /* virtual interrupt deliverable flag is 193 * evtchn_upcall_mask in shared info area now. 194 * interrupt_mask_addr is the address 195 * of evtchn_upcall_mask for current vcpu 196 */ 197 unsigned char *interrupt_mask_addr; 198 int pending_interruption; 199 unsigned char vpsr_pp; 200 unsigned char vpsr_dfh; 201 unsigned char hpsr_dfh; 202 unsigned char hpsr_mfh; 203 unsigned long reserved5_1[4]; 204 int metaphysical_mode; /* 1 = use metaphys mapping 205 0 = use virtual */ 206 int banknum; /* 0 or 1, which virtual 207 register bank is active */ 208 unsigned long rrs[8]; /* region registers */ 209 unsigned long krs[8]; /* kernel registers */ 210 unsigned long tmp[16]; /* temp registers 211 (e.g. for hyperprivops) */ 212 213 /* itc paravirtualization 214 * vAR.ITC = mAR.ITC + itc_offset 215 * itc_last is one which was lastly passed to 216 * the guest OS in order to prevent it from 217 * going backwords. 218 */ 219 unsigned long itc_offset; 220 unsigned long itc_last; 221 }; 222 }; 223}; 224 225struct arch_vcpu_info { 226 /* nothing */ 227}; 228 229/* 230 * This structure is used for magic page in domain pseudo physical address 231 * space and the result of XENMEM_machine_memory_map. 232 * As the XENMEM_machine_memory_map result, 233 * xen_memory_map::nr_entries indicates the size in bytes 234 * including struct xen_ia64_memmap_info. Not the number of entries. 235 */ 236struct xen_ia64_memmap_info { 237 uint64_t efi_memmap_size; /* size of EFI memory map */ 238 uint64_t efi_memdesc_size; /* size of an EFI memory map 239 * descriptor */ 240 uint32_t efi_memdesc_version; /* memory descriptor version */ 241 void *memdesc[0]; /* array of efi_memory_desc_t */ 242}; 243 244struct arch_shared_info { 245 /* PFN of the start_info page. */ 246 unsigned long start_info_pfn; 247 248 /* Interrupt vector for event channel. */ 249 int evtchn_vector; 250 251 /* PFN of memmap_info page */ 252 unsigned int memmap_info_num_pages; /* currently only = 1 case is 253 supported. */ 254 unsigned long memmap_info_pfn; 255 256 uint64_t pad[31]; 257}; 258 259struct xen_callback { 260 unsigned long ip; 261}; 262typedef struct xen_callback xen_callback_t; 263 264#endif /* !__ASSEMBLY__ */ 265 266/* Size of the shared_info area (this is not related to page size). */ 267#define XSI_SHIFT 14 268#define XSI_SIZE (1 << XSI_SHIFT) 269/* Log size of mapped_regs area (64 KB - only 4KB is used). */ 270#define XMAPPEDREGS_SHIFT 12 271#define XMAPPEDREGS_SIZE (1 << XMAPPEDREGS_SHIFT) 272/* Offset of XASI (Xen arch shared info) wrt XSI_BASE. */ 273#define XMAPPEDREGS_OFS XSI_SIZE 274 275/* Hyperprivops. */ 276#define HYPERPRIVOP_START 0x1 277#define HYPERPRIVOP_RFI (HYPERPRIVOP_START + 0x0) 278#define HYPERPRIVOP_RSM_DT (HYPERPRIVOP_START + 0x1) 279#define HYPERPRIVOP_SSM_DT (HYPERPRIVOP_START + 0x2) 280#define HYPERPRIVOP_COVER (HYPERPRIVOP_START + 0x3) 281#define HYPERPRIVOP_ITC_D (HYPERPRIVOP_START + 0x4) 282#define HYPERPRIVOP_ITC_I (HYPERPRIVOP_START + 0x5) 283#define HYPERPRIVOP_SSM_I (HYPERPRIVOP_START + 0x6) 284#define HYPERPRIVOP_GET_IVR (HYPERPRIVOP_START + 0x7) 285#define HYPERPRIVOP_GET_TPR (HYPERPRIVOP_START + 0x8) 286#define HYPERPRIVOP_SET_TPR (HYPERPRIVOP_START + 0x9) 287#define HYPERPRIVOP_EOI (HYPERPRIVOP_START + 0xa) 288#define HYPERPRIVOP_SET_ITM (HYPERPRIVOP_START + 0xb) 289#define HYPERPRIVOP_THASH (HYPERPRIVOP_START + 0xc) 290#define HYPERPRIVOP_PTC_GA (HYPERPRIVOP_START + 0xd) 291#define HYPERPRIVOP_ITR_D (HYPERPRIVOP_START + 0xe) 292#define HYPERPRIVOP_GET_RR (HYPERPRIVOP_START + 0xf) 293#define HYPERPRIVOP_SET_RR (HYPERPRIVOP_START + 0x10) 294#define HYPERPRIVOP_SET_KR (HYPERPRIVOP_START + 0x11) 295#define HYPERPRIVOP_FC (HYPERPRIVOP_START + 0x12) 296#define HYPERPRIVOP_GET_CPUID (HYPERPRIVOP_START + 0x13) 297#define HYPERPRIVOP_GET_PMD (HYPERPRIVOP_START + 0x14) 298#define HYPERPRIVOP_GET_EFLAG (HYPERPRIVOP_START + 0x15) 299#define HYPERPRIVOP_SET_EFLAG (HYPERPRIVOP_START + 0x16) 300#define HYPERPRIVOP_RSM_BE (HYPERPRIVOP_START + 0x17) 301#define HYPERPRIVOP_GET_PSR (HYPERPRIVOP_START + 0x18) 302#define HYPERPRIVOP_SET_RR0_TO_RR4 (HYPERPRIVOP_START + 0x19) 303#define HYPERPRIVOP_MAX (0x1a) 304 305/* Fast and light hypercalls. */ 306#define __HYPERVISOR_ia64_fast_eoi __HYPERVISOR_arch_1 307 308/* Xencomm macros. */ 309#define XENCOMM_INLINE_MASK 0xf800000000000000UL 310#define XENCOMM_INLINE_FLAG 0x8000000000000000UL 311 312#ifndef __ASSEMBLY__ 313 314/* 315 * Optimization features. 316 * The hypervisor may do some special optimizations for guests. This hypercall 317 * can be used to switch on/of these special optimizations. 318 */ 319#define __HYPERVISOR_opt_feature 0x700UL 320 321#define XEN_IA64_OPTF_OFF 0x0 322#define XEN_IA64_OPTF_ON 0x1 323 324/* 325 * If this feature is switched on, the hypervisor inserts the 326 * tlb entries without calling the guests traphandler. 327 * This is useful in guests using region 7 for identity mapping 328 * like the linux kernel does. 329 */ 330#define XEN_IA64_OPTF_IDENT_MAP_REG7 1 331 332/* Identity mapping of region 4 addresses in HVM. */ 333#define XEN_IA64_OPTF_IDENT_MAP_REG4 2 334 335/* Identity mapping of region 5 addresses in HVM. */ 336#define XEN_IA64_OPTF_IDENT_MAP_REG5 3 337 338#define XEN_IA64_OPTF_IDENT_MAP_NOT_SET (0) 339 340struct xen_ia64_opt_feature { 341 unsigned long cmd; /* Which feature */ 342 unsigned char on; /* Switch feature on/off */ 343 union { 344 struct { 345 /* The page protection bit mask of the pte. 346 * This will be or'ed with the pte. */ 347 unsigned long pgprot; 348 unsigned long key; /* A protection key for itir.*/ 349 }; 350 }; 351}; 352 353#endif /* __ASSEMBLY__ */ 354 355#endif /* _ASM_IA64_XEN_INTERFACE_H */ 356