Re: [PATCH v2 4/9] arm64: KVM: common infrastructure for handling AArch32 CP14/CP15

2014-05-28 Thread Marc Zyngier
On 25/05/14 16:34, Christoffer Dall wrote:
 On Tue, May 20, 2014 at 05:55:40PM +0100, Marc Zyngier wrote:
 As we're about to trap a bunch of CP14 registers, let's rework
 the CP15 handling so it can be generalized and work with multiple
 tables.

 Reviewed-by: Anup Patel anup.pa...@linaro.org
 Signed-off-by: Marc Zyngier marc.zyng...@arm.com
 ---
  arch/arm64/include/asm/kvm_asm.h|   2 +-
  arch/arm64/include/asm/kvm_coproc.h |   3 +-
  arch/arm64/include/asm/kvm_host.h   |   9 ++-
  arch/arm64/kvm/handle_exit.c|   4 +-
  arch/arm64/kvm/sys_regs.c   | 121 
 +---
  5 files changed, 111 insertions(+), 28 deletions(-)

 diff --git a/arch/arm64/include/asm/kvm_asm.h 
 b/arch/arm64/include/asm/kvm_asm.h
 index e6b159a..12f9dd7 100644
 --- a/arch/arm64/include/asm/kvm_asm.h
 +++ b/arch/arm64/include/asm/kvm_asm.h
 @@ -93,7 +93,7 @@
  #define c10_AMAIR0  (AMAIR_EL1 * 2) /* Aux Memory Attr Indirection Reg */
  #define c10_AMAIR1  (c10_AMAIR0 + 1)/* Aux Memory Attr Indirection Reg */
  #define c14_CNTKCTL (CNTKCTL_EL1 * 2) /* Timer Control Register (PL1) */
 -#define NR_CP15_REGS(NR_SYS_REGS * 2)
 +#define NR_COPRO_REGS   (NR_SYS_REGS * 2)
  
  #define ARM_EXCEPTION_IRQ 0
  #define ARM_EXCEPTION_TRAP1
 diff --git a/arch/arm64/include/asm/kvm_coproc.h 
 b/arch/arm64/include/asm/kvm_coproc.h
 index 9a59301..0b52377 100644
 --- a/arch/arm64/include/asm/kvm_coproc.h
 +++ b/arch/arm64/include/asm/kvm_coproc.h
 @@ -39,7 +39,8 @@ void kvm_register_target_sys_reg_table(unsigned int target,
 struct kvm_sys_reg_target_table *table);
  
  int kvm_handle_cp14_load_store(struct kvm_vcpu *vcpu, struct kvm_run *run);
 -int kvm_handle_cp14_access(struct kvm_vcpu *vcpu, struct kvm_run *run);
 +int kvm_handle_cp14_32(struct kvm_vcpu *vcpu, struct kvm_run *run);
 +int kvm_handle_cp14_64(struct kvm_vcpu *vcpu, struct kvm_run *run);
  int kvm_handle_cp15_32(struct kvm_vcpu *vcpu, struct kvm_run *run);
  int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run);
  int kvm_handle_sys_reg(struct kvm_vcpu *vcpu, struct kvm_run *run);
 diff --git a/arch/arm64/include/asm/kvm_host.h 
 b/arch/arm64/include/asm/kvm_host.h
 index 4737961..31cff7a 100644
 --- a/arch/arm64/include/asm/kvm_host.h
 +++ b/arch/arm64/include/asm/kvm_host.h
 @@ -86,7 +86,7 @@ struct kvm_cpu_context {
  struct kvm_regs gp_regs;
  union {
  u64 sys_regs[NR_SYS_REGS];
 -u32 cp15[NR_CP15_REGS];
 +u32 copro[NR_COPRO_REGS];
  };
  };
  
 @@ -141,7 +141,12 @@ struct kvm_vcpu_arch {
  
  #define vcpu_gp_regs(v) ((v)-arch.ctxt.gp_regs)
  #define vcpu_sys_reg(v,r)   ((v)-arch.ctxt.sys_regs[(r)])
 -#define vcpu_cp15(v,r)  ((v)-arch.ctxt.cp15[(r)])
 +/*
 + * CP14 and CP15 live in the same array, as they are backed by the
 + * same system registers.
 + */
 +#define vcpu_cp14(v,r)  ((v)-arch.ctxt.copro[(r)])
 +#define vcpu_cp15(v,r)  ((v)-arch.ctxt.copro[(r)])
  
  struct kvm_vm_stat {
  u32 remote_tlb_flush;
 diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c
 index 7bc41ea..f0ca49f 100644
 --- a/arch/arm64/kvm/handle_exit.c
 +++ b/arch/arm64/kvm/handle_exit.c
 @@ -69,9 +69,9 @@ static exit_handle_fn arm_exit_handlers[] = {
  [ESR_EL2_EC_WFI]= kvm_handle_wfx,
  [ESR_EL2_EC_CP15_32]= kvm_handle_cp15_32,
  [ESR_EL2_EC_CP15_64]= kvm_handle_cp15_64,
 -[ESR_EL2_EC_CP14_MR]= kvm_handle_cp14_access,
 +[ESR_EL2_EC_CP14_MR]= kvm_handle_cp14_32,
  [ESR_EL2_EC_CP14_LS]= kvm_handle_cp14_load_store,
 -[ESR_EL2_EC_CP14_64]= kvm_handle_cp14_access,
 +[ESR_EL2_EC_CP14_64]= kvm_handle_cp14_64,
  [ESR_EL2_EC_HVC32]  = handle_hvc,
  [ESR_EL2_EC_SMC32]  = handle_smc,
  [ESR_EL2_EC_HVC64]  = handle_hvc,
 diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
 index d46a965..429e38c 100644
 --- a/arch/arm64/kvm/sys_regs.c
 +++ b/arch/arm64/kvm/sys_regs.c
 @@ -474,6 +474,10 @@ static const struct sys_reg_desc sys_reg_descs[] = {
NULL, reset_val, FPEXC32_EL2, 0x70 },
  };
  
 +/* Trapped cp14 registers */
 +static const struct sys_reg_desc cp14_regs[] = {
 +};
 +
  /*
   * Trapped cp15 registers. TTBR0/TTBR1 get a double encoding,
   * depending on the way they are accessed (as a 32bit or a 64bit
 @@ -581,26 +585,19 @@ int kvm_handle_cp14_load_store(struct kvm_vcpu *vcpu, 
 struct kvm_run *run)
  return 1;
  }
  
 -int kvm_handle_cp14_access(struct kvm_vcpu *vcpu, struct kvm_run *run)
 -{
 -kvm_inject_undefined(vcpu);
 -return 1;
 -}
 -
 -static void emulate_cp15(struct kvm_vcpu *vcpu,
 - const struct sys_reg_params *params)
 
 document the return value please?

Sure.

 +static int emulate_cp(struct kvm_vcpu *vcpu,
 +  const struct sys_reg_params *params,
 +  const struct sys_reg_desc *table,
 +  

Re: [PATCH v2 4/9] arm64: KVM: common infrastructure for handling AArch32 CP14/CP15

2014-05-25 Thread Christoffer Dall
On Tue, May 20, 2014 at 05:55:40PM +0100, Marc Zyngier wrote:
 As we're about to trap a bunch of CP14 registers, let's rework
 the CP15 handling so it can be generalized and work with multiple
 tables.
 
 Reviewed-by: Anup Patel anup.pa...@linaro.org
 Signed-off-by: Marc Zyngier marc.zyng...@arm.com
 ---
  arch/arm64/include/asm/kvm_asm.h|   2 +-
  arch/arm64/include/asm/kvm_coproc.h |   3 +-
  arch/arm64/include/asm/kvm_host.h   |   9 ++-
  arch/arm64/kvm/handle_exit.c|   4 +-
  arch/arm64/kvm/sys_regs.c   | 121 
 +---
  5 files changed, 111 insertions(+), 28 deletions(-)
 
 diff --git a/arch/arm64/include/asm/kvm_asm.h 
 b/arch/arm64/include/asm/kvm_asm.h
 index e6b159a..12f9dd7 100644
 --- a/arch/arm64/include/asm/kvm_asm.h
 +++ b/arch/arm64/include/asm/kvm_asm.h
 @@ -93,7 +93,7 @@
  #define c10_AMAIR0   (AMAIR_EL1 * 2) /* Aux Memory Attr Indirection Reg */
  #define c10_AMAIR1   (c10_AMAIR0 + 1)/* Aux Memory Attr Indirection Reg */
  #define c14_CNTKCTL  (CNTKCTL_EL1 * 2) /* Timer Control Register (PL1) */
 -#define NR_CP15_REGS (NR_SYS_REGS * 2)
 +#define NR_COPRO_REGS(NR_SYS_REGS * 2)
  
  #define ARM_EXCEPTION_IRQ  0
  #define ARM_EXCEPTION_TRAP 1
 diff --git a/arch/arm64/include/asm/kvm_coproc.h 
 b/arch/arm64/include/asm/kvm_coproc.h
 index 9a59301..0b52377 100644
 --- a/arch/arm64/include/asm/kvm_coproc.h
 +++ b/arch/arm64/include/asm/kvm_coproc.h
 @@ -39,7 +39,8 @@ void kvm_register_target_sys_reg_table(unsigned int target,
  struct kvm_sys_reg_target_table *table);
  
  int kvm_handle_cp14_load_store(struct kvm_vcpu *vcpu, struct kvm_run *run);
 -int kvm_handle_cp14_access(struct kvm_vcpu *vcpu, struct kvm_run *run);
 +int kvm_handle_cp14_32(struct kvm_vcpu *vcpu, struct kvm_run *run);
 +int kvm_handle_cp14_64(struct kvm_vcpu *vcpu, struct kvm_run *run);
  int kvm_handle_cp15_32(struct kvm_vcpu *vcpu, struct kvm_run *run);
  int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run);
  int kvm_handle_sys_reg(struct kvm_vcpu *vcpu, struct kvm_run *run);
 diff --git a/arch/arm64/include/asm/kvm_host.h 
 b/arch/arm64/include/asm/kvm_host.h
 index 4737961..31cff7a 100644
 --- a/arch/arm64/include/asm/kvm_host.h
 +++ b/arch/arm64/include/asm/kvm_host.h
 @@ -86,7 +86,7 @@ struct kvm_cpu_context {
   struct kvm_regs gp_regs;
   union {
   u64 sys_regs[NR_SYS_REGS];
 - u32 cp15[NR_CP15_REGS];
 + u32 copro[NR_COPRO_REGS];
   };
  };
  
 @@ -141,7 +141,12 @@ struct kvm_vcpu_arch {
  
  #define vcpu_gp_regs(v)  ((v)-arch.ctxt.gp_regs)
  #define vcpu_sys_reg(v,r)((v)-arch.ctxt.sys_regs[(r)])
 -#define vcpu_cp15(v,r)   ((v)-arch.ctxt.cp15[(r)])
 +/*
 + * CP14 and CP15 live in the same array, as they are backed by the
 + * same system registers.
 + */
 +#define vcpu_cp14(v,r)   ((v)-arch.ctxt.copro[(r)])
 +#define vcpu_cp15(v,r)   ((v)-arch.ctxt.copro[(r)])
  
  struct kvm_vm_stat {
   u32 remote_tlb_flush;
 diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c
 index 7bc41ea..f0ca49f 100644
 --- a/arch/arm64/kvm/handle_exit.c
 +++ b/arch/arm64/kvm/handle_exit.c
 @@ -69,9 +69,9 @@ static exit_handle_fn arm_exit_handlers[] = {
   [ESR_EL2_EC_WFI]= kvm_handle_wfx,
   [ESR_EL2_EC_CP15_32]= kvm_handle_cp15_32,
   [ESR_EL2_EC_CP15_64]= kvm_handle_cp15_64,
 - [ESR_EL2_EC_CP14_MR]= kvm_handle_cp14_access,
 + [ESR_EL2_EC_CP14_MR]= kvm_handle_cp14_32,
   [ESR_EL2_EC_CP14_LS]= kvm_handle_cp14_load_store,
 - [ESR_EL2_EC_CP14_64]= kvm_handle_cp14_access,
 + [ESR_EL2_EC_CP14_64]= kvm_handle_cp14_64,
   [ESR_EL2_EC_HVC32]  = handle_hvc,
   [ESR_EL2_EC_SMC32]  = handle_smc,
   [ESR_EL2_EC_HVC64]  = handle_hvc,
 diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
 index d46a965..429e38c 100644
 --- a/arch/arm64/kvm/sys_regs.c
 +++ b/arch/arm64/kvm/sys_regs.c
 @@ -474,6 +474,10 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 NULL, reset_val, FPEXC32_EL2, 0x70 },
  };
  
 +/* Trapped cp14 registers */
 +static const struct sys_reg_desc cp14_regs[] = {
 +};
 +
  /*
   * Trapped cp15 registers. TTBR0/TTBR1 get a double encoding,
   * depending on the way they are accessed (as a 32bit or a 64bit
 @@ -581,26 +585,19 @@ int kvm_handle_cp14_load_store(struct kvm_vcpu *vcpu, 
 struct kvm_run *run)
   return 1;
  }
  
 -int kvm_handle_cp14_access(struct kvm_vcpu *vcpu, struct kvm_run *run)
 -{
 - kvm_inject_undefined(vcpu);
 - return 1;
 -}
 -
 -static void emulate_cp15(struct kvm_vcpu *vcpu,
 -  const struct sys_reg_params *params)

document the return value please?

 +static int emulate_cp(struct kvm_vcpu *vcpu,
 +   const struct sys_reg_params *params,
 +   const struct sys_reg_desc *table,
 +   

[PATCH v2 4/9] arm64: KVM: common infrastructure for handling AArch32 CP14/CP15

2014-05-20 Thread Marc Zyngier
As we're about to trap a bunch of CP14 registers, let's rework
the CP15 handling so it can be generalized and work with multiple
tables.

Reviewed-by: Anup Patel anup.pa...@linaro.org
Signed-off-by: Marc Zyngier marc.zyng...@arm.com
---
 arch/arm64/include/asm/kvm_asm.h|   2 +-
 arch/arm64/include/asm/kvm_coproc.h |   3 +-
 arch/arm64/include/asm/kvm_host.h   |   9 ++-
 arch/arm64/kvm/handle_exit.c|   4 +-
 arch/arm64/kvm/sys_regs.c   | 121 +---
 5 files changed, 111 insertions(+), 28 deletions(-)

diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h
index e6b159a..12f9dd7 100644
--- a/arch/arm64/include/asm/kvm_asm.h
+++ b/arch/arm64/include/asm/kvm_asm.h
@@ -93,7 +93,7 @@
 #define c10_AMAIR0 (AMAIR_EL1 * 2) /* Aux Memory Attr Indirection Reg */
 #define c10_AMAIR1 (c10_AMAIR0 + 1)/* Aux Memory Attr Indirection Reg */
 #define c14_CNTKCTL(CNTKCTL_EL1 * 2) /* Timer Control Register (PL1) */
-#define NR_CP15_REGS   (NR_SYS_REGS * 2)
+#define NR_COPRO_REGS  (NR_SYS_REGS * 2)
 
 #define ARM_EXCEPTION_IRQ0
 #define ARM_EXCEPTION_TRAP   1
diff --git a/arch/arm64/include/asm/kvm_coproc.h 
b/arch/arm64/include/asm/kvm_coproc.h
index 9a59301..0b52377 100644
--- a/arch/arm64/include/asm/kvm_coproc.h
+++ b/arch/arm64/include/asm/kvm_coproc.h
@@ -39,7 +39,8 @@ void kvm_register_target_sys_reg_table(unsigned int target,
   struct kvm_sys_reg_target_table *table);
 
 int kvm_handle_cp14_load_store(struct kvm_vcpu *vcpu, struct kvm_run *run);
-int kvm_handle_cp14_access(struct kvm_vcpu *vcpu, struct kvm_run *run);
+int kvm_handle_cp14_32(struct kvm_vcpu *vcpu, struct kvm_run *run);
+int kvm_handle_cp14_64(struct kvm_vcpu *vcpu, struct kvm_run *run);
 int kvm_handle_cp15_32(struct kvm_vcpu *vcpu, struct kvm_run *run);
 int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run);
 int kvm_handle_sys_reg(struct kvm_vcpu *vcpu, struct kvm_run *run);
diff --git a/arch/arm64/include/asm/kvm_host.h 
b/arch/arm64/include/asm/kvm_host.h
index 4737961..31cff7a 100644
--- a/arch/arm64/include/asm/kvm_host.h
+++ b/arch/arm64/include/asm/kvm_host.h
@@ -86,7 +86,7 @@ struct kvm_cpu_context {
struct kvm_regs gp_regs;
union {
u64 sys_regs[NR_SYS_REGS];
-   u32 cp15[NR_CP15_REGS];
+   u32 copro[NR_COPRO_REGS];
};
 };
 
@@ -141,7 +141,12 @@ struct kvm_vcpu_arch {
 
 #define vcpu_gp_regs(v)((v)-arch.ctxt.gp_regs)
 #define vcpu_sys_reg(v,r)  ((v)-arch.ctxt.sys_regs[(r)])
-#define vcpu_cp15(v,r) ((v)-arch.ctxt.cp15[(r)])
+/*
+ * CP14 and CP15 live in the same array, as they are backed by the
+ * same system registers.
+ */
+#define vcpu_cp14(v,r) ((v)-arch.ctxt.copro[(r)])
+#define vcpu_cp15(v,r) ((v)-arch.ctxt.copro[(r)])
 
 struct kvm_vm_stat {
u32 remote_tlb_flush;
diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c
index 7bc41ea..f0ca49f 100644
--- a/arch/arm64/kvm/handle_exit.c
+++ b/arch/arm64/kvm/handle_exit.c
@@ -69,9 +69,9 @@ static exit_handle_fn arm_exit_handlers[] = {
[ESR_EL2_EC_WFI]= kvm_handle_wfx,
[ESR_EL2_EC_CP15_32]= kvm_handle_cp15_32,
[ESR_EL2_EC_CP15_64]= kvm_handle_cp15_64,
-   [ESR_EL2_EC_CP14_MR]= kvm_handle_cp14_access,
+   [ESR_EL2_EC_CP14_MR]= kvm_handle_cp14_32,
[ESR_EL2_EC_CP14_LS]= kvm_handle_cp14_load_store,
-   [ESR_EL2_EC_CP14_64]= kvm_handle_cp14_access,
+   [ESR_EL2_EC_CP14_64]= kvm_handle_cp14_64,
[ESR_EL2_EC_HVC32]  = handle_hvc,
[ESR_EL2_EC_SMC32]  = handle_smc,
[ESR_EL2_EC_HVC64]  = handle_hvc,
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index d46a965..429e38c 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -474,6 +474,10 @@ static const struct sys_reg_desc sys_reg_descs[] = {
  NULL, reset_val, FPEXC32_EL2, 0x70 },
 };
 
+/* Trapped cp14 registers */
+static const struct sys_reg_desc cp14_regs[] = {
+};
+
 /*
  * Trapped cp15 registers. TTBR0/TTBR1 get a double encoding,
  * depending on the way they are accessed (as a 32bit or a 64bit
@@ -581,26 +585,19 @@ int kvm_handle_cp14_load_store(struct kvm_vcpu *vcpu, 
struct kvm_run *run)
return 1;
 }
 
-int kvm_handle_cp14_access(struct kvm_vcpu *vcpu, struct kvm_run *run)
-{
-   kvm_inject_undefined(vcpu);
-   return 1;
-}
-
-static void emulate_cp15(struct kvm_vcpu *vcpu,
-const struct sys_reg_params *params)
+static int emulate_cp(struct kvm_vcpu *vcpu,
+ const struct sys_reg_params *params,
+ const struct sys_reg_desc *table,
+ size_t num)
 {
-   size_t num;
-   const struct sys_reg_desc *table, *r;
+   const struct sys_reg_desc *r;
 
-   table = get_target_table(vcpu-arch.target,