summaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm
diff options
context:
space:
mode:
authorAlexey Kardashevskiy <aik@ozlabs.ru>2016-03-17 22:50:42 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2016-03-22 07:02:51 -0400
commit31217db720186edc7ae3c4354e5fa5848bb28358 (patch)
treeb18b49ccbf98cc9d2c50cc7cb53903decc7bb5ae /arch/powerpc/kvm
parentef697a712a6165aea7779c295604b099e8bfae2e (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.c52
-rw-r--r--arch/powerpc/kvm/book3s_64_vio_hv.c8
-rw-r--r--arch/powerpc/kvm/book3s_hv_rmhandlers.S4
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
212long 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}
236EXPORT_SYMBOL_GPL(kvmppc_h_put_tce);
237
212long kvmppc_h_put_tce_indirect(struct kvm_vcpu *vcpu, 238long 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}
266EXPORT_SYMBOL_GPL(kvmppc_h_put_tce_indirect); 292EXPORT_SYMBOL_GPL(kvmppc_h_put_tce_indirect);
293
294long 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}
318EXPORT_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,
180EXPORT_SYMBOL_GPL(kvmppc_gpa_to_ua); 180EXPORT_SYMBOL_GPL(kvmppc_gpa_to_ua);
181 181
182#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE 182#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
183long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, 183long 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}
207EXPORT_SYMBOL_GPL(kvmppc_h_put_tce);
208 207
209static long kvmppc_rm_ua_to_hpa(struct kvm_vcpu *vcpu, 208static 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
299long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu, 298long 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}
323EXPORT_SYMBOL_GPL(kvmppc_h_stuff_tce);
324 322
325long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn, 323long 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 */