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