|  | #ifndef __ASM_IA64_KVM_H | 
|  | #define __ASM_IA64_KVM_H | 
|  |  | 
|  | /* | 
|  | * kvm structure definitions  for ia64 | 
|  | * | 
|  | * Copyright (C) 2007 Xiantao Zhang <xiantao.zhang@intel.com> | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or modify it | 
|  | * under the terms and conditions of the GNU General Public License, | 
|  | * version 2, as published by the Free Software Foundation. | 
|  | * | 
|  | * This program is distributed in the hope it will be useful, but WITHOUT | 
|  | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|  | * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | 
|  | * more details. | 
|  | * | 
|  | * You should have received a copy of the GNU General Public License along with | 
|  | * this program; if not, write to the Free Software Foundation, Inc., 59 Temple | 
|  | * Place - Suite 330, Boston, MA 02111-1307 USA. | 
|  | * | 
|  | */ | 
|  |  | 
|  | #include <linux/types.h> | 
|  | #include <linux/ioctl.h> | 
|  |  | 
|  | /* Select x86 specific features in <linux/kvm.h> */ | 
|  | #define __KVM_HAVE_IOAPIC | 
|  | #define __KVM_HAVE_IRQ_LINE | 
|  | #define __KVM_HAVE_DEVICE_ASSIGNMENT | 
|  |  | 
|  | /* Architectural interrupt line count. */ | 
|  | #define KVM_NR_INTERRUPTS 256 | 
|  |  | 
|  | #define KVM_IOAPIC_NUM_PINS  48 | 
|  |  | 
|  | struct kvm_ioapic_state { | 
|  | __u64 base_address; | 
|  | __u32 ioregsel; | 
|  | __u32 id; | 
|  | __u32 irr; | 
|  | __u32 pad; | 
|  | union { | 
|  | __u64 bits; | 
|  | struct { | 
|  | __u8 vector; | 
|  | __u8 delivery_mode:3; | 
|  | __u8 dest_mode:1; | 
|  | __u8 delivery_status:1; | 
|  | __u8 polarity:1; | 
|  | __u8 remote_irr:1; | 
|  | __u8 trig_mode:1; | 
|  | __u8 mask:1; | 
|  | __u8 reserve:7; | 
|  | __u8 reserved[4]; | 
|  | __u8 dest_id; | 
|  | } fields; | 
|  | } redirtbl[KVM_IOAPIC_NUM_PINS]; | 
|  | }; | 
|  |  | 
|  | #define KVM_IRQCHIP_PIC_MASTER   0 | 
|  | #define KVM_IRQCHIP_PIC_SLAVE    1 | 
|  | #define KVM_IRQCHIP_IOAPIC       2 | 
|  | #define KVM_NR_IRQCHIPS          3 | 
|  |  | 
|  | #define KVM_CONTEXT_SIZE	8*1024 | 
|  |  | 
|  | struct kvm_fpreg { | 
|  | union { | 
|  | unsigned long bits[2]; | 
|  | long double __dummy;	/* force 16-byte alignment */ | 
|  | } u; | 
|  | }; | 
|  |  | 
|  | union context { | 
|  | /* 8K size */ | 
|  | char	dummy[KVM_CONTEXT_SIZE]; | 
|  | struct { | 
|  | unsigned long       psr; | 
|  | unsigned long       pr; | 
|  | unsigned long       caller_unat; | 
|  | unsigned long       pad; | 
|  | unsigned long       gr[32]; | 
|  | unsigned long       ar[128]; | 
|  | unsigned long       br[8]; | 
|  | unsigned long       cr[128]; | 
|  | unsigned long       rr[8]; | 
|  | unsigned long       ibr[8]; | 
|  | unsigned long       dbr[8]; | 
|  | unsigned long       pkr[8]; | 
|  | struct kvm_fpreg   fr[128]; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | struct thash_data { | 
|  | union { | 
|  | struct { | 
|  | unsigned long p    :  1; /* 0 */ | 
|  | unsigned long rv1  :  1; /* 1 */ | 
|  | unsigned long ma   :  3; /* 2-4 */ | 
|  | unsigned long a    :  1; /* 5 */ | 
|  | unsigned long d    :  1; /* 6 */ | 
|  | unsigned long pl   :  2; /* 7-8 */ | 
|  | unsigned long ar   :  3; /* 9-11 */ | 
|  | unsigned long ppn  : 38; /* 12-49 */ | 
|  | unsigned long rv2  :  2; /* 50-51 */ | 
|  | unsigned long ed   :  1; /* 52 */ | 
|  | unsigned long ig1  : 11; /* 53-63 */ | 
|  | }; | 
|  | struct { | 
|  | unsigned long __rv1 : 53;     /* 0-52 */ | 
|  | unsigned long contiguous : 1; /*53 */ | 
|  | unsigned long tc : 1;         /* 54 TR or TC */ | 
|  | unsigned long cl : 1; | 
|  | /* 55 I side or D side cache line */ | 
|  | unsigned long len  :  4;      /* 56-59 */ | 
|  | unsigned long io  : 1;	/* 60 entry is for io or not */ | 
|  | unsigned long nomap : 1; | 
|  | /* 61 entry cann't be inserted into machine TLB.*/ | 
|  | unsigned long checked : 1; | 
|  | /* 62 for VTLB/VHPT sanity check */ | 
|  | unsigned long invalid : 1; | 
|  | /* 63 invalid entry */ | 
|  | }; | 
|  | unsigned long page_flags; | 
|  | };                  /* same for VHPT and TLB */ | 
|  |  | 
|  | union { | 
|  | struct { | 
|  | unsigned long rv3  :  2; | 
|  | unsigned long ps   :  6; | 
|  | unsigned long key  : 24; | 
|  | unsigned long rv4  : 32; | 
|  | }; | 
|  | unsigned long itir; | 
|  | }; | 
|  | union { | 
|  | struct { | 
|  | unsigned long ig2  :  12; | 
|  | unsigned long vpn  :  49; | 
|  | unsigned long vrn  :   3; | 
|  | }; | 
|  | unsigned long ifa; | 
|  | unsigned long vadr; | 
|  | struct { | 
|  | unsigned long tag  :  63; | 
|  | unsigned long ti   :  1; | 
|  | }; | 
|  | unsigned long etag; | 
|  | }; | 
|  | union { | 
|  | struct thash_data *next; | 
|  | unsigned long rid; | 
|  | unsigned long gpaddr; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | #define	NITRS	8 | 
|  | #define NDTRS	8 | 
|  |  | 
|  | struct saved_vpd { | 
|  | unsigned long  vhpi; | 
|  | unsigned long  vgr[16]; | 
|  | unsigned long  vbgr[16]; | 
|  | unsigned long  vnat; | 
|  | unsigned long  vbnat; | 
|  | unsigned long  vcpuid[5]; | 
|  | unsigned long  vpsr; | 
|  | unsigned long  vpr; | 
|  | union { | 
|  | unsigned long  vcr[128]; | 
|  | struct { | 
|  | unsigned long dcr; | 
|  | unsigned long itm; | 
|  | unsigned long iva; | 
|  | unsigned long rsv1[5]; | 
|  | unsigned long pta; | 
|  | unsigned long rsv2[7]; | 
|  | unsigned long ipsr; | 
|  | unsigned long isr; | 
|  | unsigned long rsv3; | 
|  | unsigned long iip; | 
|  | unsigned long ifa; | 
|  | unsigned long itir; | 
|  | unsigned long iipa; | 
|  | unsigned long ifs; | 
|  | unsigned long iim; | 
|  | unsigned long iha; | 
|  | unsigned long rsv4[38]; | 
|  | unsigned long lid; | 
|  | unsigned long ivr; | 
|  | unsigned long tpr; | 
|  | unsigned long eoi; | 
|  | unsigned long irr[4]; | 
|  | unsigned long itv; | 
|  | unsigned long pmv; | 
|  | unsigned long cmcv; | 
|  | unsigned long rsv5[5]; | 
|  | unsigned long lrr0; | 
|  | unsigned long lrr1; | 
|  | unsigned long rsv6[46]; | 
|  | }; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | struct kvm_regs { | 
|  | struct saved_vpd vpd; | 
|  | /*Arch-regs*/ | 
|  | int mp_state; | 
|  | unsigned long vmm_rr; | 
|  | /* TR and TC.  */ | 
|  | struct thash_data itrs[NITRS]; | 
|  | struct thash_data dtrs[NDTRS]; | 
|  | /* Bit is set if there is a tr/tc for the region.  */ | 
|  | unsigned char itr_regions; | 
|  | unsigned char dtr_regions; | 
|  | unsigned char tc_regions; | 
|  |  | 
|  | char irq_check; | 
|  | unsigned long saved_itc; | 
|  | unsigned long itc_check; | 
|  | unsigned long timer_check; | 
|  | unsigned long timer_pending; | 
|  | unsigned long last_itc; | 
|  |  | 
|  | unsigned long vrr[8]; | 
|  | unsigned long ibr[8]; | 
|  | unsigned long dbr[8]; | 
|  | unsigned long insvc[4];		/* Interrupt in service.  */ | 
|  | unsigned long xtp; | 
|  |  | 
|  | unsigned long metaphysical_rr0; /* from kvm_arch (so is pinned) */ | 
|  | unsigned long metaphysical_rr4;	/* from kvm_arch (so is pinned) */ | 
|  | unsigned long metaphysical_saved_rr0; /* from kvm_arch          */ | 
|  | unsigned long metaphysical_saved_rr4; /* from kvm_arch          */ | 
|  | unsigned long fp_psr;       /*used for lazy float register */ | 
|  | unsigned long saved_gp; | 
|  | /*for phycial  emulation */ | 
|  |  | 
|  | union context saved_guest; | 
|  |  | 
|  | unsigned long reserved[64];	/* for future use */ | 
|  | }; | 
|  |  | 
|  | struct kvm_sregs { | 
|  | }; | 
|  |  | 
|  | struct kvm_fpu { | 
|  | }; | 
|  |  | 
|  | #define KVM_IA64_VCPU_STACK_SHIFT	16 | 
|  | #define KVM_IA64_VCPU_STACK_SIZE	(1UL << KVM_IA64_VCPU_STACK_SHIFT) | 
|  |  | 
|  | struct kvm_ia64_vcpu_stack { | 
|  | unsigned char stack[KVM_IA64_VCPU_STACK_SIZE]; | 
|  | }; | 
|  |  | 
|  | struct kvm_debug_exit_arch { | 
|  | }; | 
|  |  | 
|  | /* for KVM_SET_GUEST_DEBUG */ | 
|  | struct kvm_guest_debug_arch { | 
|  | }; | 
|  |  | 
|  | /* definition of registers in kvm_run */ | 
|  | struct kvm_sync_regs { | 
|  | }; | 
|  |  | 
|  | #endif |