1 /******************************************************************************
2 * arch-ia64/hypervisor-if.h
4 * Guest OS interface to IA64 Xen.
7 #ifndef __HYPERVISOR_IF_IA64_H__
8 #define __HYPERVISOR_IF_IA64_H__
10 /* Structural guest handles introduced in 0x00030201. */
11 #if __XEN_INTERFACE_VERSION__ >= 0x00030201
12 #define __DEFINE_XEN_GUEST_HANDLE(name, type) \
13 typedef struct { type *p; } __guest_handle_ ## name
15 #define __DEFINE_XEN_GUEST_HANDLE(name, type) \
16 typedef type * __guest_handle_ ## name
19 #define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name)
20 #define XEN_GUEST_HANDLE(name) __guest_handle_ ## name
21 #define set_xen_guest_handle(hnd, val) do { (hnd).p = val; } while (0)
23 #define get_xen_guest_handle(val, hnd) do { val = (hnd).p; } while (0)
27 /* Guest handles for primitive C types. */
28 __DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char);
29 __DEFINE_XEN_GUEST_HANDLE(uint, unsigned int);
30 __DEFINE_XEN_GUEST_HANDLE(ulong, unsigned long);
31 DEFINE_XEN_GUEST_HANDLE(char);
32 DEFINE_XEN_GUEST_HANDLE(int);
33 DEFINE_XEN_GUEST_HANDLE(long);
34 DEFINE_XEN_GUEST_HANDLE(void);
36 typedef unsigned long xen_pfn_t;
37 DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
40 /* Arch specific VIRQs definition */
41 #define VIRQ_ITC VIRQ_ARCH_0 /* V. Virtual itc timer */
43 /* Maximum number of virtual CPUs in multi-processor guests. */
44 /* WARNING: before changing this, check that shared_info fits on a page */
45 #define MAX_VIRT_CPUS 64
49 typedef unsigned long xen_ulong_t;
51 #define GPFN_MEM (0UL << 56) /* Guest pfn is normal mem */
52 #define GPFN_FRAME_BUFFER (1UL << 56) /* VGA framebuffer */
53 #define GPFN_LOW_MMIO (2UL << 56) /* Low MMIO range */
54 #define GPFN_PIB (3UL << 56) /* PIB base */
55 #define GPFN_IOSAPIC (4UL << 56) /* IOSAPIC base */
56 #define GPFN_LEGACY_IO (5UL << 56) /* Legacy I/O base */
57 #define GPFN_GFW (6UL << 56) /* Guest Firmware */
58 #define GPFN_HIGH_MMIO (7UL << 56) /* High MMIO range */
60 #define GPFN_IO_MASK (7UL << 56) /* Guest pfn is I/O type */
61 #define GPFN_INV_MASK (31UL << 59) /* Guest pfn is invalid */
63 #define INVALID_MFN (~0UL)
65 #define MEM_G (1UL << 30)
66 #define MEM_M (1UL << 20)
68 #define MMIO_START (3 * MEM_G)
69 #define MMIO_SIZE (512 * MEM_M)
71 #define VGA_IO_START 0xA0000UL
72 #define VGA_IO_SIZE 0x20000
74 #define LEGACY_IO_START (MMIO_START + MMIO_SIZE)
75 #define LEGACY_IO_SIZE (64*MEM_M)
77 #define IO_PAGE_START (LEGACY_IO_START + LEGACY_IO_SIZE)
78 #define IO_PAGE_SIZE PAGE_SIZE
80 #define STORE_PAGE_START (IO_PAGE_START + IO_PAGE_SIZE)
81 #define STORE_PAGE_SIZE PAGE_SIZE
83 #define IO_SAPIC_START 0xfec00000UL
84 #define IO_SAPIC_SIZE 0x100000
86 #define PIB_START 0xfee00000UL
87 #define PIB_SIZE 0x200000
89 #define GFW_START (4*MEM_G -16*MEM_M)
90 #define GFW_SIZE (16*MEM_M)
94 unsigned long bits[2];
95 long double __dummy; /* force 16-byte alignment */
99 struct cpu_user_regs {
100 /* The following registers are saved by SAVE_MIN: */
101 unsigned long b6; /* scratch */
102 unsigned long b7; /* scratch */
104 unsigned long ar_csd; /* used by cmp8xchg16 (scratch) */
105 unsigned long ar_ssd; /* reserved for future use (scratch) */
107 unsigned long r8; /* scratch (return value register 0) */
108 unsigned long r9; /* scratch (return value register 1) */
109 unsigned long r10; /* scratch (return value register 2) */
110 unsigned long r11; /* scratch (return value register 3) */
112 unsigned long cr_ipsr; /* interrupted task's psr */
113 unsigned long cr_iip; /* interrupted task's instruction pointer */
114 unsigned long cr_ifs; /* interrupted task's function state */
116 unsigned long ar_unat; /* interrupted task's NaT register (preserved) */
117 unsigned long ar_pfs; /* prev function state */
118 unsigned long ar_rsc; /* RSE configuration */
119 /* The following two are valid only if cr_ipsr.cpl > 0: */
120 unsigned long ar_rnat; /* RSE NaT */
121 unsigned long ar_bspstore; /* RSE bspstore */
123 unsigned long pr; /* 64 predicate registers (1 bit each) */
124 unsigned long b0; /* return pointer (bp) */
125 unsigned long loadrs; /* size of dirty partition << 16 */
127 unsigned long r1; /* the gp pointer */
128 unsigned long r12; /* interrupted task's memory stack pointer */
129 unsigned long r13; /* thread pointer */
131 unsigned long ar_fpsr; /* floating point status (preserved) */
132 unsigned long r15; /* scratch */
134 /* The remaining registers are NOT saved for system calls. */
136 unsigned long r14; /* scratch */
137 unsigned long r2; /* scratch */
138 unsigned long r3; /* scratch */
139 unsigned long r16; /* scratch */
140 unsigned long r17; /* scratch */
141 unsigned long r18; /* scratch */
142 unsigned long r19; /* scratch */
143 unsigned long r20; /* scratch */
144 unsigned long r21; /* scratch */
145 unsigned long r22; /* scratch */
146 unsigned long r23; /* scratch */
147 unsigned long r24; /* scratch */
148 unsigned long r25; /* scratch */
149 unsigned long r26; /* scratch */
150 unsigned long r27; /* scratch */
151 unsigned long r28; /* scratch */
152 unsigned long r29; /* scratch */
153 unsigned long r30; /* scratch */
154 unsigned long r31; /* scratch */
155 unsigned long ar_ccv; /* compare/exchange value (scratch) */
158 * Floating point registers that the kernel considers scratch:
160 struct pt_fpreg f6; /* scratch */
161 struct pt_fpreg f7; /* scratch */
162 struct pt_fpreg f8; /* scratch */
163 struct pt_fpreg f9; /* scratch */
164 struct pt_fpreg f10; /* scratch */
165 struct pt_fpreg f11; /* scratch */
166 unsigned long r4; /* preserved */
167 unsigned long r5; /* preserved */
168 unsigned long r6; /* preserved */
169 unsigned long r7; /* preserved */
170 unsigned long eml_unat; /* used for emulating instruction */
171 unsigned long pad0; /* alignment pad */
174 typedef struct cpu_user_regs cpu_user_regs_t;
189 typedef union vac vac_t;
203 typedef union vdc vdc_t;
208 unsigned long virt_env_vaddr;
209 unsigned long reserved1[29];
211 unsigned long reserved2[95];
213 unsigned long vgr[16];
214 unsigned long bank1_regs[16]; // bank1 regs (r16-r31) when bank0 active
217 unsigned long vbgr[16];
218 unsigned long bank0_regs[16]; // bank0 regs (r16-r31) when bank1 active
222 unsigned long vcpuid[5];
223 unsigned long reserved3[11];
226 unsigned long reserved4[76];
228 unsigned long vcr[128];
230 unsigned long dcr; // CR0
233 unsigned long rsv1[5];
234 unsigned long pta; // CR8
235 unsigned long rsv2[7];
236 unsigned long ipsr; // CR16
244 unsigned long iim; // CR24
246 unsigned long rsv4[38];
247 unsigned long lid; // CR64
251 unsigned long irr[4];
252 unsigned long itv; // CR72
255 unsigned long rsv5[5];
256 unsigned long lrr0; // CR80
258 unsigned long rsv6[46];
262 unsigned long reserved5[128];
264 unsigned long precover_ifs;
265 unsigned long unat; // not sure if this is needed until NaT arch is done
266 int interrupt_collection_enabled; // virtual psr.ic
267 /* virtual interrupt deliverable flag is evtchn_upcall_mask in
268 * shared info area now. interrupt_mask_addr is the address
269 * of evtchn_upcall_mask for current vcpu
271 unsigned char *interrupt_mask_addr;
272 int pending_interruption;
273 int incomplete_regframe; // see SDM vol2 6.8
274 unsigned char vpsr_pp;
275 unsigned char reserved5_2[7];
276 unsigned long reserved5_1[3];
277 int metaphysical_mode; // 1 = use metaphys mapping, 0 = use virtual
278 int banknum; // 0 or 1, which virtual register bank is active
279 unsigned long rrs[8]; // region registers
280 unsigned long krs[8]; // kernel registers
281 unsigned long pkrs[8]; // protection key registers
282 unsigned long tmp[8]; // temp registers (e.g. for hyperprivops)
286 typedef struct mapped_regs mapped_regs_t;
289 struct mapped_regs vpd_low;
290 unsigned long reserved6[3456];
291 unsigned long vmm_avail[128];
292 unsigned long reserved7[4096];
294 typedef struct vpd vpd_t;
296 struct arch_vcpu_info {
298 typedef struct arch_vcpu_info arch_vcpu_info_t;
300 struct arch_shared_info {
301 /* PFN of the start_info page. */
302 unsigned long start_info_pfn;
304 /* Interrupt vector for event channel. */
309 typedef struct arch_shared_info arch_shared_info_t;
311 typedef unsigned long xen_callback_t;
313 struct ia64_tr_entry {
320 struct vcpu_extra_regs {
321 struct ia64_tr_entry itrs[8];
322 struct ia64_tr_entry dtrs[8];
325 unsigned long event_callback_ip;
328 struct vcpu_guest_context {
329 #define VGCF_EXTRA_REGS (1<<1) /* Get/Set extra regs. */
330 unsigned long flags; /* VGCF_* flags */
332 struct cpu_user_regs user_regs;
333 struct vcpu_extra_regs extra_regs;
334 unsigned long privregs_pfn;
336 typedef struct vcpu_guest_context vcpu_guest_context_t;
337 DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
340 #define __HYPERVISOR_ia64_dom0vp_op __HYPERVISOR_arch_0
341 #define IA64_DOM0VP_ioremap 0 // map io space in machine
342 // address to dom0 physical
344 // currently physical
345 // assignedg address equals to
347 #define IA64_DOM0VP_phystomach 1 // convert a pseudo physical
349 // to the corresponding
350 // machine page frame number.
351 // if no page is assigned,
352 // INVALID_MFN or GPFN_INV_MASK
353 // is returned depending on
354 // domain's non-vti/vti mode.
355 #define IA64_DOM0VP_machtophys 3 // convert a machine page
357 // to the corresponding
358 // pseudo physical page frame
359 // number of the caller domain
360 #define IA64_DOM0VP_zap_physmap 17 // unmap and free pages
361 // contained in the specified
362 // pseudo physical region
363 #define IA64_DOM0VP_add_physmap 18 // assigne machine page frane
364 // to dom0's pseudo physical
366 // flags for page assignement to pseudo physical address space
367 #define _ASSIGN_readonly 0
368 #define ASSIGN_readonly (1UL << _ASSIGN_readonly)
369 #define ASSIGN_writable (0UL << _ASSIGN_readonly) // dummy flag
370 /* Internal only: memory attribute must be WC/UC/UCE. */
371 #define _ASSIGN_nocache 1
372 #define ASSIGN_nocache (1UL << _ASSIGN_nocache)
374 /* This structure has the same layout of struct ia64_boot_param, defined in
375 <asm/system.h>. It is redefined here to ease use. */
376 struct xen_ia64_boot_param {
377 unsigned long command_line; /* physical address of cmd line args */
378 unsigned long efi_systab; /* physical address of EFI system table */
379 unsigned long efi_memmap; /* physical address of EFI memory map */
380 unsigned long efi_memmap_size; /* size of EFI memory map */
381 unsigned long efi_memdesc_size; /* size of an EFI memory map descriptor */
382 unsigned int efi_memdesc_version; /* memory descriptor version */
384 unsigned short num_cols; /* number of columns on console. */
385 unsigned short num_rows; /* number of rows on console. */
386 unsigned short orig_x; /* cursor's x position */
387 unsigned short orig_y; /* cursor's y position */
389 unsigned long fpswa; /* physical address of the fpswa interface */
390 unsigned long initrd_start;
391 unsigned long initrd_size;
392 unsigned long domain_start; /* va where the boot time domain begins */
393 unsigned long domain_size; /* how big is the boot domain */
396 #endif /* !__ASSEMBLY__ */
398 /* Address of shared_info in domain virtual space.
399 This is the default address, for compatibility only. */
400 #define XSI_BASE 0xf100000000000000
402 /* Size of the shared_info area (this is not related to page size). */
404 #define XSI_SIZE (1 << XSI_SHIFT)
405 /* Log size of mapped_regs area (64 KB - only 4KB is used). */
406 #define XMAPPEDREGS_SHIFT 12
407 /* Offset of XASI (Xen arch shared info) wrt XSI_BASE. */
408 #define XMAPPEDREGS_OFS XSI_SIZE
411 #define HYPERPRIVOP_RFI 0x1
412 #define HYPERPRIVOP_RSM_DT 0x2
413 #define HYPERPRIVOP_SSM_DT 0x3
414 #define HYPERPRIVOP_COVER 0x4
415 #define HYPERPRIVOP_ITC_D 0x5
416 #define HYPERPRIVOP_ITC_I 0x6
417 #define HYPERPRIVOP_SSM_I 0x7
418 #define HYPERPRIVOP_GET_IVR 0x8
419 #define HYPERPRIVOP_GET_TPR 0x9
420 #define HYPERPRIVOP_SET_TPR 0xa
421 #define HYPERPRIVOP_EOI 0xb
422 #define HYPERPRIVOP_SET_ITM 0xc
423 #define HYPERPRIVOP_THASH 0xd
424 #define HYPERPRIVOP_PTC_GA 0xe
425 #define HYPERPRIVOP_ITR_D 0xf
426 #define HYPERPRIVOP_GET_RR 0x10
427 #define HYPERPRIVOP_SET_RR 0x11
428 #define HYPERPRIVOP_SET_KR 0x12
429 #define HYPERPRIVOP_FC 0x13
430 #define HYPERPRIVOP_GET_CPUID 0x14
431 #define HYPERPRIVOP_GET_PMD 0x15
432 #define HYPERPRIVOP_GET_EFLAG 0x16
433 #define HYPERPRIVOP_SET_EFLAG 0x17
434 #define HYPERPRIVOP_RSM_BE 0x18
435 #define HYPERPRIVOP_GET_PSR 0x19
436 #define HYPERPRIVOP_MAX 0x19
438 #endif /* __HYPERVISOR_IF_IA64_H__ */
446 * indent-tabs-mode: nil