diff options
Diffstat (limited to 'arch/arm64/kvm/handle_exit.c')
-rw-r--r-- | arch/arm64/kvm/handle_exit.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c index 1bfe30dfbfe7..fa1b18e364fc 100644 --- a/arch/arm64/kvm/handle_exit.c +++ b/arch/arm64/kvm/handle_exit.c | |||
@@ -135,7 +135,19 @@ static int kvm_handle_guest_debug(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
135 | return ret; | 135 | return ret; |
136 | } | 136 | } |
137 | 137 | ||
138 | static int kvm_handle_unknown_ec(struct kvm_vcpu *vcpu, struct kvm_run *run) | ||
139 | { | ||
140 | u32 hsr = kvm_vcpu_get_hsr(vcpu); | ||
141 | |||
142 | kvm_pr_unimpl("Unknown exception class: hsr: %#08x -- %s\n", | ||
143 | hsr, esr_get_class_string(hsr)); | ||
144 | |||
145 | kvm_inject_undefined(vcpu); | ||
146 | return 1; | ||
147 | } | ||
148 | |||
138 | static exit_handle_fn arm_exit_handlers[] = { | 149 | static exit_handle_fn arm_exit_handlers[] = { |
150 | [0 ... ESR_ELx_EC_MAX] = kvm_handle_unknown_ec, | ||
139 | [ESR_ELx_EC_WFx] = kvm_handle_wfx, | 151 | [ESR_ELx_EC_WFx] = kvm_handle_wfx, |
140 | [ESR_ELx_EC_CP15_32] = kvm_handle_cp15_32, | 152 | [ESR_ELx_EC_CP15_32] = kvm_handle_cp15_32, |
141 | [ESR_ELx_EC_CP15_64] = kvm_handle_cp15_64, | 153 | [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) | |||
162 | u32 hsr = kvm_vcpu_get_hsr(vcpu); | 174 | u32 hsr = kvm_vcpu_get_hsr(vcpu); |
163 | u8 hsr_ec = ESR_ELx_EC(hsr); | 175 | u8 hsr_ec = ESR_ELx_EC(hsr); |
164 | 176 | ||
165 | if (hsr_ec >= ARRAY_SIZE(arm_exit_handlers) || | ||
166 | !arm_exit_handlers[hsr_ec]) { | ||
167 | kvm_err("Unknown exception class: hsr: %#08x -- %s\n", | ||
168 | hsr, esr_get_class_string(hsr)); | ||
169 | BUG(); | ||
170 | } | ||
171 | |||
172 | return arm_exit_handlers[hsr_ec]; | 177 | return arm_exit_handlers[hsr_ec]; |
173 | } | 178 | } |
174 | 179 | ||