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); 75 DEFINE_GUEST_HANDLE(char); 76 DEFINE_GUEST_HANDLE(int); 77 DEFINE_GUEST_HANDLE(long); 78 DEFINE_GUEST_HANDLE(void); 79 80 typedef unsigned long xen_pfn_t; 81 DEFINE_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 99 union 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 113 union 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 126 struct 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 225 struct 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 */ 236 struct 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 244 struct 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 259 struct xen_callback { 260 unsigned long ip; 261 }; 262 typedef 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 340 struct 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