Isaku Yamahata | ffcc99e | 2008-10-17 11:17:48 +0900 | [diff] [blame] | 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); |
Luck, Tony | 4313d88 | 2011-11-30 10:22:37 -0800 | [diff] [blame] | 74 | |
Isaku Yamahata | ffcc99e | 2008-10-17 11:17:48 +0900 | [diff] [blame] | 75 | DEFINE_GUEST_HANDLE(char); |
| 76 | DEFINE_GUEST_HANDLE(int); |
| 77 | DEFINE_GUEST_HANDLE(long); |
| 78 | DEFINE_GUEST_HANDLE(void); |
Yu Ke | 3e09967 | 2010-03-24 11:01:13 -0700 | [diff] [blame] | 79 | DEFINE_GUEST_HANDLE(uint64_t); |
Konrad Rzeszutek Wilk | 73c154c | 2012-02-13 22:26:32 -0500 | [diff] [blame^] | 80 | DEFINE_GUEST_HANDLE(uint32_t); |
Isaku Yamahata | ffcc99e | 2008-10-17 11:17:48 +0900 | [diff] [blame] | 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) */ |
Isaku Yamahata | 496203b | 2009-03-04 21:05:39 +0900 | [diff] [blame] | 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; |
Isaku Yamahata | ffcc99e | 2008-10-17 11:17:48 +0900 | [diff] [blame] | 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 */ |