diff options
Diffstat (limited to 'arch/arm64/kvm/handle_exit.c')
-rw-r--r-- | arch/arm64/kvm/handle_exit.c | 23 |
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 | ||
53 | static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run) | 53 | static 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 | ||
125 | static 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 | |||
125 | static exit_handle_fn arm_exit_handlers[] = { | 136 | static 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 | ||