1181624Skmacy/******************************************************************************
2181624Skmacy * arch-ia64/hypervisor-if.h
3181624Skmacy *
4181624Skmacy * Guest OS interface to IA64 Xen.
5181624Skmacy *
6181624Skmacy * Permission is hereby granted, free of charge, to any person obtaining a copy
7181624Skmacy * of this software and associated documentation files (the "Software"), to
8181624Skmacy * deal in the Software without restriction, including without limitation the
9181624Skmacy * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10181624Skmacy * sell copies of the Software, and to permit persons to whom the Software is
11181624Skmacy * furnished to do so, subject to the following conditions:
12181624Skmacy *
13181624Skmacy * The above copyright notice and this permission notice shall be included in
14181624Skmacy * all copies or substantial portions of the Software.
15181624Skmacy *
16181624Skmacy * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17181624Skmacy * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18181624Skmacy * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19181624Skmacy * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20181624Skmacy * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21181624Skmacy * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22181624Skmacy * DEALINGS IN THE SOFTWARE.
23181624Skmacy *
24181624Skmacy */
25181624Skmacy
26183375Skmacy#include "xen.h"
27183375Skmacy
28181624Skmacy#ifndef __HYPERVISOR_IF_IA64_H__
29181624Skmacy#define __HYPERVISOR_IF_IA64_H__
30181624Skmacy
31183375Skmacy#if !defined(__GNUC__) || defined(__STRICT_ANSI__)
32183375Skmacy#error "Anonymous structs/unions are a GNU extension."
33183375Skmacy#endif
34183375Skmacy
35181624Skmacy/* Structural guest handles introduced in 0x00030201. */
36181624Skmacy#if __XEN_INTERFACE_VERSION__ >= 0x00030201
37183375Skmacy#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
38181624Skmacy    typedef struct { type *p; } __guest_handle_ ## name
39181624Skmacy#else
40183375Skmacy#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
41181624Skmacy    typedef type * __guest_handle_ ## name
42181624Skmacy#endif
43181624Skmacy
44183375Skmacy#define __DEFINE_XEN_GUEST_HANDLE(name, type) \
45183375Skmacy    ___DEFINE_XEN_GUEST_HANDLE(name, type);   \
46183375Skmacy    ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type)
47183375Skmacy
48181624Skmacy#define DEFINE_XEN_GUEST_HANDLE(name)   __DEFINE_XEN_GUEST_HANDLE(name, name)
49181624Skmacy#define XEN_GUEST_HANDLE(name)          __guest_handle_ ## name
50181624Skmacy#define XEN_GUEST_HANDLE_64(name)       XEN_GUEST_HANDLE(name)
51181624Skmacy#define uint64_aligned_t                uint64_t
52251767Sgibbs#define set_xen_guest_handle_raw(hnd, val)  do { (hnd).p = val; } while (0)
53181624Skmacy#ifdef __XEN_TOOLS__
54181624Skmacy#define get_xen_guest_handle(val, hnd)  do { val = (hnd).p; } while (0)
55181624Skmacy#endif
56251767Sgibbs#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val)
57181624Skmacy
58181624Skmacy#ifndef __ASSEMBLY__
59181624Skmacytypedef unsigned long xen_pfn_t;
60181624Skmacy#define PRI_xen_pfn "lx"
61181624Skmacy#endif
62181624Skmacy
63181624Skmacy/* Arch specific VIRQs definition */
64181624Skmacy#define VIRQ_ITC        VIRQ_ARCH_0 /* V. Virtual itc timer */
65181624Skmacy#define VIRQ_MCA_CMC    VIRQ_ARCH_1 /* MCA cmc interrupt */
66181624Skmacy#define VIRQ_MCA_CPE    VIRQ_ARCH_2 /* MCA cpe interrupt */
67181624Skmacy
68181624Skmacy/* Maximum number of virtual CPUs in multi-processor guests. */
69181624Skmacy/* WARNING: before changing this, check that shared_info fits on a page */
70251767Sgibbs#define XEN_LEGACY_MAX_VCPUS 64
71181624Skmacy
72183375Skmacy/* IO ports location for PV.  */
73183375Skmacy#define IO_PORTS_PADDR          0x00000ffffc000000UL
74183375Skmacy#define IO_PORTS_SIZE           0x0000000004000000UL
75183375Skmacy
76181624Skmacy#ifndef __ASSEMBLY__
77181624Skmacy
78181624Skmacytypedef unsigned long xen_ulong_t;
79181624Skmacy
80183375Skmacy#ifdef __XEN_TOOLS__
81183375Skmacy#define XEN_PAGE_SIZE XC_PAGE_SIZE
82183375Skmacy#else
83183375Skmacy#define XEN_PAGE_SIZE PAGE_SIZE
84183375Skmacy#endif
85183375Skmacy
86181624Skmacy#define INVALID_MFN       (~0UL)
87181624Skmacy
88181624Skmacystruct pt_fpreg {
89181624Skmacy    union {
90181624Skmacy        unsigned long bits[2];
91181624Skmacy        long double __dummy;    /* force 16-byte alignment */
92181624Skmacy    } u;
93181624Skmacy};
94181624Skmacy
95181624Skmacyunion vac {
96181624Skmacy    unsigned long value;
97181624Skmacy    struct {
98181624Skmacy        int a_int:1;
99181624Skmacy        int a_from_int_cr:1;
100181624Skmacy        int a_to_int_cr:1;
101181624Skmacy        int a_from_psr:1;
102181624Skmacy        int a_from_cpuid:1;
103181624Skmacy        int a_cover:1;
104181624Skmacy        int a_bsw:1;
105181624Skmacy        long reserved:57;
106181624Skmacy    };
107181624Skmacy};
108181624Skmacytypedef union vac vac_t;
109181624Skmacy
110181624Skmacyunion vdc {
111181624Skmacy    unsigned long value;
112181624Skmacy    struct {
113181624Skmacy        int d_vmsw:1;
114181624Skmacy        int d_extint:1;
115181624Skmacy        int d_ibr_dbr:1;
116181624Skmacy        int d_pmc:1;
117181624Skmacy        int d_to_pmd:1;
118181624Skmacy        int d_itm:1;
119181624Skmacy        long reserved:58;
120181624Skmacy    };
121181624Skmacy};
122181624Skmacytypedef union vdc vdc_t;
123181624Skmacy
124181624Skmacystruct mapped_regs {
125181624Skmacy    union vac   vac;
126181624Skmacy    union vdc   vdc;
127181624Skmacy    unsigned long  virt_env_vaddr;
128181624Skmacy    unsigned long  reserved1[29];
129181624Skmacy    unsigned long  vhpi;
130181624Skmacy    unsigned long  reserved2[95];
131181624Skmacy    union {
132181624Skmacy        unsigned long  vgr[16];
133181624Skmacy        unsigned long bank1_regs[16]; // bank1 regs (r16-r31) when bank0 active
134181624Skmacy    };
135181624Skmacy    union {
136181624Skmacy        unsigned long  vbgr[16];
137181624Skmacy        unsigned long bank0_regs[16]; // bank0 regs (r16-r31) when bank1 active
138181624Skmacy    };
139181624Skmacy    unsigned long  vnat;
140181624Skmacy    unsigned long  vbnat;
141181624Skmacy    unsigned long  vcpuid[5];
142181624Skmacy    unsigned long  reserved3[11];
143181624Skmacy    unsigned long  vpsr;
144181624Skmacy    unsigned long  vpr;
145181624Skmacy    unsigned long  reserved4[76];
146181624Skmacy    union {
147181624Skmacy        unsigned long  vcr[128];
148181624Skmacy        struct {
149181624Skmacy            unsigned long dcr;  // CR0
150181624Skmacy            unsigned long itm;
151181624Skmacy            unsigned long iva;
152181624Skmacy            unsigned long rsv1[5];
153181624Skmacy            unsigned long pta;  // CR8
154181624Skmacy            unsigned long rsv2[7];
155181624Skmacy            unsigned long ipsr;  // CR16
156181624Skmacy            unsigned long isr;
157181624Skmacy            unsigned long rsv3;
158181624Skmacy            unsigned long iip;
159181624Skmacy            unsigned long ifa;
160181624Skmacy            unsigned long itir;
161181624Skmacy            unsigned long iipa;
162181624Skmacy            unsigned long ifs;
163181624Skmacy            unsigned long iim;  // CR24
164181624Skmacy            unsigned long iha;
165181624Skmacy            unsigned long rsv4[38];
166181624Skmacy            unsigned long lid;  // CR64
167181624Skmacy            unsigned long ivr;
168181624Skmacy            unsigned long tpr;
169181624Skmacy            unsigned long eoi;
170181624Skmacy            unsigned long irr[4];
171181624Skmacy            unsigned long itv;  // CR72
172181624Skmacy            unsigned long pmv;
173181624Skmacy            unsigned long cmcv;
174181624Skmacy            unsigned long rsv5[5];
175181624Skmacy            unsigned long lrr0;  // CR80
176181624Skmacy            unsigned long lrr1;
177181624Skmacy            unsigned long rsv6[46];
178181624Skmacy        };
179181624Skmacy    };
180181624Skmacy    union {
181181624Skmacy        unsigned long  reserved5[128];
182181624Skmacy        struct {
183181624Skmacy            unsigned long precover_ifs;
184181624Skmacy            unsigned long unat;  // not sure if this is needed until NaT arch is done
185181624Skmacy            int interrupt_collection_enabled; // virtual psr.ic
186181624Skmacy            /* virtual interrupt deliverable flag is evtchn_upcall_mask in
187181624Skmacy             * shared info area now. interrupt_mask_addr is the address
188181624Skmacy             * of evtchn_upcall_mask for current vcpu
189181624Skmacy             */
190181624Skmacy            unsigned char *interrupt_mask_addr;
191181624Skmacy            int pending_interruption;
192181624Skmacy            unsigned char vpsr_pp;
193181624Skmacy            unsigned char vpsr_dfh;
194181624Skmacy            unsigned char hpsr_dfh;
195181624Skmacy            unsigned char hpsr_mfh;
196181624Skmacy            unsigned long reserved5_1[4];
197181624Skmacy            int metaphysical_mode; // 1 = use metaphys mapping, 0 = use virtual
198181624Skmacy            int banknum; // 0 or 1, which virtual register bank is active
199181624Skmacy            unsigned long rrs[8]; // region registers
200181624Skmacy            unsigned long krs[8]; // kernel registers
201183375Skmacy            unsigned long tmp[16]; // temp registers (e.g. for hyperprivops)
202251767Sgibbs
203251767Sgibbs            /* itc paravirtualization
204251767Sgibbs             * vAR.ITC = mAR.ITC + itc_offset
205251767Sgibbs             * itc_last is one which was lastly passed to
206251767Sgibbs             * the guest OS in order to prevent it from
207251767Sgibbs             * going backwords.
208251767Sgibbs             */
209251767Sgibbs            unsigned long itc_offset;
210251767Sgibbs            unsigned long itc_last;
211181624Skmacy        };
212181624Skmacy    };
213181624Skmacy};
214181624Skmacytypedef struct mapped_regs mapped_regs_t;
215181624Skmacy
216181624Skmacystruct vpd {
217181624Skmacy    struct mapped_regs vpd_low;
218181624Skmacy    unsigned long  reserved6[3456];
219181624Skmacy    unsigned long  vmm_avail[128];
220181624Skmacy    unsigned long  reserved7[4096];
221181624Skmacy};
222181624Skmacytypedef struct vpd vpd_t;
223181624Skmacy
224181624Skmacystruct arch_vcpu_info {
225181624Skmacy};
226181624Skmacytypedef struct arch_vcpu_info arch_vcpu_info_t;
227181624Skmacy
228183375Skmacy/*
229183375Skmacy * This structure is used for magic page in domain pseudo physical address
230183375Skmacy * space and the result of XENMEM_machine_memory_map.
231183375Skmacy * As the XENMEM_machine_memory_map result,
232183375Skmacy * xen_memory_map::nr_entries indicates the size in bytes
233183375Skmacy * including struct xen_ia64_memmap_info. Not the number of entries.
234183375Skmacy */
235183375Skmacystruct xen_ia64_memmap_info {
236183375Skmacy    uint64_t efi_memmap_size;       /* size of EFI memory map */
237183375Skmacy    uint64_t efi_memdesc_size;      /* size of an EFI memory map descriptor */
238183375Skmacy    uint32_t efi_memdesc_version;   /* memory descriptor version */
239183375Skmacy    void *memdesc[0];               /* array of efi_memory_desc_t */
240183375Skmacy};
241183375Skmacytypedef struct xen_ia64_memmap_info xen_ia64_memmap_info_t;
242183375Skmacy
243181624Skmacystruct arch_shared_info {
244181624Skmacy    /* PFN of the start_info page.  */
245181624Skmacy    unsigned long start_info_pfn;
246181624Skmacy
247181624Skmacy    /* Interrupt vector for event channel.  */
248181624Skmacy    int evtchn_vector;
249181624Skmacy
250183375Skmacy    /* PFN of memmap_info page */
251183375Skmacy    unsigned int memmap_info_num_pages;/* currently only = 1 case is
252183375Skmacy                                          supported. */
253183375Skmacy    unsigned long memmap_info_pfn;
254183375Skmacy
255183375Skmacy    uint64_t pad[31];
256181624Skmacy};
257181624Skmacytypedef struct arch_shared_info arch_shared_info_t;
258181624Skmacy
259181624Skmacytypedef unsigned long xen_callback_t;
260181624Skmacy
261181624Skmacystruct ia64_tr_entry {
262181624Skmacy    unsigned long pte;
263181624Skmacy    unsigned long itir;
264181624Skmacy    unsigned long vadr;
265181624Skmacy    unsigned long rid;
266181624Skmacy};
267183375Skmacytypedef struct ia64_tr_entry ia64_tr_entry_t;
268183375SkmacyDEFINE_XEN_GUEST_HANDLE(ia64_tr_entry_t);
269181624Skmacy
270183375Skmacystruct vcpu_tr_regs {
271183375Skmacy    struct ia64_tr_entry itrs[12];
272183375Skmacy    struct ia64_tr_entry dtrs[12];
273181624Skmacy};
274181624Skmacy
275183375Skmacyunion vcpu_ar_regs {
276183375Skmacy    unsigned long ar[128];
277183375Skmacy    struct {
278183375Skmacy        unsigned long kr[8];
279183375Skmacy        unsigned long rsv1[8];
280183375Skmacy        unsigned long rsc;
281183375Skmacy        unsigned long bsp;
282183375Skmacy        unsigned long bspstore;
283183375Skmacy        unsigned long rnat;
284183375Skmacy        unsigned long rsv2;
285183375Skmacy        unsigned long fcr;
286183375Skmacy        unsigned long rsv3[2];
287183375Skmacy        unsigned long eflag;
288183375Skmacy        unsigned long csd;
289183375Skmacy        unsigned long ssd;
290183375Skmacy        unsigned long cflg;
291183375Skmacy        unsigned long fsr;
292183375Skmacy        unsigned long fir;
293183375Skmacy        unsigned long fdr;
294183375Skmacy        unsigned long rsv4;
295183375Skmacy        unsigned long ccv; /* 32 */
296183375Skmacy        unsigned long rsv5[3];
297183375Skmacy        unsigned long unat;
298183375Skmacy        unsigned long rsv6[3];
299183375Skmacy        unsigned long fpsr;
300183375Skmacy        unsigned long rsv7[3];
301183375Skmacy        unsigned long itc;
302183375Skmacy        unsigned long rsv8[3];
303183375Skmacy        unsigned long ign1[16];
304183375Skmacy        unsigned long pfs; /* 64 */
305183375Skmacy        unsigned long lc;
306183375Skmacy        unsigned long ec;
307183375Skmacy        unsigned long rsv9[45];
308183375Skmacy        unsigned long ign2[16];
309183375Skmacy    };
310183375Skmacy};
311183375Skmacy
312183375Skmacyunion vcpu_cr_regs {
313183375Skmacy    unsigned long cr[128];
314183375Skmacy    struct {
315183375Skmacy        unsigned long dcr;  // CR0
316183375Skmacy        unsigned long itm;
317183375Skmacy        unsigned long iva;
318183375Skmacy        unsigned long rsv1[5];
319183375Skmacy        unsigned long pta;  // CR8
320183375Skmacy        unsigned long rsv2[7];
321183375Skmacy        unsigned long ipsr;  // CR16
322183375Skmacy        unsigned long isr;
323183375Skmacy        unsigned long rsv3;
324183375Skmacy        unsigned long iip;
325183375Skmacy        unsigned long ifa;
326183375Skmacy        unsigned long itir;
327183375Skmacy        unsigned long iipa;
328183375Skmacy        unsigned long ifs;
329183375Skmacy        unsigned long iim;  // CR24
330183375Skmacy        unsigned long iha;
331183375Skmacy        unsigned long rsv4[38];
332183375Skmacy        unsigned long lid;  // CR64
333183375Skmacy        unsigned long ivr;
334183375Skmacy        unsigned long tpr;
335183375Skmacy        unsigned long eoi;
336183375Skmacy        unsigned long irr[4];
337183375Skmacy        unsigned long itv;  // CR72
338183375Skmacy        unsigned long pmv;
339183375Skmacy        unsigned long cmcv;
340183375Skmacy        unsigned long rsv5[5];
341183375Skmacy        unsigned long lrr0;  // CR80
342183375Skmacy        unsigned long lrr1;
343183375Skmacy        unsigned long rsv6[46];
344183375Skmacy    };
345183375Skmacy};
346183375Skmacy
347183375Skmacystruct vcpu_guest_context_regs {
348183375Skmacy        unsigned long r[32];
349183375Skmacy        unsigned long b[8];
350183375Skmacy        unsigned long bank[16];
351183375Skmacy        unsigned long ip;
352183375Skmacy        unsigned long psr;
353183375Skmacy        unsigned long cfm;
354183375Skmacy        unsigned long pr;
355183375Skmacy        unsigned int nats; /* NaT bits for r1-r31.  */
356183375Skmacy        unsigned int bnats; /* Nat bits for banked registers.  */
357183375Skmacy        union vcpu_ar_regs ar;
358183375Skmacy        union vcpu_cr_regs cr;
359183375Skmacy        struct pt_fpreg f[128];
360183375Skmacy        unsigned long dbr[8];
361183375Skmacy        unsigned long ibr[8];
362183375Skmacy        unsigned long rr[8];
363183375Skmacy        unsigned long pkr[16];
364183375Skmacy
365183375Skmacy        /* FIXME: cpuid,pmd,pmc */
366183375Skmacy
367183375Skmacy        unsigned long xip;
368183375Skmacy        unsigned long xpsr;
369183375Skmacy        unsigned long xfs;
370183375Skmacy        unsigned long xr[4];
371183375Skmacy
372183375Skmacy        struct vcpu_tr_regs tr;
373183375Skmacy
374183375Skmacy        /* Physical registers in case of debug event.  */
375183375Skmacy        unsigned long excp_iipa;
376183375Skmacy        unsigned long excp_ifa;
377183375Skmacy        unsigned long excp_isr;
378183375Skmacy        unsigned int excp_vector;
379183375Skmacy
380183375Skmacy        /*
381183375Skmacy         * The rbs is intended to be the image of the stacked registers still
382183375Skmacy         * in the cpu (not yet stored in memory).  It is laid out as if it
383183375Skmacy         * were written in memory at a 512 (64*8) aligned address + offset.
384183375Skmacy         * rbs_voff is (offset / 8).  rbs_nat contains NaT bits for the
385183375Skmacy         * remaining rbs registers.  rbs_rnat contains NaT bits for in memory
386183375Skmacy         * rbs registers.
387183375Skmacy         * Note: loadrs is 2**14 bytes == 2**11 slots.
388183375Skmacy         */
389183375Skmacy        unsigned int rbs_voff;
390183375Skmacy        unsigned long rbs[2048];
391183375Skmacy        unsigned long rbs_rnat;
392183375Skmacy
393183375Skmacy        /*
394183375Skmacy         * RSE.N_STACKED_PHYS via PAL_RSE_INFO
395183375Skmacy         * Strictly this isn't cpu context, but this value is necessary
396183375Skmacy         * for domain save/restore. So is here.
397183375Skmacy         */
398183375Skmacy        unsigned long num_phys_stacked;
399183375Skmacy};
400183375Skmacy
401181624Skmacystruct vcpu_guest_context {
402183375Skmacy#define VGCF_EXTRA_REGS (1UL << 1)	/* Set extra regs.  */
403183375Skmacy#define VGCF_SET_CR_IRR (1UL << 2)	/* Set cr_irr[0:3]. */
404183375Skmacy#define VGCF_online     (1UL << 3)  /* make this vcpu online */
405251767Sgibbs#define VGCF_SET_AR_ITC (1UL << 4)  /* set pv ar.itc. itc_offset, itc_last */
406181624Skmacy    unsigned long flags;       /* VGCF_* flags */
407181624Skmacy
408183375Skmacy    struct vcpu_guest_context_regs regs;
409183375Skmacy
410183375Skmacy    unsigned long event_callback_ip;
411183375Skmacy
412183375Skmacy    /* xen doesn't share privregs pages with hvm domain so that this member
413183375Skmacy     * doesn't make sense for hvm domain.
414183375Skmacy     * ~0UL is already used for INVALID_P2M_ENTRY. */
415183375Skmacy#define VGC_PRIVREGS_HVM       (~(-2UL))
416181624Skmacy    unsigned long privregs_pfn;
417181624Skmacy};
418181624Skmacytypedef struct vcpu_guest_context vcpu_guest_context_t;
419181624SkmacyDEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
420181624Skmacy
421181624Skmacy/* dom0 vp op */
422181624Skmacy#define __HYPERVISOR_ia64_dom0vp_op     __HYPERVISOR_arch_0
423181624Skmacy/*  Map io space in machine address to dom0 physical address space.
424181624Skmacy    Currently physical assigned address equals to machine address.  */
425181624Skmacy#define IA64_DOM0VP_ioremap             0
426181624Skmacy
427181624Skmacy/* Convert a pseudo physical page frame number to the corresponding
428181624Skmacy   machine page frame number. If no page is assigned, INVALID_MFN or
429181624Skmacy   GPFN_INV_MASK is returned depending on domain's non-vti/vti mode.  */
430181624Skmacy#define IA64_DOM0VP_phystomach          1
431181624Skmacy
432181624Skmacy/* Convert a machine page frame number to the corresponding pseudo physical
433181624Skmacy   page frame number of the caller domain.  */
434181624Skmacy#define IA64_DOM0VP_machtophys          3
435181624Skmacy
436181624Skmacy/* Reserved for future use.  */
437181624Skmacy#define IA64_DOM0VP_iounmap             4
438181624Skmacy
439181624Skmacy/* Unmap and free pages contained in the specified pseudo physical region.  */
440181624Skmacy#define IA64_DOM0VP_zap_physmap         5
441181624Skmacy
442181624Skmacy/* Assign machine page frame to dom0's pseudo physical address space.  */
443181624Skmacy#define IA64_DOM0VP_add_physmap         6
444181624Skmacy
445181624Skmacy/* expose the p2m table into domain */
446181624Skmacy#define IA64_DOM0VP_expose_p2m          7
447181624Skmacy
448181624Skmacy/* xen perfmon */
449181624Skmacy#define IA64_DOM0VP_perfmon             8
450181624Skmacy
451181624Skmacy/* gmfn version of IA64_DOM0VP_add_physmap */
452181624Skmacy#define IA64_DOM0VP_add_physmap_with_gmfn       9
453181624Skmacy
454183375Skmacy/* get fpswa revision */
455183375Skmacy#define IA64_DOM0VP_fpswa_revision      10
456183375Skmacy
457181624Skmacy/* Add an I/O port space range */
458181624Skmacy#define IA64_DOM0VP_add_io_space        11
459181624Skmacy
460183375Skmacy/* expose the foreign domain's p2m table into privileged domain */
461183375Skmacy#define IA64_DOM0VP_expose_foreign_p2m  12
462183375Skmacy#define         IA64_DOM0VP_EFP_ALLOC_PTE       0x1 /* allocate p2m table */
463183375Skmacy
464183375Skmacy/* unexpose the foreign domain's p2m table into privileged domain */
465183375Skmacy#define IA64_DOM0VP_unexpose_foreign_p2m        13
466183375Skmacy
467251767Sgibbs/* get memmap_info and memmap. It is possible to map the page directly
468251767Sgibbs   by foreign page mapping, but there is a race between writer.
469251767Sgibbs   This hypercall avoids such race. */
470251767Sgibbs#define IA64_DOM0VP_get_memmap          14
471251767Sgibbs
472181624Skmacy// flags for page assignement to pseudo physical address space
473181624Skmacy#define _ASSIGN_readonly                0
474181624Skmacy#define ASSIGN_readonly                 (1UL << _ASSIGN_readonly)
475181624Skmacy#define ASSIGN_writable                 (0UL << _ASSIGN_readonly) // dummy flag
476181624Skmacy/* Internal only: memory attribute must be WC/UC/UCE.  */
477181624Skmacy#define _ASSIGN_nocache                 1
478181624Skmacy#define ASSIGN_nocache                  (1UL << _ASSIGN_nocache)
479181624Skmacy// tlb tracking
480181624Skmacy#define _ASSIGN_tlb_track               2
481181624Skmacy#define ASSIGN_tlb_track                (1UL << _ASSIGN_tlb_track)
482181624Skmacy/* Internal only: associated with PGC_allocated bit */
483181624Skmacy#define _ASSIGN_pgc_allocated           3
484181624Skmacy#define ASSIGN_pgc_allocated            (1UL << _ASSIGN_pgc_allocated)
485183375Skmacy/* Page is an IO page.  */
486183375Skmacy#define _ASSIGN_io                      4
487183375Skmacy#define ASSIGN_io                       (1UL << _ASSIGN_io)
488181624Skmacy
489181624Skmacy/* This structure has the same layout of struct ia64_boot_param, defined in
490181624Skmacy   <asm/system.h>.  It is redefined here to ease use.  */
491181624Skmacystruct xen_ia64_boot_param {
492181624Skmacy	unsigned long command_line;	/* physical address of cmd line args */
493181624Skmacy	unsigned long efi_systab;	/* physical address of EFI system table */
494181624Skmacy	unsigned long efi_memmap;	/* physical address of EFI memory map */
495181624Skmacy	unsigned long efi_memmap_size;	/* size of EFI memory map */
496181624Skmacy	unsigned long efi_memdesc_size;	/* size of an EFI memory map descriptor */
497181624Skmacy	unsigned int  efi_memdesc_version;	/* memory descriptor version */
498181624Skmacy	struct {
499181624Skmacy		unsigned short num_cols;	/* number of columns on console.  */
500181624Skmacy		unsigned short num_rows;	/* number of rows on console.  */
501181624Skmacy		unsigned short orig_x;	/* cursor's x position */
502181624Skmacy		unsigned short orig_y;	/* cursor's y position */
503181624Skmacy	} console_info;
504181624Skmacy	unsigned long fpswa;		/* physical address of the fpswa interface */
505181624Skmacy	unsigned long initrd_start;
506181624Skmacy	unsigned long initrd_size;
507181624Skmacy	unsigned long domain_start;	/* va where the boot time domain begins */
508181624Skmacy	unsigned long domain_size;	/* how big is the boot domain */
509181624Skmacy};
510181624Skmacy
511181624Skmacy#endif /* !__ASSEMBLY__ */
512181624Skmacy
513181624Skmacy/* Size of the shared_info area (this is not related to page size).  */
514181624Skmacy#define XSI_SHIFT			14
515181624Skmacy#define XSI_SIZE			(1 << XSI_SHIFT)
516181624Skmacy/* Log size of mapped_regs area (64 KB - only 4KB is used).  */
517181624Skmacy#define XMAPPEDREGS_SHIFT		12
518181624Skmacy#define XMAPPEDREGS_SIZE		(1 << XMAPPEDREGS_SHIFT)
519181624Skmacy/* Offset of XASI (Xen arch shared info) wrt XSI_BASE.  */
520181624Skmacy#define XMAPPEDREGS_OFS			XSI_SIZE
521181624Skmacy
522181624Skmacy/* Hyperprivops.  */
523181624Skmacy#define HYPERPRIVOP_START		0x1
524181624Skmacy#define HYPERPRIVOP_RFI			(HYPERPRIVOP_START + 0x0)
525181624Skmacy#define HYPERPRIVOP_RSM_DT		(HYPERPRIVOP_START + 0x1)
526181624Skmacy#define HYPERPRIVOP_SSM_DT		(HYPERPRIVOP_START + 0x2)
527181624Skmacy#define HYPERPRIVOP_COVER		(HYPERPRIVOP_START + 0x3)
528181624Skmacy#define HYPERPRIVOP_ITC_D		(HYPERPRIVOP_START + 0x4)
529181624Skmacy#define HYPERPRIVOP_ITC_I		(HYPERPRIVOP_START + 0x5)
530181624Skmacy#define HYPERPRIVOP_SSM_I		(HYPERPRIVOP_START + 0x6)
531181624Skmacy#define HYPERPRIVOP_GET_IVR		(HYPERPRIVOP_START + 0x7)
532181624Skmacy#define HYPERPRIVOP_GET_TPR		(HYPERPRIVOP_START + 0x8)
533181624Skmacy#define HYPERPRIVOP_SET_TPR		(HYPERPRIVOP_START + 0x9)
534181624Skmacy#define HYPERPRIVOP_EOI			(HYPERPRIVOP_START + 0xa)
535181624Skmacy#define HYPERPRIVOP_SET_ITM		(HYPERPRIVOP_START + 0xb)
536181624Skmacy#define HYPERPRIVOP_THASH		(HYPERPRIVOP_START + 0xc)
537181624Skmacy#define HYPERPRIVOP_PTC_GA		(HYPERPRIVOP_START + 0xd)
538181624Skmacy#define HYPERPRIVOP_ITR_D		(HYPERPRIVOP_START + 0xe)
539181624Skmacy#define HYPERPRIVOP_GET_RR		(HYPERPRIVOP_START + 0xf)
540181624Skmacy#define HYPERPRIVOP_SET_RR		(HYPERPRIVOP_START + 0x10)
541181624Skmacy#define HYPERPRIVOP_SET_KR		(HYPERPRIVOP_START + 0x11)
542181624Skmacy#define HYPERPRIVOP_FC			(HYPERPRIVOP_START + 0x12)
543181624Skmacy#define HYPERPRIVOP_GET_CPUID		(HYPERPRIVOP_START + 0x13)
544181624Skmacy#define HYPERPRIVOP_GET_PMD		(HYPERPRIVOP_START + 0x14)
545181624Skmacy#define HYPERPRIVOP_GET_EFLAG		(HYPERPRIVOP_START + 0x15)
546181624Skmacy#define HYPERPRIVOP_SET_EFLAG		(HYPERPRIVOP_START + 0x16)
547181624Skmacy#define HYPERPRIVOP_RSM_BE		(HYPERPRIVOP_START + 0x17)
548181624Skmacy#define HYPERPRIVOP_GET_PSR		(HYPERPRIVOP_START + 0x18)
549183375Skmacy#define HYPERPRIVOP_SET_RR0_TO_RR4	(HYPERPRIVOP_START + 0x19)
550183375Skmacy#define HYPERPRIVOP_MAX			(0x1a)
551181624Skmacy
552181624Skmacy/* Fast and light hypercalls.  */
553181624Skmacy#define __HYPERVISOR_ia64_fast_eoi	__HYPERVISOR_arch_1
554181624Skmacy
555183375Skmacy/* Extra debug features.  */
556183375Skmacy#define __HYPERVISOR_ia64_debug_op  __HYPERVISOR_arch_2
557183375Skmacy
558181624Skmacy/* Xencomm macros.  */
559181624Skmacy#define XENCOMM_INLINE_MASK 0xf800000000000000UL
560181624Skmacy#define XENCOMM_INLINE_FLAG 0x8000000000000000UL
561181624Skmacy
562183375Skmacy#ifndef __ASSEMBLY__
563181624Skmacy
564183375Skmacy/*
565183375Skmacy * Optimization features.
566183375Skmacy * The hypervisor may do some special optimizations for guests. This hypercall
567183375Skmacy * can be used to switch on/of these special optimizations.
568183375Skmacy */
569183375Skmacy#define __HYPERVISOR_opt_feature	0x700UL
570183375Skmacy
571183375Skmacy#define XEN_IA64_OPTF_OFF	0x0
572183375Skmacy#define XEN_IA64_OPTF_ON	0x1
573183375Skmacy
574183375Skmacy/*
575183375Skmacy * If this feature is switched on, the hypervisor inserts the
576183375Skmacy * tlb entries without calling the guests traphandler.
577183375Skmacy * This is useful in guests using region 7 for identity mapping
578183375Skmacy * like the linux kernel does.
579183375Skmacy */
580183375Skmacy#define XEN_IA64_OPTF_IDENT_MAP_REG7    1
581183375Skmacy
582183375Skmacy/* Identity mapping of region 4 addresses in HVM. */
583183375Skmacy#define XEN_IA64_OPTF_IDENT_MAP_REG4    2
584183375Skmacy
585183375Skmacy/* Identity mapping of region 5 addresses in HVM. */
586183375Skmacy#define XEN_IA64_OPTF_IDENT_MAP_REG5    3
587183375Skmacy
588183375Skmacy#define XEN_IA64_OPTF_IDENT_MAP_NOT_SET  (0)
589183375Skmacy
590183375Skmacystruct xen_ia64_opt_feature {
591183375Skmacy	unsigned long cmd;		/* Which feature */
592183375Skmacy	unsigned char on;		/* Switch feature on/off */
593183375Skmacy	union {
594183375Skmacy		struct {
595183375Skmacy				/* The page protection bit mask of the pte.
596183375Skmacy			 	 * This will be or'ed with the pte. */
597183375Skmacy			unsigned long pgprot;
598183375Skmacy			unsigned long key;	/* A protection key for itir. */
599183375Skmacy		};
600183375Skmacy	};
601183375Skmacy};
602183375Skmacy
603183375Skmacy#endif /* __ASSEMBLY__ */
604183375Skmacy
605181624Skmacy/* xen perfmon */
606181624Skmacy#ifdef XEN
607181624Skmacy#ifndef __ASSEMBLY__
608181624Skmacy#ifndef _ASM_IA64_PERFMON_H
609181624Skmacy
610181624Skmacy#include <xen/list.h>   // asm/perfmon.h requires struct list_head
611181624Skmacy#include <asm/perfmon.h>
612181624Skmacy// for PFM_xxx and pfarg_features_t, pfarg_context_t, pfarg_reg_t, pfarg_load_t
613181624Skmacy
614181624Skmacy#endif /* _ASM_IA64_PERFMON_H */
615181624Skmacy
616181624SkmacyDEFINE_XEN_GUEST_HANDLE(pfarg_features_t);
617181624SkmacyDEFINE_XEN_GUEST_HANDLE(pfarg_context_t);
618181624SkmacyDEFINE_XEN_GUEST_HANDLE(pfarg_reg_t);
619181624SkmacyDEFINE_XEN_GUEST_HANDLE(pfarg_load_t);
620181624Skmacy#endif /* __ASSEMBLY__ */
621181624Skmacy#endif /* XEN */
622181624Skmacy
623183375Skmacy#ifndef __ASSEMBLY__
624183375Skmacy#include "arch-ia64/hvm/memmap.h"
625183375Skmacy#endif
626183375Skmacy
627181624Skmacy#endif /* __HYPERVISOR_IF_IA64_H__ */
628181624Skmacy
629181624Skmacy/*
630181624Skmacy * Local variables:
631181624Skmacy * mode: C
632181624Skmacy * c-set-style: "BSD"
633181624Skmacy * c-basic-offset: 4
634181624Skmacy * tab-width: 4
635181624Skmacy * indent-tabs-mode: nil
636181624Skmacy * End:
637181624Skmacy */
638