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