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