Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Alexey Kardashevskiy and committed by
Paolo Bonzini
31217db7 ef697a71

+57 -7
+52
arch/powerpc/kvm/book3s_64_vio.c
··· 209 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 238 long kvmppc_h_put_tce_indirect(struct kvm_vcpu *vcpu, 213 239 unsigned long liobn, unsigned long ioba, 214 240 unsigned long tce_list, unsigned long npages) ··· 290 264 return ret; 291 265 } 292 266 EXPORT_SYMBOL_GPL(kvmppc_h_put_tce_indirect); 267 + 268 + long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu, 269 + unsigned long liobn, unsigned long ioba, 270 + unsigned long tce_value, unsigned long npages) 271 + { 272 + struct kvmppc_spapr_tce_table *stt; 273 + long i, ret; 274 + 275 + stt = kvmppc_find_table(vcpu, liobn); 276 + if (!stt) 277 + return H_TOO_HARD; 278 + 279 + ret = kvmppc_ioba_validate(stt, ioba, npages); 280 + if (ret != H_SUCCESS) 281 + return ret; 282 + 283 + /* Check permission bits only to allow userspace poison TCE for debug */ 284 + if (tce_value & (TCE_PCI_WRITE | TCE_PCI_READ)) 285 + return H_PARAMETER; 286 + 287 + for (i = 0; i < npages; ++i, ioba += (1ULL << stt->page_shift)) 288 + kvmppc_tce_put(stt, ioba >> stt->page_shift, tce_value); 289 + 290 + return H_SUCCESS; 291 + } 292 + EXPORT_SYMBOL_GPL(kvmppc_h_stuff_tce);
+3 -5
arch/powerpc/kvm/book3s_64_vio_hv.c
··· 180 180 EXPORT_SYMBOL_GPL(kvmppc_gpa_to_ua); 181 181 182 182 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE 183 - long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, 184 - unsigned long ioba, unsigned long tce) 183 + long kvmppc_rm_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, 184 + unsigned long ioba, unsigned long tce) 185 185 { 186 186 struct kvmppc_spapr_tce_table *stt = kvmppc_find_table(vcpu, liobn); 187 187 long ret; ··· 204 204 205 205 return H_SUCCESS; 206 206 } 207 - EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); 208 207 209 208 static long kvmppc_rm_ua_to_hpa(struct kvm_vcpu *vcpu, 210 209 unsigned long ua, unsigned long *phpa) ··· 295 296 return ret; 296 297 } 297 298 298 - long kvmppc_h_stuff_tce(struct kvm_vcpu *vcpu, 299 + long kvmppc_rm_h_stuff_tce(struct kvm_vcpu *vcpu, 299 300 unsigned long liobn, unsigned long ioba, 300 301 unsigned long tce_value, unsigned long npages) 301 302 { ··· 319 320 320 321 return H_SUCCESS; 321 322 } 322 - EXPORT_SYMBOL_GPL(kvmppc_h_stuff_tce); 323 323 324 324 long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn, 325 325 unsigned long ioba)
+2 -2
arch/powerpc/kvm/book3s_hv_rmhandlers.S
··· 1942 1942 .long DOTSYM(kvmppc_h_clear_ref) - hcall_real_table 1943 1943 .long DOTSYM(kvmppc_h_protect) - hcall_real_table 1944 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 1946 .long 0 /* 0x24 - H_SET_SPRG0 */ 1947 1947 .long DOTSYM(kvmppc_h_set_dabr) - hcall_real_table 1948 1948 .long 0 /* 0x2c */ ··· 2020 2020 .long 0 /* 0x12c */ 2021 2021 .long 0 /* 0x130 */ 2022 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 2024 .long DOTSYM(kvmppc_rm_h_put_tce_indirect) - hcall_real_table 2025 2025 .long 0 /* 0x140 */ 2026 2026 .long 0 /* 0x144 */