Merge tag 'kvm-arm-for-3.20' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm...
[cascardo/linux.git] / arch / arm64 / kvm / handle_exit.c
index 6a7eb3c..524fa25 100644 (file)
 
 #include <linux/kvm.h>
 #include <linux/kvm_host.h>
-#include <asm/kvm_emulate.h>
+
+#include <asm/esr.h>
 #include <asm/kvm_coproc.h>
+#include <asm/kvm_emulate.h>
 #include <asm/kvm_mmu.h>
 #include <asm/kvm_psci.h>
 
@@ -67,7 +69,7 @@ static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run)
  */
 static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run)
 {
-       if (kvm_vcpu_get_hsr(vcpu) & ESR_EL2_EC_WFI_ISS_WFE) {
+       if (kvm_vcpu_get_hsr(vcpu) & ESR_ELx_WFx_ISS_WFE) {
                trace_kvm_wfx_arm64(*vcpu_pc(vcpu), true);
                kvm_vcpu_on_spin(vcpu);
        } else {
@@ -81,29 +83,30 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run)
 }
 
 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_32,
-       [ESR_EL2_EC_CP14_LS]    = kvm_handle_cp14_load_store,
-       [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,
-       [ESR_EL2_EC_SMC64]      = handle_smc,
-       [ESR_EL2_EC_SYS64]      = kvm_handle_sys_reg,
-       [ESR_EL2_EC_IABT]       = kvm_handle_guest_abort,
-       [ESR_EL2_EC_DABT]       = kvm_handle_guest_abort,
+       [ESR_ELx_EC_WFx]        = kvm_handle_wfx,
+       [ESR_ELx_EC_CP15_32]    = kvm_handle_cp15_32,
+       [ESR_ELx_EC_CP15_64]    = kvm_handle_cp15_64,
+       [ESR_ELx_EC_CP14_MR]    = kvm_handle_cp14_32,
+       [ESR_ELx_EC_CP14_LS]    = kvm_handle_cp14_load_store,
+       [ESR_ELx_EC_CP14_64]    = kvm_handle_cp14_64,
+       [ESR_ELx_EC_HVC32]      = handle_hvc,
+       [ESR_ELx_EC_SMC32]      = handle_smc,
+       [ESR_ELx_EC_HVC64]      = handle_hvc,
+       [ESR_ELx_EC_SMC64]      = handle_smc,
+       [ESR_ELx_EC_SYS64]      = kvm_handle_sys_reg,
+       [ESR_ELx_EC_IABT_LOW]   = kvm_handle_guest_abort,
+       [ESR_ELx_EC_DABT_LOW]   = kvm_handle_guest_abort,
 };
 
 static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu)
 {
-       u8 hsr_ec = kvm_vcpu_trap_get_class(vcpu);
+       u32 hsr = kvm_vcpu_get_hsr(vcpu);
+       u8 hsr_ec = hsr >> ESR_ELx_EC_SHIFT;
 
        if (hsr_ec >= ARRAY_SIZE(arm_exit_handlers) ||
            !arm_exit_handlers[hsr_ec]) {
-               kvm_err("Unknown exception class: hsr: %#08x\n",
-                       (unsigned int)kvm_vcpu_get_hsr(vcpu));
+               kvm_err("Unknown exception class: hsr: %#08x -- %s\n",
+                       hsr, esr_get_class_string(hsr));
                BUG();
        }