123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- /******************************************************************************
- * arch-ia64/hypervisor-if.h
- *
- * Guest OS interface to IA64 Xen.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright by those who contributed. (in alphabetical order)
- *
- * Anthony Xu <anthony.xu@intel.com>
- * Eddie Dong <eddie.dong@intel.com>
- * Fred Yang <fred.yang@intel.com>
- * Kevin Tian <kevin.tian@intel.com>
- * Alex Williamson <alex.williamson@hp.com>
- * Chris Wright <chrisw@sous-sol.org>
- * Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
- * Dietmar Hahn <dietmar.hahn@fujitsu-siemens.com>
- * Hollis Blanchard <hollisb@us.ibm.com>
- * Isaku Yamahata <yamahata@valinux.co.jp>
- * Jan Beulich <jbeulich@novell.com>
- * John Levon <john.levon@sun.com>
- * Kazuhiro Suzuki <kaz@jp.fujitsu.com>
- * Keir Fraser <keir.fraser@citrix.com>
- * Kouya Shimura <kouya@jp.fujitsu.com>
- * Masaki Kanno <kanno.masaki@jp.fujitsu.com>
- * Matt Chapman <matthewc@hp.com>
- * Matthew Chapman <matthewc@hp.com>
- * Samuel Thibault <samuel.thibault@eu.citrix.com>
- * Tomonari Horikoshi <t.horikoshi@jp.fujitsu.com>
- * Tristan Gingold <tgingold@free.fr>
- * Tsunehisa Doi <Doi.Tsunehisa@jp.fujitsu.com>
- * Yutaka Ezaki <yutaka.ezaki@jp.fujitsu.com>
- * Zhang Xin <xing.z.zhang@intel.com>
- * Zhang xiantao <xiantao.zhang@intel.com>
- * dan.magenheimer@hp.com
- * ian.pratt@cl.cam.ac.uk
- * michael.fetterman@cl.cam.ac.uk
- */
- #ifndef _ASM_IA64_XEN_INTERFACE_H
- #define _ASM_IA64_XEN_INTERFACE_H
- #define __DEFINE_GUEST_HANDLE(name, type) \
- typedef struct { type *p; } __guest_handle_ ## name
- #define DEFINE_GUEST_HANDLE_STRUCT(name) \
- __DEFINE_GUEST_HANDLE(name, struct name)
- #define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name)
- #define GUEST_HANDLE(name) __guest_handle_ ## name
- #define GUEST_HANDLE_64(name) GUEST_HANDLE(name)
- #define set_xen_guest_handle(hnd, val) do { (hnd).p = val; } while (0)
- #ifndef __ASSEMBLY__
- /* Guest handles for primitive C types. */
- __DEFINE_GUEST_HANDLE(uchar, unsigned char);
- __DEFINE_GUEST_HANDLE(uint, unsigned int);
- __DEFINE_GUEST_HANDLE(ulong, unsigned long);
- DEFINE_GUEST_HANDLE(char);
- DEFINE_GUEST_HANDLE(int);
- DEFINE_GUEST_HANDLE(long);
- DEFINE_GUEST_HANDLE(void);
- DEFINE_GUEST_HANDLE(uint64_t);
- DEFINE_GUEST_HANDLE(uint32_t);
- typedef unsigned long xen_pfn_t;
- DEFINE_GUEST_HANDLE(xen_pfn_t);
- #define PRI_xen_pfn "lx"
- #endif
- /* Arch specific VIRQs definition */
- #define VIRQ_ITC VIRQ_ARCH_0 /* V. Virtual itc timer */
- #define VIRQ_MCA_CMC VIRQ_ARCH_1 /* MCA cmc interrupt */
- #define VIRQ_MCA_CPE VIRQ_ARCH_2 /* MCA cpe interrupt */
- /* Maximum number of virtual CPUs in multi-processor guests. */
- /* keep sizeof(struct shared_page) <= PAGE_SIZE.
- * this is checked in arch/ia64/xen/hypervisor.c. */
- #define MAX_VIRT_CPUS 64
- #ifndef __ASSEMBLY__
- #define INVALID_MFN (~0UL)
- union vac {
- unsigned long value;
- struct {
- int a_int:1;
- int a_from_int_cr:1;
- int a_to_int_cr:1;
- int a_from_psr:1;
- int a_from_cpuid:1;
- int a_cover:1;
- int a_bsw:1;
- long reserved:57;
- };
- };
- union vdc {
- unsigned long value;
- struct {
- int d_vmsw:1;
- int d_extint:1;
- int d_ibr_dbr:1;
- int d_pmc:1;
- int d_to_pmd:1;
- int d_itm:1;
- long reserved:58;
- };
- };
- struct mapped_regs {
- union vac vac;
- union vdc vdc;
- unsigned long virt_env_vaddr;
- unsigned long reserved1[29];
- unsigned long vhpi;
- unsigned long reserved2[95];
- union {
- unsigned long vgr[16];
- unsigned long bank1_regs[16]; /* bank1 regs (r16-r31)
- when bank0 active */
- };
- union {
- unsigned long vbgr[16];
- unsigned long bank0_regs[16]; /* bank0 regs (r16-r31)
- when bank1 active */
- };
- unsigned long vnat;
- unsigned long vbnat;
- unsigned long vcpuid[5];
- unsigned long reserved3[11];
- unsigned long vpsr;
- unsigned long vpr;
- unsigned long reserved4[76];
- union {
- unsigned long vcr[128];
- struct {
- unsigned long dcr; /* CR0 */
- unsigned long itm;
- unsigned long iva;
- unsigned long rsv1[5];
- unsigned long pta; /* CR8 */
- unsigned long rsv2[7];
- unsigned long ipsr; /* CR16 */
- unsigned long isr;
- unsigned long rsv3;
- unsigned long iip;
- unsigned long ifa;
- unsigned long itir;
- unsigned long iipa;
- unsigned long ifs;
- unsigned long iim; /* CR24 */
- unsigned long iha;
- unsigned long rsv4[38];
- unsigned long lid; /* CR64 */
- unsigned long ivr;
- unsigned long tpr;
- unsigned long eoi;
- unsigned long irr[4];
- unsigned long itv; /* CR72 */
- unsigned long pmv;
- unsigned long cmcv;
- unsigned long rsv5[5];
- unsigned long lrr0; /* CR80 */
- unsigned long lrr1;
- unsigned long rsv6[46];
- };
- };
- union {
- unsigned long reserved5[128];
- struct {
- unsigned long precover_ifs;
- unsigned long unat; /* not sure if this is needed
- until NaT arch is done */
- int interrupt_collection_enabled; /* virtual psr.ic */
- /* virtual interrupt deliverable flag is
- * evtchn_upcall_mask in shared info area now.
- * interrupt_mask_addr is the address
- * of evtchn_upcall_mask for current vcpu
- */
- unsigned char *interrupt_mask_addr;
- int pending_interruption;
- unsigned char vpsr_pp;
- unsigned char vpsr_dfh;
- unsigned char hpsr_dfh;
- unsigned char hpsr_mfh;
- unsigned long reserved5_1[4];
- int metaphysical_mode; /* 1 = use metaphys mapping
- 0 = use virtual */
- int banknum; /* 0 or 1, which virtual
- register bank is active */
- unsigned long rrs[8]; /* region registers */
- unsigned long krs[8]; /* kernel registers */
- unsigned long tmp[16]; /* temp registers
- (e.g. for hyperprivops) */
- /* itc paravirtualization
- * vAR.ITC = mAR.ITC + itc_offset
- * itc_last is one which was lastly passed to
- * the guest OS in order to prevent it from
- * going backwords.
- */
- unsigned long itc_offset;
- unsigned long itc_last;
- };
- };
- };
- struct arch_vcpu_info {
- /* nothing */
- };
- /*
- * This structure is used for magic page in domain pseudo physical address
- * space and the result of XENMEM_machine_memory_map.
- * As the XENMEM_machine_memory_map result,
- * xen_memory_map::nr_entries indicates the size in bytes
- * including struct xen_ia64_memmap_info. Not the number of entries.
- */
- struct xen_ia64_memmap_info {
- uint64_t efi_memmap_size; /* size of EFI memory map */
- uint64_t efi_memdesc_size; /* size of an EFI memory map
- * descriptor */
- uint32_t efi_memdesc_version; /* memory descriptor version */
- void *memdesc[0]; /* array of efi_memory_desc_t */
- };
- struct arch_shared_info {
- /* PFN of the start_info page. */
- unsigned long start_info_pfn;
- /* Interrupt vector for event channel. */
- int evtchn_vector;
- /* PFN of memmap_info page */
- unsigned int memmap_info_num_pages; /* currently only = 1 case is
- supported. */
- unsigned long memmap_info_pfn;
- uint64_t pad[31];
- };
- struct xen_callback {
- unsigned long ip;
- };
- typedef struct xen_callback xen_callback_t;
- #endif /* !__ASSEMBLY__ */
- /* Size of the shared_info area (this is not related to page size). */
- #define XSI_SHIFT 14
- #define XSI_SIZE (1 << XSI_SHIFT)
- /* Log size of mapped_regs area (64 KB - only 4KB is used). */
- #define XMAPPEDREGS_SHIFT 12
- #define XMAPPEDREGS_SIZE (1 << XMAPPEDREGS_SHIFT)
- /* Offset of XASI (Xen arch shared info) wrt XSI_BASE. */
- #define XMAPPEDREGS_OFS XSI_SIZE
- /* Hyperprivops. */
- #define HYPERPRIVOP_START 0x1
- #define HYPERPRIVOP_RFI (HYPERPRIVOP_START + 0x0)
- #define HYPERPRIVOP_RSM_DT (HYPERPRIVOP_START + 0x1)
- #define HYPERPRIVOP_SSM_DT (HYPERPRIVOP_START + 0x2)
- #define HYPERPRIVOP_COVER (HYPERPRIVOP_START + 0x3)
- #define HYPERPRIVOP_ITC_D (HYPERPRIVOP_START + 0x4)
- #define HYPERPRIVOP_ITC_I (HYPERPRIVOP_START + 0x5)
- #define HYPERPRIVOP_SSM_I (HYPERPRIVOP_START + 0x6)
- #define HYPERPRIVOP_GET_IVR (HYPERPRIVOP_START + 0x7)
- #define HYPERPRIVOP_GET_TPR (HYPERPRIVOP_START + 0x8)
- #define HYPERPRIVOP_SET_TPR (HYPERPRIVOP_START + 0x9)
- #define HYPERPRIVOP_EOI (HYPERPRIVOP_START + 0xa)
- #define HYPERPRIVOP_SET_ITM (HYPERPRIVOP_START + 0xb)
- #define HYPERPRIVOP_THASH (HYPERPRIVOP_START + 0xc)
- #define HYPERPRIVOP_PTC_GA (HYPERPRIVOP_START + 0xd)
- #define HYPERPRIVOP_ITR_D (HYPERPRIVOP_START + 0xe)
- #define HYPERPRIVOP_GET_RR (HYPERPRIVOP_START + 0xf)
- #define HYPERPRIVOP_SET_RR (HYPERPRIVOP_START + 0x10)
- #define HYPERPRIVOP_SET_KR (HYPERPRIVOP_START + 0x11)
- #define HYPERPRIVOP_FC (HYPERPRIVOP_START + 0x12)
- #define HYPERPRIVOP_GET_CPUID (HYPERPRIVOP_START + 0x13)
- #define HYPERPRIVOP_GET_PMD (HYPERPRIVOP_START + 0x14)
- #define HYPERPRIVOP_GET_EFLAG (HYPERPRIVOP_START + 0x15)
- #define HYPERPRIVOP_SET_EFLAG (HYPERPRIVOP_START + 0x16)
- #define HYPERPRIVOP_RSM_BE (HYPERPRIVOP_START + 0x17)
- #define HYPERPRIVOP_GET_PSR (HYPERPRIVOP_START + 0x18)
- #define HYPERPRIVOP_SET_RR0_TO_RR4 (HYPERPRIVOP_START + 0x19)
- #define HYPERPRIVOP_MAX (0x1a)
- /* Fast and light hypercalls. */
- #define __HYPERVISOR_ia64_fast_eoi __HYPERVISOR_arch_1
- /* Xencomm macros. */
- #define XENCOMM_INLINE_MASK 0xf800000000000000UL
- #define XENCOMM_INLINE_FLAG 0x8000000000000000UL
- #ifndef __ASSEMBLY__
- /*
- * Optimization features.
- * The hypervisor may do some special optimizations for guests. This hypercall
- * can be used to switch on/of these special optimizations.
- */
- #define __HYPERVISOR_opt_feature 0x700UL
- #define XEN_IA64_OPTF_OFF 0x0
- #define XEN_IA64_OPTF_ON 0x1
- /*
- * If this feature is switched on, the hypervisor inserts the
- * tlb entries without calling the guests traphandler.
- * This is useful in guests using region 7 for identity mapping
- * like the linux kernel does.
- */
- #define XEN_IA64_OPTF_IDENT_MAP_REG7 1
- /* Identity mapping of region 4 addresses in HVM. */
- #define XEN_IA64_OPTF_IDENT_MAP_REG4 2
- /* Identity mapping of region 5 addresses in HVM. */
- #define XEN_IA64_OPTF_IDENT_MAP_REG5 3
- #define XEN_IA64_OPTF_IDENT_MAP_NOT_SET (0)
- struct xen_ia64_opt_feature {
- unsigned long cmd; /* Which feature */
- unsigned char on; /* Switch feature on/off */
- union {
- struct {
- /* The page protection bit mask of the pte.
- * This will be or'ed with the pte. */
- unsigned long pgprot;
- unsigned long key; /* A protection key for itir.*/
- };
- };
- };
- #endif /* __ASSEMBLY__ */
- #endif /* _ASM_IA64_XEN_INTERFACE_H */
|