|
@@ -135,7 +135,19 @@ static int kvm_handle_guest_debug(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int kvm_handle_unknown_ec(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
|
|
+{
|
|
|
+ u32 hsr = kvm_vcpu_get_hsr(vcpu);
|
|
|
+
|
|
|
+ kvm_pr_unimpl("Unknown exception class: hsr: %#08x -- %s\n",
|
|
|
+ hsr, esr_get_class_string(hsr));
|
|
|
+
|
|
|
+ kvm_inject_undefined(vcpu);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
static exit_handle_fn arm_exit_handlers[] = {
|
|
|
+ [0 ... ESR_ELx_EC_MAX] = kvm_handle_unknown_ec,
|
|
|
[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,
|
|
@@ -162,13 +174,6 @@ static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu)
|
|
|
u32 hsr = kvm_vcpu_get_hsr(vcpu);
|
|
|
u8 hsr_ec = ESR_ELx_EC(hsr);
|
|
|
|
|
|
- if (hsr_ec >= ARRAY_SIZE(arm_exit_handlers) ||
|
|
|
- !arm_exit_handlers[hsr_ec]) {
|
|
|
- kvm_err("Unknown exception class: hsr: %#08x -- %s\n",
|
|
|
- hsr, esr_get_class_string(hsr));
|
|
|
- BUG();
|
|
|
- }
|
|
|
-
|
|
|
return arm_exit_handlers[hsr_ec];
|
|
|
}
|
|
|
|