Re: [PATCH 16/18] KVM/MIPS32-VZ: Add VZ-ASE support to KVM/MIPS data structures.

2013-05-28 Thread Paolo Bonzini
Il 19/05/2013 07:47, Sanjay Lal ha scritto:
> Signed-off-by: Sanjay Lal 
> ---
>  arch/mips/include/asm/kvm_host.h | 244 
> ++-
>  1 file changed, 191 insertions(+), 53 deletions(-)
> 
> diff --git a/arch/mips/include/asm/kvm_host.h 
> b/arch/mips/include/asm/kvm_host.h
> index e68781e..c92e297 100644
> --- a/arch/mips/include/asm/kvm_host.h
> +++ b/arch/mips/include/asm/kvm_host.h
> @@ -19,21 +19,28 @@
>  #include 
>  #include 
>  
> +#ifdef CONFIG_KVM_MIPS_VZ
> +#include 
> +#endif

No need to make the inclusion conditional.

>  
> -#define KVM_MAX_VCPUS1
> -#define KVM_USER_MEM_SLOTS   8
> +#define KVM_MAX_VCPUS 8
> +#define KVM_USER_MEM_SLOTS 8
>  /* memory slots that does not exposed to userspace */
> -#define KVM_PRIVATE_MEM_SLOTS0
> +#define KVM_PRIVATE_MEM_SLOTS 0
>  
>  #define KVM_COALESCED_MMIO_PAGE_OFFSET 1
>  
>  /* Don't support huge pages */
> -#define KVM_HPAGE_GFN_SHIFT(x)   0
> +#define KVM_HPAGE_GFN_SHIFT(x)  0
>  
>  /* We don't currently support large pages. */
>  #define KVM_NR_PAGE_SIZES1
> -#define KVM_PAGES_PER_HPAGE(x)   1
> +#define KVM_PAGES_PER_HPAGE(x)  1
>  
> +#ifdef CONFIG_KVM_MIPS_VZ
> +#define KVM_VZROOTID (GUESTCTL1_VZ_ROOT_GUESTID)
> +#define KVM_VZGUESTID_MASK   (GUESTCTL1_ID)
> +#endif

Any reason to not use the GUESTCTL1_* macros directly?

