diff options
author | Alexey Kardashevskiy <aik@ozlabs.ru> | 2016-03-17 22:50:42 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2016-03-22 07:02:51 -0400 |
commit | 31217db720186edc7ae3c4354e5fa5848bb28358 (patch) | |
tree | b18b49ccbf98cc9d2c50cc7cb53903decc7bb5ae /arch/powerpc/kvm | |
parent | ef697a712a6165aea7779c295604b099e8bfae2e (diff) |
KVM: PPC: Create a virtual-mode only TCE table handlers
Upcoming in-kernel VFIO acceleration needs different handling in real
and virtual modes which makes it hard to support both modes in
the same handler.
This creates a copy of kvmppc_rm_h_stuff_tce and kvmppc_rm_h_put_tce
in addition to the existing kvmppc_rm_h_put_tce_indirect.
This also fixes linker breakage when only PR KVM was selected (leaving
HV KVM off): the kvmppc_h_put_tce/kvmppc_h_stuff_tce functions
would not compile at all and the linked would fail.
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/powerpc/kvm')
-rw-r--r-- | arch/powerpc/kvm/book3s_64_vio.c | 52 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_64_vio_hv.c | 8 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_hv_rmhandlers.S | 4 |
3 files changed, 57 insertions, 7 deletions
diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c index 82970042295e..18cf6d1f8174 100644 --- a/arch/powerpc/kvm/book3s_64_vio.c +++ b/arch/powerpc/kvm/book3s_64_vio.c | |||
@@ -209,6 +209,32 @@ fail: | |||
209 | return ret; | 209 | return ret; |
210 | } | 210 | } |
211 | 211 | ||
212 | long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | ||
213 | unsigned long ioba, unsigned long tce) | ||
214 | { | ||
215 | struct kvmppc_spapr_tce_table *stt = kvmppc_find_table(vcpu, liobn); | ||
216 | long ret; | ||
217 | |||
218 | /* udbg_printf("H_PUT_TCE(): liobn=0x%lx ioba=0x%lx, tce=0x%lx\n", */ | ||
219 | /* liobn, ioba, tce); */ | ||
220 | |||
221 | if (!stt) | ||
222 | return H_TOO_HARD; | ||
223 | |||
224 | ret = kvmppc_ioba_validate(stt, ioba, 1); | ||
225 | if (ret != H_SUCCESS) | ||
226 | return ret; | ||
227 | |||
228 | ret = kvmppc_tce_validate(stt, tce); | ||
229 | if (ret != H_SUCCESS) | ||
230 | return ret; | ||
231 | |||
232 | kvmppc_tce_put(stt, ioba >> stt->page_shift, tce); | ||
233 | |||
234 | return H_SUCCESS; | ||
235 | } | ||
236 | EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); | ||
237 | |||
212 | long kvmppc_h_put_tce_indirect(struct kvm_vcpu *vcpu, | 238 | long kvmppc_h_put_tce_indirect(struct kvm_vcpu *vcpu, |
213 | unsigned long liobn, unsigned long ioba, | 239 | unsigned long liobn, unsigned long ioba, |
214 | unsigned long tce_list, unsigned long npages) | 240 | unsigned long tce_list, unsigned long npages) |
@@ -264,3 +290,29 @@ unlock_exit: | |||
264 | return ret; | 290 | return ret; |
265 | } | 291 | } |
266 | EXPORT_SYMBOL_GPL(kvmppc_h_put_tce_indirect); | 292 | EXPORT_SYMBOL_GPL(kvmppc_h_put_tce_indirect); |
293 | |||
294 | long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu, | ||
295 | unsigned long liobn, unsigned long ioba, | ||
296 | unsigned long tce_value, unsigned long npages) | ||
297 | { | ||
298 | struct kvmppc_spapr_tce_table *stt; | ||
299 | long i, ret; | ||
300 | |||
301 | stt = kvmppc_find_table(vcpu, liobn); | ||
302 | if (!stt) | ||
303 | return H_TOO_HARD; | ||
304 | |||
305 | ret = kvmppc_ioba_validate(stt, ioba, npages); | ||
306 | if (ret != H_SUCCESS) | ||
307 | return ret; | ||
308 | |||
309 | /* Check permission bits only to allow userspace poison TCE for debug */ | ||
310 | if (tce_value & (TCE_PCI_WRITE | TCE_PCI_READ)) | ||
311 | return H_PARAMETER; | ||
312 | |||
313 | for (i = 0; i < npages; ++i, ioba += (1ULL << stt->page_shift)) | ||
314 | kvmppc_tce_put(stt, ioba >> stt->page_shift, tce_value); | ||
315 | |||
316 | return H_SUCCESS; | ||
317 | } | ||
318 | EXPORT_SYMBOL_GPL(kvmppc_h_stuff_tce); | ||
diff --git a/arch/powerpc/kvm/book3s_64_vio_hv.c b/arch/powerpc/kvm/book3s_64_vio_hv.c index f88b859af53b..d461c440889a 100644 --- a/arch/powerpc/kvm/book3s_64_vio_hv.c +++ b/arch/powerpc/kvm/book3s_64_vio_hv.c | |||
@@ -180,8 +180,8 @@ long kvmppc_gpa_to_ua(struct kvm *kvm, unsigned long gpa, | |||
180 | EXPORT_SYMBOL_GPL(kvmppc_gpa_to_ua); | 180 | EXPORT_SYMBOL_GPL(kvmppc_gpa_to_ua); |
181 | 181 | ||
182 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE | 182 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE |
183 | long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | 183 | long kvmppc_rm_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, |
184 | unsigned long ioba, unsigned long tce) | 184 | unsigned long ioba, unsigned long tce) |
185 | { | 185 | { |
186 | struct kvmppc_spapr_tce_table *stt = kvmppc_find_table(vcpu, liobn); | 186 | struct kvmppc_spapr_tce_table *stt = kvmppc_find_table(vcpu, liobn); |
187 | long ret; | 187 | long ret; |
@@ -204,7 +204,6 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | |||
204 | 204 | ||
205 | return H_SUCCESS; | 205 | return H_SUCCESS; |
206 | } | 206 | } |
207 | EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); | ||
208 | 207 | ||
209 | static long kvmppc_rm_ua_to_hpa(struct kvm_vcpu *vcpu, | 208 | static long kvmppc_rm_ua_to_hpa(struct kvm_vcpu *vcpu, |
210 | unsigned long ua, unsigned long *phpa) | 209 | unsigned long ua, unsigned long *phpa) |
@@ -296,7 +295,7 @@ unlock_exit: | |||
296 | return ret; | 295 | return ret; |
297 | } | 296 | } |
298 | 297 | ||
299 | long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu, | 298 | long kvmppc_rm_h_stuff_tce(struct kvm_vcpu *vcpu, |
300 | unsigned long liobn, unsigned long ioba, | 299 | unsigned long liobn, unsigned long ioba, |
301 | unsigned long tce_value, unsigned long npages) | 300 | unsigned long tce_value, unsigned long npages) |
302 | { | 301 | { |
@@ -320,7 +319,6 @@ long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu, | |||
320 | 319 | ||
321 | return H_SUCCESS; | 320 | return H_SUCCESS; |
322 | } | 321 | } |
323 | EXPORT_SYMBOL_GPL(kvmppc_h_stuff_tce); | ||
324 | 322 | ||
325 | long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | 323 | long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn, |
326 | unsigned long ioba) | 324 | unsigned long ioba) |
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 62ea3c6acdee..e571ad277398 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
@@ -1942,7 +1942,7 @@ hcall_real_table: | |||
1942 | .long DOTSYM(kvmppc_h_clear_ref) - hcall_real_table | 1942 | .long DOTSYM(kvmppc_h_clear_ref) - hcall_real_table |
1943 | .long DOTSYM(kvmppc_h_protect) - hcall_real_table | 1943 | .long DOTSYM(kvmppc_h_protect) - hcall_real_table |
1944 | .long DOTSYM(kvmppc_h_get_tce) - hcall_real_table | 1944 | .long DOTSYM(kvmppc_h_get_tce) - hcall_real_table |
1945 | .long DOTSYM(kvmppc_h_put_tce) - hcall_real_table | 1945 | .long DOTSYM(kvmppc_rm_h_put_tce) - hcall_real_table |
1946 | .long 0 /* 0x24 - H_SET_SPRG0 */ | 1946 | .long 0 /* 0x24 - H_SET_SPRG0 */ |
1947 | .long DOTSYM(kvmppc_h_set_dabr) - hcall_real_table | 1947 | .long DOTSYM(kvmppc_h_set_dabr) - hcall_real_table |
1948 | .long 0 /* 0x2c */ | 1948 | .long 0 /* 0x2c */ |
@@ -2020,7 +2020,7 @@ hcall_real_table: | |||
2020 | .long 0 /* 0x12c */ | 2020 | .long 0 /* 0x12c */ |
2021 | .long 0 /* 0x130 */ | 2021 | .long 0 /* 0x130 */ |
2022 | .long DOTSYM(kvmppc_h_set_xdabr) - hcall_real_table | 2022 | .long DOTSYM(kvmppc_h_set_xdabr) - hcall_real_table |
2023 | .long DOTSYM(kvmppc_h_stuff_tce) - hcall_real_table | 2023 | .long DOTSYM(kvmppc_rm_h_stuff_tce) - hcall_real_table |
2024 | .long DOTSYM(kvmppc_rm_h_put_tce_indirect) - hcall_real_table | 2024 | .long DOTSYM(kvmppc_rm_h_put_tce_indirect) - hcall_real_table |
2025 | .long 0 /* 0x140 */ | 2025 | .long 0 /* 0x140 */ |
2026 | .long 0 /* 0x144 */ | 2026 | .long 0 /* 0x144 */ |