aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm64/kvm/handle_exit.c')
-rw-r--r--arch/arm64/kvm/handle_exit.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c
index 25006a7a5316..51abbd1d98e3 100644
--- a/arch/arm64/kvm/handle_exit.c
+++ b/arch/arm64/kvm/handle_exit.c
@@ -43,7 +43,7 @@ static int handle_hvc(struct kvm_vcpu *vcpu, struct kvm_run *run)
43 43
44 ret = kvm_psci_call(vcpu); 44 ret = kvm_psci_call(vcpu);
45 if (ret < 0) { 45 if (ret < 0) {
46 kvm_inject_undefined(vcpu); 46 vcpu_set_reg(vcpu, 0, ~0UL);
47 return 1; 47 return 1;
48 } 48 }
49 49
@@ -52,7 +52,7 @@ static int handle_hvc(struct kvm_vcpu *vcpu, struct kvm_run *run)
52 52
53static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run) 53static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run)
54{ 54{
55 kvm_inject_undefined(vcpu); 55 vcpu_set_reg(vcpu, 0, ~0UL);
56 return 1; 56 return 1;
57} 57}
58 58
@@ -122,7 +122,19 @@ static int kvm_handle_guest_debug(struct kvm_vcpu *vcpu, struct kvm_run *run)
122 return ret; 122 return ret;
123} 123}
124 124
125static int kvm_handle_unknown_ec(struct kvm_vcpu *vcpu, struct kvm_run *run)
126{
127 u32 hsr = kvm_vcpu_get_hsr(vcpu);
128
129 kvm_pr_unimpl("Unknown exception class: hsr: %#08x -- %s\n",
130 hsr, esr_get_class_string(hsr));
131
132 kvm_inject_undefined(vcpu);
133 return 1;
134}
135
125static exit_handle_fn arm_exit_handlers[] = { 136static exit_handle_fn arm_exit_handlers[] = {
137 [0 ... ESR_ELx_EC_MAX] = kvm_handle_unknown_ec,
126 [ESR_ELx_EC_WFx] = kvm_handle_wfx, 138 [ESR_ELx_EC_WFx] = kvm_handle_wfx,
127 [ESR_ELx_EC_CP15_32] = kvm_handle_cp15_32, 139 [ESR_ELx_EC_CP15_32] = kvm_handle_cp15_32,
128 [ESR_ELx_EC_CP15_64] = kvm_handle_cp15_64, 140 [ESR_ELx_EC_CP15_64] = kvm_handle_cp15_64,
@@ -148,13 +160,6 @@ static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu)
148 u32 hsr = kvm_vcpu_get_hsr(vcpu); 160 u32 hsr = kvm_vcpu_get_hsr(vcpu);
149 u8 hsr_ec = hsr >> ESR_ELx_EC_SHIFT; 161 u8 hsr_ec = hsr >> ESR_ELx_EC_SHIFT;
150 162
151 if (hsr_ec >= ARRAY_SIZE(arm_exit_handlers) ||
152 !arm_exit_handlers[hsr_ec]) {
153 kvm_err("Unknown exception class: hsr: %#08x -- %s\n",
154 hsr, esr_get_class_string(hsr));
155 BUG();
156 }
157
158 return arm_exit_handlers[hsr_ec]; 163 return arm_exit_handlers[hsr_ec];
159} 164}
160 165