>  
>  
>  /* Special address that contains the comm page, used for reducing # of traps 
> */
> @@ -42,11 +49,20 @@
>  #define KVM_GUEST_KERNEL_MODE(vcpu)  
> ((kvm_read_c0_guest_status(vcpu->arch.cop0) & (ST0_EXL | ST0_ERL)) || \
>   
> ((kvm_read_c0_guest_status(vcpu->arch.cop0) & KSU_USER) == 0))
>  
> +#ifdef CONFIG_KVM_MIPS_VZ
> +#define KVM_GUEST_KUSEG 0xUL
> +#define KVM_GUEST_KSEG0 0x8000UL
> +#define KVM_GUEST_KSEG1 0xa000UL
> +#define KVM_GUEST_KSEG230xc000UL
> +#define KVM_GUEST_KSEGX(a)  ((_ACAST32_(a)) & 0xe000)
> +#define KVM_GUEST_CPHYSADDR(a)  ((_ACAST32_(a)) & 0x1fff)
> +#else
>  #define KVM_GUEST_KUSEG 0xUL
>  #define KVM_GUEST_KSEG0 0x4000UL
>  #define KVM_GUEST_KSEG230x6000UL
>  #define KVM_GUEST_KSEGX(a)  ((_ACAST32_(a)) & 0x6000)
>  #define KVM_GUEST_CPHYSADDR(a)  ((_ACAST32_(a)) & 0x1fff)
> +#endif
>  
>  #define KVM_GUEST_CKSEG0ADDR(a)  (KVM_GUEST_CPHYSADDR(a) | 
> KVM_GUEST_KSEG0)
>  #define KVM_GUEST_CKSEG1ADDR(a)  (KVM_GUEST_CPHYSADDR(a) | 
> KVM_GUEST_KSEG1)
> @@ -100,6 +116,21 @@ struct kvm_vcpu_stat {
>   u32 resvd_inst_exits;
>   u32 break_inst_exits;
>   u32 flush_dcache_exits;
> +#ifdef CONFIG_KVM_MIPS_VZ
> + u32 hypervisor_gpsi_exits;
> + u32 hypervisor_gpsi_cp0_exits;
> + u32 hypervisor_gpsi_cache_exits;
> + u32 hypervisor_gsfc_exits;
> + u32 hypervisor_gsfc_cp0_status_exits;
> + u32 hypervisor_gsfc_cp0_cause_exits;
> + u32 hypervisor_gsfc_cp0_intctl_exits;
> + u32 hypervisor_hc_exits;
> + u32 hypervisor_grr_exits;
> + u32 hypervisor_gva_exits;
> + u32 hypervisor_ghfc_exits;
> + u32 hypervisor_gpa_exits;
> + u32 hypervisor_resv_exits;
> +#endif
>   u32 halt_wakeup;
>  };
>  
> @@ -118,6 +149,21 @@ enum kvm_mips_exit_types {
>   RESVD_INST_EXITS,
>   BREAK_INST_EXITS,
>   FLUSH_DCACHE_EXITS,
> +#ifdef CONFIG_KVM_MIPS_VZ
> + HYPERVISOR_GPSI_EXITS,
> + HYPERVISOR_GPSI_CP0_EXITS,
> + HYPERVISOR_GPSI_CACHE_EXITS,
> + HYPERVISOR_GSFC_EXITS,
> + HYPERVISOR_GSFC_CP0_STATUS_EXITS,
> + HYPERVISOR_GSFC_CP0_CAUSE_EXITS,
> + HYPERVISOR_GSFC_CP0_INTCTL_EXITS,
> + HYPERVISOR_HC_EXITS,
> + HYPERVISOR_GRR_EXITS,
> + HYPERVISOR_GVA_EXITS,
> + HYPERVISOR_GHFC_EXITS,
> + HYPERVISOR_GPA_EXITS,
> + HYPERVISOR_RESV_EXITS,
> +#endif
>   MAX_KVM_MIPS_EXIT_TYPES
>  };
>  
> @@ -126,8 +172,8 @@ struct kvm_arch_memory_slot {
>  
>  struct kvm_arch {
>   /* Guest GVA->HPA page table */
> - unsigned long *guest_pmap;
> - unsigned long guest_pmap_npages;
> + ulong *guest_pmap;
> + ulong guest_pmap_npages;

Please make this search-and-replace a separate patch.

>  
>   /* Wired host TLB used for the commpage */
>   int commpage_tlb;
> @@ -137,9 +183,9 @@ struct kvm_arch {
>  #define N_MIPS_COPROC_SEL8
>  
>  struct mips_coproc {
> - unsigned long reg[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL];
> + ulong reg[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL];
>  #ifdef CONFIG_KVM_MIPS_DEBUG_COP0_COUNTERS
> - unsigned long stat[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL];
> + ulong stat[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL];
>  #endif
>  };
>  
> @@ -294,6 +340,9 @@ enum mips_mmu_types {
>  #define T_RES_INST  10   /* Reserved instruction exception */
>  #define T_COP_UNUSABLE  11   /* Coprocessor unusable */
>  #define T_OVFLOW12   /* Arithmetic overflow

[PATCH 16/18] KVM/MIPS32-VZ: Add VZ-ASE support to KVM/MIPS data structures.

2013-05-18 Thread Sanjay Lal

Signed-off-by: Sanjay Lal 
---
 arch/mips/include/asm/kvm_host.h | 244 ++-
 1 file changed, 191 insertions(+), 53 deletions(-)

diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h
index e68781e..c92e297 100644
--- a/arch/mips/include/asm/kvm_host.h
+++ b/arch/mips/include/asm/kvm_host.h
@@ -19,21 +19,28 @@
 #include 
 #include 
 
+#ifdef CONFIG_KVM_MIPS_VZ
+#include 
+#endif
 
-#define KVM_MAX_VCPUS  1
-#define KVM_USER_MEM_SLOTS 8
+#define KVM_MAX_VCPUS 8
+#define KVM_USER_MEM_SLOTS 8
 /* memory slots that does not exposed to userspace */
-#define KVM_PRIVATE_MEM_SLOTS  0
+#define KVM_PRIVATE_MEM_SLOTS 0
 
 #define KVM_COALESCED_MMIO_PAGE_OFFSET 1
 
 /* Don't support huge pages */
-#define KVM_HPAGE_GFN_SHIFT(x) 0
+#define KVM_HPAGE_GFN_SHIFT(x)  0
 
 /* We don't currently support large pages. */
 #define KVM_NR_PAGE_SIZES  1
-#define KVM_PAGES_PER_HPAGE(x) 1
+#define KVM_PAGES_PER_HPAGE(x)  1
 
+#ifdef CONFIG_KVM_MIPS_VZ
+#define KVM_VZROOTID   (GUESTCTL1_VZ_ROOT_GUESTID)
+#define KVM_VZGUESTID_MASK (GUESTCTL1_ID)
+#endif
 
 
 /* Special address that contains the comm page, used for reducing # of traps */
@@ -42,11 +49,20 @@
 #define KVM_GUEST_KERNEL_MODE(vcpu)
((kvm_read_c0_guest_status(vcpu->arch.cop0) & (ST0_EXL | ST0_ERL)) || \

((kvm_read_c0_guest_status(vcpu->arch.cop0) & KSU_USER) == 0))
 
+#ifdef CONFIG_KVM_MIPS_VZ
+#define KVM_GUEST_KUSEG 0xUL
+#define KVM_GUEST_KSEG0 0x8000UL
+#define KVM_GUEST_KSEG1 0xa000UL
+#define KVM_GUEST_KSEG230xc000UL
+#define KVM_GUEST_KSEGX(a)  ((_ACAST32_(a)) & 0xe000)
+#define KVM_GUEST_CPHYSADDR(a)  ((_ACAST32_(a)) & 0x1fff)
+#else
 #define KVM_GUEST_KUSEG 0xUL
 #define KVM_GUEST_KSEG0 0x4000UL
 #define KVM_GUEST_KSEG230x6000UL
 #define KVM_GUEST_KSEGX(a)  ((_ACAST32_(a)) & 0x6000)
 #define KVM_GUEST_CPHYSADDR(a)  ((_ACAST32_(a)) & 0x1fff)
+#endif
 
 #define KVM_GUEST_CKSEG0ADDR(a)(KVM_GUEST_CPHYSADDR(a) | 
KVM_GUEST_KSEG0)
 #define KVM_GUEST_CKSEG1ADDR(a)(KVM_GUEST_CPHYSADDR(a) | 
KVM_GUEST_KSEG1)
@@ -100,6 +116,21 @@ struct kvm_vcpu_stat {
u32 resvd_inst_exits;
u32 break_inst_exits;
u32 flush_dcache_exits;
+#ifdef CONFIG_KVM_MIPS_VZ
+   u32 hypervisor_gpsi_exits;
+   u32 hypervisor_gpsi_cp0_exits;
+   u32 hypervisor_gpsi_cache_exits;
+   u32 hypervisor_gsfc_exits;
+   u32 hypervisor_gsfc_cp0_status_exits;
+   u32 hypervisor_gsfc_cp0_cause_exits;
+   u32 hypervisor_gsfc_cp0_intctl_exits;
+   u32 hypervisor_hc_exits;
+   u32 hypervisor_grr_exits;
+   u32 hypervisor_gva_exits;
+   u32 hypervisor_ghfc_exits;
+   u32 hypervisor_gpa_exits;
+   u32 hypervisor_resv_exits;
+#endif
u32 halt_wakeup;
 };
 
@@ -118,6 +149,21 @@ enum kvm_mips_exit_types {
RESVD_INST_EXITS,
BREAK_INST_EXITS,
FLUSH_DCACHE_EXITS,
+#ifdef CONFIG_KVM_MIPS_VZ
+   HYPERVISOR_GPSI_EXITS,
+   HYPERVISOR_GPSI_CP0_EXITS,
+   HYPERVISOR_GPSI_CACHE_EXITS,
+   HYPERVISOR_GSFC_EXITS,
+   HYPERVISOR_GSFC_CP0_STATUS_EXITS,
+   HYPERVISOR_GSFC_CP0_CAUSE_EXITS,
+   HYPERVISOR_GSFC_CP0_INTCTL_EXITS,
+   HYPERVISOR_HC_EXITS,
+   HYPERVISOR_GRR_EXITS,
+   HYPERVISOR_GVA_EXITS,
+   HYPERVISOR_GHFC_EXITS,
+   HYPERVISOR_GPA_EXITS,
+   HYPERVISOR_RESV_EXITS,
+#endif
MAX_KVM_MIPS_EXIT_TYPES
 };
 
@@ -126,8 +172,8 @@ struct kvm_arch_memory_slot {
 
 struct kvm_arch {
/* Guest GVA->HPA page table */
-   unsigned long *guest_pmap;
-   unsigned long guest_pmap_npages;
+   ulong *guest_pmap;
+   ulong guest_pmap_npages;
 
/* Wired host TLB used for the commpage */
int commpage_tlb;
@@ -137,9 +183,9 @@ struct kvm_arch {
 #define N_MIPS_COPROC_SEL  8
 
 struct mips_coproc {
-   unsigned long reg[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL];
+   ulong reg[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL];
 #ifdef CONFIG_KVM_MIPS_DEBUG_COP0_COUNTERS
-   unsigned long stat[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL];
+   ulong stat[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL];
 #endif
 };
 
@@ -294,6 +340,9 @@ enum mips_mmu_types {
 #define T_RES_INST  10 /* Reserved instruction exception */
 #define T_COP_UNUSABLE  11 /* Coprocessor unusable */
 #define T_OVFLOW12 /* Arithmetic overflow */
+#ifdef CONFIG_KVM_MIPS_VZ
+#define T_GUEST_EXIT27 /* Guest Exit (VZ ASE) */
+#endif
 
 /*
  * Trap definitions added for r4000 port.
@@ -336,7 +385,7 @@ enum emulation_result {
 #define VPN2_MASK   0xe000
 #define TLB_IS_GLOBAL(x)(((x).tlb_lo0 & MIPS3_PG_G) && ((x).tlb_lo1 & 
MIPS3_PG_G))
 #define TLB_VPN2(x) ((x).tlb_hi & VPN2_MASK)
-#define TLB_ASID(x) (ASI