2008-04-16 23:28:09 -05:00
/*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License , version 2 , as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that 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 , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*
* Copyright IBM Corp . 2007
*
* Authors : Hollis Blanchard < hollisb @ us . ibm . com >
*/
# ifndef __POWERPC_KVM_HOST_H__
# define __POWERPC_KVM_HOST_H__
# include <linux/mutex.h>
2009-11-02 12:02:31 +00:00
# include <linux/hrtimer.h>
# include <linux/interrupt.h>
2008-04-16 23:28:09 -05:00
# include <linux/types.h>
# include <linux/kvm_types.h>
2010-07-29 14:47:42 +02:00
# include <linux/kvm_para.h>
2008-04-16 23:28:09 -05:00
# include <asm/kvm_asm.h>
# define KVM_MAX_VCPUS 1
# define KVM_MEMORY_SLOTS 32
/* memory slots that does not exposed to userspace */
# define KVM_PRIVATE_MEM_SLOTS 4
2008-05-30 16:05:56 +02:00
# define KVM_COALESCED_MMIO_PAGE_OFFSET 1
2008-04-16 23:28:09 -05:00
/* We don't currently support large pages. */
2010-07-01 16:00:11 +02:00
# define KVM_HPAGE_GFN_SHIFT(x) 0
2009-06-19 15:16:23 +02:00
# define KVM_NR_PAGE_SIZES 1
# define KVM_PAGES_PER_HPAGE(x) (1UL<<31)
2008-04-16 23:28:09 -05:00
2010-06-30 15:18:46 +02:00
# define HPTEG_CACHE_NUM (1 << 15)
# define HPTEG_HASH_BITS_PTE 13
2010-07-29 15:04:19 +02:00
# define HPTEG_HASH_BITS_PTE_LONG 12
2010-06-30 15:18:46 +02:00
# define HPTEG_HASH_BITS_VPTE 13
# define HPTEG_HASH_BITS_VPTE_LONG 5
# define HPTEG_HASH_NUM_PTE (1 << HPTEG_HASH_BITS_PTE)
2010-07-29 15:04:19 +02:00
# define HPTEG_HASH_NUM_PTE_LONG (1 << HPTEG_HASH_BITS_PTE_LONG)
2010-06-30 15:18:46 +02:00
# define HPTEG_HASH_NUM_VPTE (1 << HPTEG_HASH_BITS_VPTE)
# define HPTEG_HASH_NUM_VPTE_LONG (1 << HPTEG_HASH_BITS_VPTE_LONG)
2009-10-30 05:47:04 +00:00
2010-07-29 14:47:52 +02:00
/* Physical Address Mask - allowed range of real mode RAM access */
# define KVM_PAM 0x0fffffffffffffffULL
2008-04-16 23:28:09 -05:00
struct kvm ;
struct kvm_run ;
struct kvm_vcpu ;
struct kvm_vm_stat {
u32 remote_tlb_flush ;
} ;
struct kvm_vcpu_stat {
u32 sum_exits ;
u32 mmio_exits ;
u32 dcr_exits ;
u32 signal_exits ;
u32 light_exits ;
/* Account for special types of light exits: */
u32 itlb_real_miss_exits ;
u32 itlb_virt_miss_exits ;
u32 dtlb_real_miss_exits ;
u32 dtlb_virt_miss_exits ;
u32 syscall_exits ;
u32 isi_exits ;
u32 dsi_exits ;
u32 emulated_inst_exits ;
u32 dec_exits ;
u32 ext_intr_exits ;
2008-04-25 17:55:49 -05:00
u32 halt_wakeup ;
2010-04-16 00:11:42 +02:00
# ifdef CONFIG_PPC_BOOK3S
2009-10-30 05:47:04 +00:00
u32 pf_storage ;
u32 pf_instruc ;
u32 sp_storage ;
u32 sp_instruc ;
u32 queue_intr ;
u32 ld ;
u32 ld_slow ;
u32 st ;
u32 st_slow ;
# endif
2008-04-16 23:28:09 -05:00
} ;
2008-12-02 15:51:57 -06:00
enum kvm_exit_types {
MMIO_EXITS ,
DCR_EXITS ,
SIGNAL_EXITS ,
ITLB_REAL_MISS_EXITS ,
ITLB_VIRT_MISS_EXITS ,
DTLB_REAL_MISS_EXITS ,
DTLB_VIRT_MISS_EXITS ,
SYSCALL_EXITS ,
ISI_EXITS ,
DSI_EXITS ,
EMULATED_INST_EXITS ,
EMULATED_MTMSRWE_EXITS ,
EMULATED_WRTEE_EXITS ,
EMULATED_MTSPR_EXITS ,
EMULATED_MFSPR_EXITS ,
EMULATED_MTMSR_EXITS ,
EMULATED_MFMSR_EXITS ,
EMULATED_TLBSX_EXITS ,
EMULATED_TLBWE_EXITS ,
EMULATED_RFI_EXITS ,
DEC_EXITS ,
EXT_INTR_EXITS ,
HALT_WAKEUP ,
USR_PR_INST ,
FP_UNAVAIL ,
DEBUG_EXITS ,
TIMEINGUEST ,
__NUMBER_OF_KVM_EXIT_TYPES
} ;
/* allow access to big endian 32bit upper/lower parts and 64bit var */
2008-12-02 15:51:58 -06:00
struct kvmppc_exit_timing {
2008-12-02 15:51:57 -06:00
union {
u64 tv64 ;
struct {
u32 tbu , tbl ;
} tv32 ;
} ;
} ;
2008-04-16 23:28:09 -05:00
struct kvm_arch {
} ;
2009-10-30 05:47:04 +00:00
struct kvmppc_pte {
2010-04-20 02:49:46 +02:00
ulong eaddr ;
2009-10-30 05:47:04 +00:00
u64 vpage ;
2010-04-20 02:49:46 +02:00
ulong raddr ;
2010-03-24 21:48:36 +01:00
bool may_read : 1 ;
bool may_write : 1 ;
bool may_execute : 1 ;
2009-10-30 05:47:04 +00:00
} ;
struct kvmppc_mmu {
/* book3s_64 only */
void ( * slbmte ) ( struct kvm_vcpu * vcpu , u64 rb , u64 rs ) ;
u64 ( * slbmfee ) ( struct kvm_vcpu * vcpu , u64 slb_nr ) ;
u64 ( * slbmfev ) ( struct kvm_vcpu * vcpu , u64 slb_nr ) ;
void ( * slbie ) ( struct kvm_vcpu * vcpu , u64 slb_nr ) ;
void ( * slbia ) ( struct kvm_vcpu * vcpu ) ;
/* book3s */
void ( * mtsrin ) ( struct kvm_vcpu * vcpu , u32 srnum , ulong value ) ;
u32 ( * mfsrin ) ( struct kvm_vcpu * vcpu , u32 srnum ) ;
int ( * xlate ) ( struct kvm_vcpu * vcpu , gva_t eaddr , struct kvmppc_pte * pte , bool data ) ;
void ( * reset_msr ) ( struct kvm_vcpu * vcpu ) ;
void ( * tlbie ) ( struct kvm_vcpu * vcpu , ulong addr , bool large ) ;
2010-04-20 02:49:46 +02:00
int ( * esid_to_vsid ) ( struct kvm_vcpu * vcpu , ulong esid , u64 * vsid ) ;
2009-10-30 05:47:04 +00:00
u64 ( * ea_to_vp ) ( struct kvm_vcpu * vcpu , gva_t eaddr , bool data ) ;
bool ( * is_dcbz32 ) ( struct kvm_vcpu * vcpu ) ;
} ;
struct hpte_cache {
2010-06-30 15:18:46 +02:00
struct hlist_node list_pte ;
2010-07-29 15:04:19 +02:00
struct hlist_node list_pte_long ;
2010-06-30 15:18:46 +02:00
struct hlist_node list_vpte ;
struct hlist_node list_vpte_long ;
2010-07-29 15:04:17 +02:00
struct rcu_head rcu_head ;
2009-10-30 05:47:04 +00:00
u64 host_va ;
u64 pfn ;
ulong slot ;
struct kvmppc_pte pte ;
} ;
2008-04-16 23:28:09 -05:00
struct kvm_vcpu_arch {
2009-10-30 05:47:04 +00:00
ulong host_stack ;
2008-04-16 23:28:09 -05:00
u32 host_pid ;
2010-04-16 00:11:42 +02:00
# ifdef CONFIG_PPC_BOOK3S
2009-10-30 05:47:04 +00:00
ulong host_msr ;
ulong host_r2 ;
void * host_retip ;
ulong trampoline_lowmem ;
ulong trampoline_enter ;
ulong highmem_handler ;
2010-01-08 02:58:06 +01:00
ulong rmcall ;
2009-10-30 05:47:04 +00:00
ulong host_paca_phys ;
struct kvmppc_mmu mmu ;
# endif
2008-04-16 23:28:09 -05:00
2008-11-05 09:36:19 -06:00
ulong gpr [ 32 ] ;
2008-04-16 23:28:09 -05:00
2010-01-15 14:49:11 +01:00
u64 fpr [ 32 ] ;
2010-02-19 11:00:28 +01:00
u64 fpscr ;
2010-01-15 14:49:11 +01:00
# ifdef CONFIG_ALTIVEC
vector128 vr [ 32 ] ;
vector128 vscr ;
# endif
# ifdef CONFIG_VSX
u64 vsr [ 32 ] ;
# endif
2010-02-19 11:00:27 +01:00
# ifdef CONFIG_PPC_BOOK3S
/* For Gekko paired singles */
u32 qpr [ 32 ] ;
# endif
2010-04-16 00:11:44 +02:00
# ifdef CONFIG_BOOKE
2008-11-05 09:36:19 -06:00
ulong pc ;
ulong ctr ;
ulong lr ;
2010-01-08 02:58:03 +01:00
2008-11-05 09:36:19 -06:00
ulong xer ;
2010-01-08 02:58:03 +01:00
u32 cr ;
# endif
2008-04-16 23:28:09 -05:00
2010-04-16 00:11:42 +02:00
# ifdef CONFIG_PPC_BOOK3S
2009-10-30 05:47:04 +00:00
ulong shadow_msr ;
ulong hflags ;
2010-01-15 14:49:11 +01:00
ulong guest_owned_ext ;
2009-10-30 05:47:04 +00:00
# endif
2011-04-27 17:24:10 -05:00
u32 vrsave ; /* also USPRG0 */
2008-04-16 23:28:09 -05:00
u32 mmucr ;
2008-11-05 09:36:19 -06:00
ulong sprg4 ;
ulong sprg5 ;
ulong sprg6 ;
ulong sprg7 ;
ulong csrr0 ;
ulong csrr1 ;
ulong dsrr0 ;
ulong dsrr1 ;
ulong esr ;
2008-04-16 23:28:09 -05:00
u32 dec ;
u32 decar ;
u32 tbl ;
u32 tbu ;
u32 tcr ;
u32 tsr ;
2009-01-03 16:23:13 -06:00
u32 ivor [ 64 ] ;
2008-11-05 09:36:19 -06:00
ulong ivpr ;
2008-04-16 23:28:09 -05:00
u32 pir ;
2009-10-30 05:47:04 +00:00
u32 pvr ;
2008-07-25 13:54:53 -05:00
u32 shadow_pid ;
2008-04-16 23:28:09 -05:00
u32 pid ;
2008-07-25 13:54:53 -05:00
u32 swap_pid ;
2008-04-16 23:28:09 -05:00
u32 ccr0 ;
u32 ccr1 ;
u32 dbcr0 ;
u32 dbcr1 ;
2009-01-03 16:23:07 -06:00
u32 dbsr ;
2008-04-16 23:28:09 -05:00
2008-12-02 15:51:57 -06:00
# ifdef CONFIG_KVM_EXIT_TIMING
2011-03-25 10:32:13 +05:30
struct mutex exit_timing_lock ;
2008-12-02 15:51:58 -06:00
struct kvmppc_exit_timing timing_exit ;
struct kvmppc_exit_timing timing_last_enter ;
2008-12-02 15:51:57 -06:00
u32 last_exit_type ;
u32 timing_count_type [ __NUMBER_OF_KVM_EXIT_TYPES ] ;
u64 timing_sum_duration [ __NUMBER_OF_KVM_EXIT_TYPES ] ;
u64 timing_sum_quad_duration [ __NUMBER_OF_KVM_EXIT_TYPES ] ;
u64 timing_min_duration [ __NUMBER_OF_KVM_EXIT_TYPES ] ;
u64 timing_max_duration [ __NUMBER_OF_KVM_EXIT_TYPES ] ;
u64 timing_last_exit ;
struct dentry * debugfs_exit_timing ;
# endif
2010-04-16 00:11:44 +02:00
# ifdef CONFIG_BOOKE
2008-04-16 23:28:09 -05:00
u32 last_inst ;
2008-11-05 09:36:19 -06:00
ulong fault_dear ;
ulong fault_esr ;
2010-02-02 19:44:35 +08:00
ulong queued_dear ;
ulong queued_esr ;
2010-04-16 00:11:44 +02:00
# endif
2008-04-16 23:28:09 -05:00
gpa_t paddr_accessed ;
u8 io_gpr ; /* GPR used as IO source/target */
u8 mmio_is_bigendian ;
2010-02-19 11:00:30 +01:00
u8 mmio_sign_extend ;
2008-04-16 23:28:09 -05:00
u8 dcr_needed ;
u8 dcr_is_write ;
2010-03-24 21:48:30 +01:00
u8 osi_needed ;
u8 osi_enabled ;
2008-04-16 23:28:09 -05:00
u32 cpr0_cfgaddr ; /* holds the last set cpr0_cfgaddr */
2009-11-02 12:02:31 +00:00
struct hrtimer dec_timer ;
struct tasklet_struct tasklet ;
2009-10-30 05:47:04 +00:00
u64 dec_jiffies ;
2008-04-16 23:28:09 -05:00
unsigned long pending_exceptions ;
2010-07-29 14:47:42 +02:00
struct kvm_vcpu_arch_shared * shared ;
2010-07-29 14:47:53 +02:00
unsigned long magic_page_pa ; /* phys addr to map the magic page to */
unsigned long magic_page_ea ; /* effect. addr to map the magic page to */
2009-10-30 05:47:04 +00:00
2010-04-16 00:11:42 +02:00
# ifdef CONFIG_PPC_BOOK3S
2010-06-30 15:18:46 +02:00
struct hlist_head hpte_hash_pte [ HPTEG_HASH_NUM_PTE ] ;
2010-07-29 15:04:19 +02:00
struct hlist_head hpte_hash_pte_long [ HPTEG_HASH_NUM_PTE_LONG ] ;
2010-06-30 15:18:46 +02:00
struct hlist_head hpte_hash_vpte [ HPTEG_HASH_NUM_VPTE ] ;
struct hlist_head hpte_hash_vpte_long [ HPTEG_HASH_NUM_VPTE_LONG ] ;
int hpte_cache_count ;
2010-07-29 15:04:17 +02:00
spinlock_t mmu_lock ;
2009-10-30 05:47:04 +00:00
# endif
2008-04-16 23:28:09 -05:00
} ;
# endif /* __POWERPC_KVM_HOST_H__ */