This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / include / xen / interface / arch-ia64.h
1 /******************************************************************************
2  * arch-ia64/hypervisor-if.h
3  * 
4  * Guest OS interface to IA64 Xen.
5  */
6
7 #ifndef __HYPERVISOR_IF_IA64_H__
8 #define __HYPERVISOR_IF_IA64_H__
9
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
14 #else
15 #define __DEFINE_XEN_GUEST_HANDLE(name, type) \
16     typedef type * __guest_handle_ ## name
17 #endif
18
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)
22 #ifdef __XEN_TOOLS__
23 #define get_xen_guest_handle(val, hnd)  do { val = (hnd).p; } while (0)
24 #endif
25
26 #ifndef __ASSEMBLY__
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);
35
36 typedef unsigned long xen_pfn_t;
37 DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
38 #endif
39
40 /* Arch specific VIRQs definition */
41 #define VIRQ_ITC        VIRQ_ARCH_0 /* V. Virtual itc timer */
42
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
46
47 #ifndef __ASSEMBLY__
48
49 typedef unsigned long xen_ulong_t;
50
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 */
59
60 #define GPFN_IO_MASK     (7UL << 56)  /* Guest pfn is I/O type */
61 #define GPFN_INV_MASK    (31UL << 59) /* Guest pfn is invalid */
62
63 #define INVALID_MFN       (~0UL)
64
65 #define MEM_G   (1UL << 30)
66 #define MEM_M   (1UL << 20)
67
68 #define MMIO_START       (3 * MEM_G)
69 #define MMIO_SIZE        (512 * MEM_M)
70
71 #define VGA_IO_START     0xA0000UL
72 #define VGA_IO_SIZE      0x20000
73
74 #define LEGACY_IO_START  (MMIO_START + MMIO_SIZE)
75 #define LEGACY_IO_SIZE   (64*MEM_M)
76
77 #define IO_PAGE_START (LEGACY_IO_START + LEGACY_IO_SIZE)
78 #define IO_PAGE_SIZE  PAGE_SIZE
79
80 #define STORE_PAGE_START (IO_PAGE_START + IO_PAGE_SIZE)
81 #define STORE_PAGE_SIZE  PAGE_SIZE
82
83 #define IO_SAPIC_START   0xfec00000UL
84 #define IO_SAPIC_SIZE    0x100000
85
86 #define PIB_START 0xfee00000UL
87 #define PIB_SIZE 0x200000
88
89 #define GFW_START        (4*MEM_G -16*MEM_M)
90 #define GFW_SIZE         (16*MEM_M)
91
92 struct pt_fpreg {
93     union {
94         unsigned long bits[2];
95         long double __dummy;    /* force 16-byte alignment */
96     } u;
97 };
98
99 struct cpu_user_regs {
100     /* The following registers are saved by SAVE_MIN: */
101     unsigned long b6;  /* scratch */
102     unsigned long b7;  /* scratch */
103
104     unsigned long ar_csd; /* used by cmp8xchg16 (scratch) */
105     unsigned long ar_ssd; /* reserved for future use (scratch) */
106
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) */
111
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 */
115
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 */
122
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 */
126
127     unsigned long r1;  /* the gp pointer */
128     unsigned long r12; /* interrupted task's memory stack pointer */
129     unsigned long r13; /* thread pointer */
130
131     unsigned long ar_fpsr;  /* floating point status (preserved) */
132     unsigned long r15;  /* scratch */
133
134  /* The remaining registers are NOT saved for system calls.  */
135
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) */
156
157     /*
158      * Floating point registers that the kernel considers scratch:
159      */
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 */
172
173 };
174 typedef struct cpu_user_regs cpu_user_regs_t;
175
176 union vac {
177     unsigned long value;
178     struct {
179         int a_int:1;
180         int a_from_int_cr:1;
181         int a_to_int_cr:1;
182         int a_from_psr:1;
183         int a_from_cpuid:1;
184         int a_cover:1;
185         int a_bsw:1;
186         long reserved:57;
187     };
188 };
189 typedef union vac vac_t;
190
191 union vdc {
192     unsigned long value;
193     struct {
194         int d_vmsw:1;
195         int d_extint:1;
196         int d_ibr_dbr:1;
197         int d_pmc:1;
198         int d_to_pmd:1;
199         int d_itm:1;
200         long reserved:58;
201     };
202 };
203 typedef union vdc vdc_t;
204
205 struct mapped_regs {
206     union vac   vac;
207     union vdc   vdc;
208     unsigned long  virt_env_vaddr;
209     unsigned long  reserved1[29];
210     unsigned long  vhpi;
211     unsigned long  reserved2[95];
212     union {
213         unsigned long  vgr[16];
214         unsigned long bank1_regs[16]; // bank1 regs (r16-r31) when bank0 active
215     };
216     union {
217         unsigned long  vbgr[16];
218         unsigned long bank0_regs[16]; // bank0 regs (r16-r31) when bank1 active
219     };
220     unsigned long  vnat;
221     unsigned long  vbnat;
222     unsigned long  vcpuid[5];
223     unsigned long  reserved3[11];
224     unsigned long  vpsr;
225     unsigned long  vpr;
226     unsigned long  reserved4[76];
227     union {
228         unsigned long  vcr[128];
229         struct {
230             unsigned long dcr;  // CR0
231             unsigned long itm;
232             unsigned long iva;
233             unsigned long rsv1[5];
234             unsigned long pta;  // CR8
235             unsigned long rsv2[7];
236             unsigned long ipsr;  // CR16
237             unsigned long isr;
238             unsigned long rsv3;
239             unsigned long iip;
240             unsigned long ifa;
241             unsigned long itir;
242             unsigned long iipa;
243             unsigned long ifs;
244             unsigned long iim;  // CR24
245             unsigned long iha;
246             unsigned long rsv4[38];
247             unsigned long lid;  // CR64
248             unsigned long ivr;
249             unsigned long tpr;
250             unsigned long eoi;
251             unsigned long irr[4];
252             unsigned long itv;  // CR72
253             unsigned long pmv;
254             unsigned long cmcv;
255             unsigned long rsv5[5];
256             unsigned long lrr0;  // CR80
257             unsigned long lrr1;
258             unsigned long rsv6[46];
259         };
260     };
261     union {
262         unsigned long  reserved5[128];
263         struct {
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
270              */
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)
283         };
284     };
285 };
286 typedef struct mapped_regs mapped_regs_t;
287
288 struct vpd {
289     struct mapped_regs vpd_low;
290     unsigned long  reserved6[3456];
291     unsigned long  vmm_avail[128];
292     unsigned long  reserved7[4096];
293 };
294 typedef struct vpd vpd_t;
295
296 struct arch_vcpu_info {
297 };
298 typedef struct arch_vcpu_info arch_vcpu_info_t;
299
300 struct arch_shared_info {
301     /* PFN of the start_info page.  */
302     unsigned long start_info_pfn;
303
304     /* Interrupt vector for event channel.  */
305     int evtchn_vector;
306
307     uint64_t pad[32];
308 };
309 typedef struct arch_shared_info arch_shared_info_t;
310
311 typedef unsigned long xen_callback_t;
312
313 struct ia64_tr_entry {
314     unsigned long pte;
315     unsigned long itir;
316     unsigned long vadr;
317     unsigned long rid;
318 };
319
320 struct vcpu_extra_regs {
321     struct ia64_tr_entry itrs[8];
322     struct ia64_tr_entry dtrs[8];
323     unsigned long iva;
324     unsigned long dcr;
325     unsigned long event_callback_ip;
326 };
327
328 struct vcpu_guest_context {
329 #define VGCF_EXTRA_REGS (1<<1)  /* Get/Set extra regs.  */
330     unsigned long flags;       /* VGCF_* flags */
331
332     struct cpu_user_regs user_regs;
333     struct vcpu_extra_regs extra_regs;
334     unsigned long privregs_pfn;
335 };
336 typedef struct vcpu_guest_context vcpu_guest_context_t;
337 DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
338
339 // dom0 vp op
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
343                                                 // address space.
344                                                 // currently physical
345                                                 // assignedg address equals to
346                                                 // machine address
347 #define IA64_DOM0VP_phystomach          1       // convert a pseudo physical
348                                                 // page frame number
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
356                                                 // frame number
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
365                                                 // address space.
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)
373
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 */
383         struct {
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 */
388         } console_info;
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 */
394 };
395
396 #endif /* !__ASSEMBLY__ */
397
398 /* Address of shared_info in domain virtual space.
399    This is the default address, for compatibility only.  */
400 #define XSI_BASE                        0xf100000000000000
401
402 /* Size of the shared_info area (this is not related to page size).  */
403 #define XSI_SHIFT                       14
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
409
410 /* Hyperprivops.  */
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
437
438 #endif /* __HYPERVISOR_IF_IA64_H__ */
439
440 /*
441  * Local variables:
442  * mode: C
443  * c-set-style: "BSD"
444  * c-basic-offset: 4
445  * tab-width: 4
446  * indent-tabs-mode: nil
447  * End:
448  */