Logo Search packages:      
Sourcecode: linux version File versions  Download package

interface.h

/******************************************************************************
 * 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(u64, unsigned long);
DEFINE_GUEST_HANDLE(char);
DEFINE_GUEST_HANDLE(int);
DEFINE_GUEST_HANDLE(long);
DEFINE_GUEST_HANDLE(void);

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)

00099 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;
      };
};

00113 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;
      };
};

00126 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;
            };
      };
};

00225 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.
 */
00236 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 */
};

00244 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];
};

00259 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)

00340 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 */

Generated by  Doxygen 1.6.0   Back to index