diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s_hv.c')
-rw-r--r-- | arch/powerpc/kvm/book3s_hv.c | 467 |
1 files changed, 283 insertions, 184 deletions
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 108d1f580177..c6af1d623839 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c | |||
@@ -60,12 +60,20 @@ static int kvmppc_hv_setup_rma(struct kvm_vcpu *vcpu); | |||
60 | 60 | ||
61 | void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | 61 | void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) |
62 | { | 62 | { |
63 | struct kvmppc_vcore *vc = vcpu->arch.vcore; | ||
64 | |||
63 | local_paca->kvm_hstate.kvm_vcpu = vcpu; | 65 | local_paca->kvm_hstate.kvm_vcpu = vcpu; |
64 | local_paca->kvm_hstate.kvm_vcore = vcpu->arch.vcore; | 66 | local_paca->kvm_hstate.kvm_vcore = vc; |
67 | if (vc->runner == vcpu && vc->vcore_state != VCORE_INACTIVE) | ||
68 | vc->stolen_tb += mftb() - vc->preempt_tb; | ||
65 | } | 69 | } |
66 | 70 | ||
67 | void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu) | 71 | void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu) |
68 | { | 72 | { |
73 | struct kvmppc_vcore *vc = vcpu->arch.vcore; | ||
74 | |||
75 | if (vc->runner == vcpu && vc->vcore_state != VCORE_INACTIVE) | ||
76 | vc->preempt_tb = mftb(); | ||
69 | } | 77 | } |
70 | 78 | ||
71 | void kvmppc_set_msr(struct kvm_vcpu *vcpu, u64 msr) | 79 | void kvmppc_set_msr(struct kvm_vcpu *vcpu, u64 msr) |
@@ -134,6 +142,22 @@ static void init_vpa(struct kvm_vcpu *vcpu, struct lppaca *vpa) | |||
134 | vpa->yield_count = 1; | 142 | vpa->yield_count = 1; |
135 | } | 143 | } |
136 | 144 | ||
145 | /* Length for a per-processor buffer is passed in at offset 4 in the buffer */ | ||
146 | struct reg_vpa { | ||
147 | u32 dummy; | ||
148 | union { | ||
149 | u16 hword; | ||
150 | u32 word; | ||
151 | } length; | ||
152 | }; | ||
153 | |||
154 | static int vpa_is_registered(struct kvmppc_vpa *vpap) | ||
155 | { | ||
156 | if (vpap->update_pending) | ||
157 | return vpap->next_gpa != 0; | ||
158 | return vpap->pinned_addr != NULL; | ||
159 | } | ||
160 | |||
137 | static unsigned long do_h_register_vpa(struct kvm_vcpu *vcpu, | 161 | static unsigned long do_h_register_vpa(struct kvm_vcpu *vcpu, |
138 | unsigned long flags, | 162 | unsigned long flags, |
139 | unsigned long vcpuid, unsigned long vpa) | 163 | unsigned long vcpuid, unsigned long vpa) |
@@ -142,88 +166,182 @@ static unsigned long do_h_register_vpa(struct kvm_vcpu *vcpu, | |||
142 | unsigned long len, nb; | 166 | unsigned long len, nb; |
143 | void *va; | 167 | void *va; |
144 | struct kvm_vcpu *tvcpu; | 168 | struct kvm_vcpu *tvcpu; |
145 | int err = H_PARAMETER; | 169 | int err; |
170 | int subfunc; | ||
171 | struct kvmppc_vpa *vpap; | ||
146 | 172 | ||
147 | tvcpu = kvmppc_find_vcpu(kvm, vcpuid); | 173 | tvcpu = kvmppc_find_vcpu(kvm, vcpuid); |
148 | if (!tvcpu) | 174 | if (!tvcpu) |
149 | return H_PARAMETER; | 175 | return H_PARAMETER; |
150 | 176 | ||
151 | flags >>= 63 - 18; | 177 | subfunc = (flags >> H_VPA_FUNC_SHIFT) & H_VPA_FUNC_MASK; |
152 | flags &= 7; | 178 | if (subfunc == H_VPA_REG_VPA || subfunc == H_VPA_REG_DTL || |
153 | if (flags == 0 || flags == 4) | 179 | subfunc == H_VPA_REG_SLB) { |
154 | return H_PARAMETER; | 180 | /* Registering new area - address must be cache-line aligned */ |
155 | if (flags < 4) { | 181 | if ((vpa & (L1_CACHE_BYTES - 1)) || !vpa) |
156 | if (vpa & 0x7f) | ||
157 | return H_PARAMETER; | 182 | return H_PARAMETER; |
158 | if (flags >= 2 && !tvcpu->arch.vpa) | 183 | |
159 | return H_RESOURCE; | 184 | /* convert logical addr to kernel addr and read length */ |
160 | /* registering new area; convert logical addr to real */ | ||
161 | va = kvmppc_pin_guest_page(kvm, vpa, &nb); | 185 | va = kvmppc_pin_guest_page(kvm, vpa, &nb); |
162 | if (va == NULL) | 186 | if (va == NULL) |
163 | return H_PARAMETER; | 187 | return H_PARAMETER; |
164 | if (flags <= 1) | 188 | if (subfunc == H_VPA_REG_VPA) |
165 | len = *(unsigned short *)(va + 4); | 189 | len = ((struct reg_vpa *)va)->length.hword; |
166 | else | 190 | else |
167 | len = *(unsigned int *)(va + 4); | 191 | len = ((struct reg_vpa *)va)->length.word; |
168 | if (len > nb) | 192 | kvmppc_unpin_guest_page(kvm, va); |
169 | goto out_unpin; | 193 | |
170 | switch (flags) { | 194 | /* Check length */ |
171 | case 1: /* register VPA */ | 195 | if (len > nb || len < sizeof(struct reg_vpa)) |
172 | if (len < 640) | 196 | return H_PARAMETER; |
173 | goto out_unpin; | 197 | } else { |
174 | if (tvcpu->arch.vpa) | 198 | vpa = 0; |
175 | kvmppc_unpin_guest_page(kvm, vcpu->arch.vpa); | 199 | len = 0; |
176 | tvcpu->arch.vpa = va; | 200 | } |
177 | init_vpa(vcpu, va); | 201 | |
178 | break; | 202 | err = H_PARAMETER; |
179 | case 2: /* register DTL */ | 203 | vpap = NULL; |
180 | if (len < 48) | 204 | spin_lock(&tvcpu->arch.vpa_update_lock); |
181 | goto out_unpin; | 205 | |
182 | len -= len % 48; | 206 | switch (subfunc) { |
183 | if (tvcpu->arch.dtl) | 207 | case H_VPA_REG_VPA: /* register VPA */ |
184 | kvmppc_unpin_guest_page(kvm, vcpu->arch.dtl); | 208 | if (len < sizeof(struct lppaca)) |
185 | tvcpu->arch.dtl = va; | ||
186 | tvcpu->arch.dtl_end = va + len; | ||
187 | break; | 209 | break; |
188 | case 3: /* register SLB shadow buffer */ | 210 | vpap = &tvcpu->arch.vpa; |
189 | if (len < 16) | 211 | err = 0; |
190 | goto out_unpin; | 212 | break; |
191 | if (tvcpu->arch.slb_shadow) | 213 | |
192 | kvmppc_unpin_guest_page(kvm, vcpu->arch.slb_shadow); | 214 | case H_VPA_REG_DTL: /* register DTL */ |
193 | tvcpu->arch.slb_shadow = va; | 215 | if (len < sizeof(struct dtl_entry)) |
194 | break; | 216 | break; |
195 | } | 217 | len -= len % sizeof(struct dtl_entry); |
196 | } else { | 218 | |
197 | switch (flags) { | 219 | /* Check that they have previously registered a VPA */ |
198 | case 5: /* unregister VPA */ | 220 | err = H_RESOURCE; |
199 | if (tvcpu->arch.slb_shadow || tvcpu->arch.dtl) | 221 | if (!vpa_is_registered(&tvcpu->arch.vpa)) |
200 | return H_RESOURCE; | ||
201 | if (!tvcpu->arch.vpa) | ||
202 | break; | ||
203 | kvmppc_unpin_guest_page(kvm, tvcpu->arch.vpa); | ||
204 | tvcpu->arch.vpa = NULL; | ||
205 | break; | 222 | break; |
206 | case 6: /* unregister DTL */ | 223 | |
207 | if (!tvcpu->arch.dtl) | 224 | vpap = &tvcpu->arch.dtl; |
208 | break; | 225 | err = 0; |
209 | kvmppc_unpin_guest_page(kvm, tvcpu->arch.dtl); | 226 | break; |
210 | tvcpu->arch.dtl = NULL; | 227 | |
228 | case H_VPA_REG_SLB: /* register SLB shadow buffer */ | ||
229 | /* Check that they have previously registered a VPA */ | ||
230 | err = H_RESOURCE; | ||
231 | if (!vpa_is_registered(&tvcpu->arch.vpa)) | ||
211 | break; | 232 | break; |
212 | case 7: /* unregister SLB shadow buffer */ | 233 | |
213 | if (!tvcpu->arch.slb_shadow) | 234 | vpap = &tvcpu->arch.slb_shadow; |
214 | break; | 235 | err = 0; |
215 | kvmppc_unpin_guest_page(kvm, tvcpu->arch.slb_shadow); | 236 | break; |
216 | tvcpu->arch.slb_shadow = NULL; | 237 | |
238 | case H_VPA_DEREG_VPA: /* deregister VPA */ | ||
239 | /* Check they don't still have a DTL or SLB buf registered */ | ||
240 | err = H_RESOURCE; | ||
241 | if (vpa_is_registered(&tvcpu->arch.dtl) || | ||
242 | vpa_is_registered(&tvcpu->arch.slb_shadow)) | ||
217 | break; | 243 | break; |
218 | } | 244 | |
245 | vpap = &tvcpu->arch.vpa; | ||
246 | err = 0; | ||
247 | break; | ||
248 | |||
249 | case H_VPA_DEREG_DTL: /* deregister DTL */ | ||
250 | vpap = &tvcpu->arch.dtl; | ||
251 | err = 0; | ||
252 | break; | ||
253 | |||
254 | case H_VPA_DEREG_SLB: /* deregister SLB shadow buffer */ | ||
255 | vpap = &tvcpu->arch.slb_shadow; | ||
256 | err = 0; | ||
257 | break; | ||
258 | } | ||
259 | |||
260 | if (vpap) { | ||
261 | vpap->next_gpa = vpa; | ||
262 | vpap->len = len; | ||
263 | vpap->update_pending = 1; | ||
219 | } | 264 | } |
220 | return H_SUCCESS; | ||
221 | 265 | ||
222 | out_unpin: | 266 | spin_unlock(&tvcpu->arch.vpa_update_lock); |
223 | kvmppc_unpin_guest_page(kvm, va); | 267 | |
224 | return err; | 268 | return err; |
225 | } | 269 | } |
226 | 270 | ||
271 | static void kvmppc_update_vpa(struct kvm *kvm, struct kvmppc_vpa *vpap) | ||
272 | { | ||
273 | void *va; | ||
274 | unsigned long nb; | ||
275 | |||
276 | vpap->update_pending = 0; | ||
277 | va = NULL; | ||
278 | if (vpap->next_gpa) { | ||
279 | va = kvmppc_pin_guest_page(kvm, vpap->next_gpa, &nb); | ||
280 | if (nb < vpap->len) { | ||
281 | /* | ||
282 | * If it's now too short, it must be that userspace | ||
283 | * has changed the mappings underlying guest memory, | ||
284 | * so unregister the region. | ||
285 | */ | ||
286 | kvmppc_unpin_guest_page(kvm, va); | ||
287 | va = NULL; | ||
288 | } | ||
289 | } | ||
290 | if (vpap->pinned_addr) | ||
291 | kvmppc_unpin_guest_page(kvm, vpap->pinned_addr); | ||
292 | vpap->pinned_addr = va; | ||
293 | if (va) | ||
294 | vpap->pinned_end = va + vpap->len; | ||
295 | } | ||
296 | |||
297 | static void kvmppc_update_vpas(struct kvm_vcpu *vcpu) | ||
298 | { | ||
299 | struct kvm *kvm = vcpu->kvm; | ||
300 | |||
301 | spin_lock(&vcpu->arch.vpa_update_lock); | ||
302 | if (vcpu->arch.vpa.update_pending) { | ||
303 | kvmppc_update_vpa(kvm, &vcpu->arch.vpa); | ||
304 | init_vpa(vcpu, vcpu->arch.vpa.pinned_addr); | ||
305 | } | ||
306 | if (vcpu->arch.dtl.update_pending) { | ||
307 | kvmppc_update_vpa(kvm, &vcpu->arch.dtl); | ||
308 | vcpu->arch.dtl_ptr = vcpu->arch.dtl.pinned_addr; | ||
309 | vcpu->arch.dtl_index = 0; | ||
310 | } | ||
311 | if (vcpu->arch.slb_shadow.update_pending) | ||
312 | kvmppc_update_vpa(kvm, &vcpu->arch.slb_shadow); | ||
313 | spin_unlock(&vcpu->arch.vpa_update_lock); | ||
314 | } | ||
315 | |||
316 | static void kvmppc_create_dtl_entry(struct kvm_vcpu *vcpu, | ||
317 | struct kvmppc_vcore *vc) | ||
318 | { | ||
319 | struct dtl_entry *dt; | ||
320 | struct lppaca *vpa; | ||
321 | unsigned long old_stolen; | ||
322 | |||
323 | dt = vcpu->arch.dtl_ptr; | ||
324 | vpa = vcpu->arch.vpa.pinned_addr; | ||
325 | old_stolen = vcpu->arch.stolen_logged; | ||
326 | vcpu->arch.stolen_logged = vc->stolen_tb; | ||
327 | if (!dt || !vpa) | ||
328 | return; | ||
329 | memset(dt, 0, sizeof(struct dtl_entry)); | ||
330 | dt->dispatch_reason = 7; | ||
331 | dt->processor_id = vc->pcpu + vcpu->arch.ptid; | ||
332 | dt->timebase = mftb(); | ||
333 | dt->enqueue_to_dispatch_time = vc->stolen_tb - old_stolen; | ||
334 | dt->srr0 = kvmppc_get_pc(vcpu); | ||
335 | dt->srr1 = vcpu->arch.shregs.msr; | ||
336 | ++dt; | ||
337 | if (dt == vcpu->arch.dtl.pinned_end) | ||
338 | dt = vcpu->arch.dtl.pinned_addr; | ||
339 | vcpu->arch.dtl_ptr = dt; | ||
340 | /* order writing *dt vs. writing vpa->dtl_idx */ | ||
341 | smp_wmb(); | ||
342 | vpa->dtl_idx = ++vcpu->arch.dtl_index; | ||
343 | } | ||
344 | |||
227 | int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu) | 345 | int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu) |
228 | { | 346 | { |
229 | unsigned long req = kvmppc_get_gpr(vcpu, 3); | 347 | unsigned long req = kvmppc_get_gpr(vcpu, 3); |
@@ -468,6 +586,7 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id) | |||
468 | /* default to host PVR, since we can't spoof it */ | 586 | /* default to host PVR, since we can't spoof it */ |
469 | vcpu->arch.pvr = mfspr(SPRN_PVR); | 587 | vcpu->arch.pvr = mfspr(SPRN_PVR); |
470 | kvmppc_set_pvr(vcpu, vcpu->arch.pvr); | 588 | kvmppc_set_pvr(vcpu, vcpu->arch.pvr); |
589 | spin_lock_init(&vcpu->arch.vpa_update_lock); | ||
471 | 590 | ||
472 | kvmppc_mmu_book3s_hv_init(vcpu); | 591 | kvmppc_mmu_book3s_hv_init(vcpu); |
473 | 592 | ||
@@ -486,6 +605,7 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id) | |||
486 | INIT_LIST_HEAD(&vcore->runnable_threads); | 605 | INIT_LIST_HEAD(&vcore->runnable_threads); |
487 | spin_lock_init(&vcore->lock); | 606 | spin_lock_init(&vcore->lock); |
488 | init_waitqueue_head(&vcore->wq); | 607 | init_waitqueue_head(&vcore->wq); |
608 | vcore->preempt_tb = mftb(); | ||
489 | } | 609 | } |
490 | kvm->arch.vcores[core] = vcore; | 610 | kvm->arch.vcores[core] = vcore; |
491 | } | 611 | } |
@@ -498,6 +618,7 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id) | |||
498 | ++vcore->num_threads; | 618 | ++vcore->num_threads; |
499 | spin_unlock(&vcore->lock); | 619 | spin_unlock(&vcore->lock); |
500 | vcpu->arch.vcore = vcore; | 620 | vcpu->arch.vcore = vcore; |
621 | vcpu->arch.stolen_logged = vcore->stolen_tb; | ||
501 | 622 | ||
502 | vcpu->arch.cpu_type = KVM_CPU_3S_64; | 623 | vcpu->arch.cpu_type = KVM_CPU_3S_64; |
503 | kvmppc_sanity_check(vcpu); | 624 | kvmppc_sanity_check(vcpu); |
@@ -512,12 +633,14 @@ out: | |||
512 | 633 | ||
513 | void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu) | 634 | void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu) |
514 | { | 635 | { |
515 | if (vcpu->arch.dtl) | 636 | spin_lock(&vcpu->arch.vpa_update_lock); |
516 | kvmppc_unpin_guest_page(vcpu->kvm, vcpu->arch.dtl); | 637 | if (vcpu->arch.dtl.pinned_addr) |
517 | if (vcpu->arch.slb_shadow) | 638 | kvmppc_unpin_guest_page(vcpu->kvm, vcpu->arch.dtl.pinned_addr); |
518 | kvmppc_unpin_guest_page(vcpu->kvm, vcpu->arch.slb_shadow); | 639 | if (vcpu->arch.slb_shadow.pinned_addr) |
519 | if (vcpu->arch.vpa) | 640 | kvmppc_unpin_guest_page(vcpu->kvm, vcpu->arch.slb_shadow.pinned_addr); |
520 | kvmppc_unpin_guest_page(vcpu->kvm, vcpu->arch.vpa); | 641 | if (vcpu->arch.vpa.pinned_addr) |
642 | kvmppc_unpin_guest_page(vcpu->kvm, vcpu->arch.vpa.pinned_addr); | ||
643 | spin_unlock(&vcpu->arch.vpa_update_lock); | ||
521 | kvm_vcpu_uninit(vcpu); | 644 | kvm_vcpu_uninit(vcpu); |
522 | kmem_cache_free(kvm_vcpu_cache, vcpu); | 645 | kmem_cache_free(kvm_vcpu_cache, vcpu); |
523 | } | 646 | } |
@@ -569,6 +692,45 @@ static void kvmppc_remove_runnable(struct kvmppc_vcore *vc, | |||
569 | list_del(&vcpu->arch.run_list); | 692 | list_del(&vcpu->arch.run_list); |
570 | } | 693 | } |
571 | 694 | ||
695 | static int kvmppc_grab_hwthread(int cpu) | ||
696 | { | ||
697 | struct paca_struct *tpaca; | ||
698 | long timeout = 1000; | ||
699 | |||
700 | tpaca = &paca[cpu]; | ||
701 | |||
702 | /* Ensure the thread won't go into the kernel if it wakes */ | ||
703 | tpaca->kvm_hstate.hwthread_req = 1; | ||
704 | |||
705 | /* | ||
706 | * If the thread is already executing in the kernel (e.g. handling | ||
707 | * a stray interrupt), wait for it to get back to nap mode. | ||
708 | * The smp_mb() is to ensure that our setting of hwthread_req | ||
709 | * is visible before we look at hwthread_state, so if this | ||
710 | * races with the code at system_reset_pSeries and the thread | ||
711 | * misses our setting of hwthread_req, we are sure to see its | ||
712 | * setting of hwthread_state, and vice versa. | ||
713 | */ | ||
714 | smp_mb(); | ||
715 | while (tpaca->kvm_hstate.hwthread_state == KVM_HWTHREAD_IN_KERNEL) { | ||
716 | if (--timeout <= 0) { | ||
717 | pr_err("KVM: couldn't grab cpu %d\n", cpu); | ||
718 | return -EBUSY; | ||
719 | } | ||
720 | udelay(1); | ||
721 | } | ||
722 | return 0; | ||
723 | } | ||
724 | |||
725 | static void kvmppc_release_hwthread(int cpu) | ||
726 | { | ||
727 | struct paca_struct *tpaca; | ||
728 | |||
729 | tpaca = &paca[cpu]; | ||
730 | tpaca->kvm_hstate.hwthread_req = 0; | ||
731 | tpaca->kvm_hstate.kvm_vcpu = NULL; | ||
732 | } | ||
733 | |||
572 | static void kvmppc_start_thread(struct kvm_vcpu *vcpu) | 734 | static void kvmppc_start_thread(struct kvm_vcpu *vcpu) |
573 | { | 735 | { |
574 | int cpu; | 736 | int cpu; |
@@ -588,8 +750,7 @@ static void kvmppc_start_thread(struct kvm_vcpu *vcpu) | |||
588 | smp_wmb(); | 750 | smp_wmb(); |
589 | #if defined(CONFIG_PPC_ICP_NATIVE) && defined(CONFIG_SMP) | 751 | #if defined(CONFIG_PPC_ICP_NATIVE) && defined(CONFIG_SMP) |
590 | if (vcpu->arch.ptid) { | 752 | if (vcpu->arch.ptid) { |
591 | tpaca->cpu_start = 0x80; | 753 | kvmppc_grab_hwthread(cpu); |
592 | wmb(); | ||
593 | xics_wake_cpu(cpu); | 754 | xics_wake_cpu(cpu); |
594 | ++vc->n_woken; | 755 | ++vc->n_woken; |
595 | } | 756 | } |
@@ -639,7 +800,7 @@ static int kvmppc_run_core(struct kvmppc_vcore *vc) | |||
639 | struct kvm_vcpu *vcpu, *vcpu0, *vnext; | 800 | struct kvm_vcpu *vcpu, *vcpu0, *vnext; |
640 | long ret; | 801 | long ret; |
641 | u64 now; | 802 | u64 now; |
642 | int ptid; | 803 | int ptid, i; |
643 | 804 | ||
644 | /* don't start if any threads have a signal pending */ | 805 | /* don't start if any threads have a signal pending */ |
645 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) | 806 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) |
@@ -681,17 +842,29 @@ static int kvmppc_run_core(struct kvmppc_vcore *vc) | |||
681 | vc->nap_count = 0; | 842 | vc->nap_count = 0; |
682 | vc->entry_exit_count = 0; | 843 | vc->entry_exit_count = 0; |
683 | vc->vcore_state = VCORE_RUNNING; | 844 | vc->vcore_state = VCORE_RUNNING; |
845 | vc->stolen_tb += mftb() - vc->preempt_tb; | ||
684 | vc->in_guest = 0; | 846 | vc->in_guest = 0; |
685 | vc->pcpu = smp_processor_id(); | 847 | vc->pcpu = smp_processor_id(); |
686 | vc->napping_threads = 0; | 848 | vc->napping_threads = 0; |
687 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) | 849 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) { |
688 | kvmppc_start_thread(vcpu); | 850 | kvmppc_start_thread(vcpu); |
851 | if (vcpu->arch.vpa.update_pending || | ||
852 | vcpu->arch.slb_shadow.update_pending || | ||
853 | vcpu->arch.dtl.update_pending) | ||
854 | kvmppc_update_vpas(vcpu); | ||
855 | kvmppc_create_dtl_entry(vcpu, vc); | ||
856 | } | ||
857 | /* Grab any remaining hw threads so they can't go into the kernel */ | ||
858 | for (i = ptid; i < threads_per_core; ++i) | ||
859 | kvmppc_grab_hwthread(vc->pcpu + i); | ||
689 | 860 | ||
690 | preempt_disable(); | 861 | preempt_disable(); |
691 | spin_unlock(&vc->lock); | 862 | spin_unlock(&vc->lock); |
692 | 863 | ||
693 | kvm_guest_enter(); | 864 | kvm_guest_enter(); |
694 | __kvmppc_vcore_entry(NULL, vcpu0); | 865 | __kvmppc_vcore_entry(NULL, vcpu0); |
866 | for (i = 0; i < threads_per_core; ++i) | ||
867 | kvmppc_release_hwthread(vc->pcpu + i); | ||
695 | 868 | ||
696 | spin_lock(&vc->lock); | 869 | spin_lock(&vc->lock); |
697 | /* disable sending of IPIs on virtual external irqs */ | 870 | /* disable sending of IPIs on virtual external irqs */ |
@@ -737,6 +910,7 @@ static int kvmppc_run_core(struct kvmppc_vcore *vc) | |||
737 | spin_lock(&vc->lock); | 910 | spin_lock(&vc->lock); |
738 | out: | 911 | out: |
739 | vc->vcore_state = VCORE_INACTIVE; | 912 | vc->vcore_state = VCORE_INACTIVE; |
913 | vc->preempt_tb = mftb(); | ||
740 | list_for_each_entry_safe(vcpu, vnext, &vc->runnable_threads, | 914 | list_for_each_entry_safe(vcpu, vnext, &vc->runnable_threads, |
741 | arch.run_list) { | 915 | arch.run_list) { |
742 | if (vcpu->arch.ret != RESUME_GUEST) { | 916 | if (vcpu->arch.ret != RESUME_GUEST) { |
@@ -835,6 +1009,7 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
835 | spin_lock(&vc->lock); | 1009 | spin_lock(&vc->lock); |
836 | continue; | 1010 | continue; |
837 | } | 1011 | } |
1012 | vc->runner = vcpu; | ||
838 | n_ceded = 0; | 1013 | n_ceded = 0; |
839 | list_for_each_entry(v, &vc->runnable_threads, arch.run_list) | 1014 | list_for_each_entry(v, &vc->runnable_threads, arch.run_list) |
840 | n_ceded += v->arch.ceded; | 1015 | n_ceded += v->arch.ceded; |
@@ -854,6 +1029,7 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
854 | wake_up(&v->arch.cpu_run); | 1029 | wake_up(&v->arch.cpu_run); |
855 | } | 1030 | } |
856 | } | 1031 | } |
1032 | vc->runner = NULL; | ||
857 | } | 1033 | } |
858 | 1034 | ||
859 | if (signal_pending(current)) { | 1035 | if (signal_pending(current)) { |
@@ -917,115 +1093,6 @@ int kvmppc_vcpu_run(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
917 | return r; | 1093 | return r; |
918 | } | 1094 | } |
919 | 1095 | ||
920 | static long kvmppc_stt_npages(unsigned long window_size) | ||
921 | { | ||
922 | return ALIGN((window_size >> SPAPR_TCE_SHIFT) | ||
923 | * sizeof(u64), PAGE_SIZE) / PAGE_SIZE; | ||
924 | } | ||
925 | |||
926 | static void release_spapr_tce_table(struct kvmppc_spapr_tce_table *stt) | ||
927 | { | ||
928 | struct kvm *kvm = stt->kvm; | ||
929 | int i; | ||
930 | |||
931 | mutex_lock(&kvm->lock); | ||
932 | list_del(&stt->list); | ||
933 | for (i = 0; i < kvmppc_stt_npages(stt->window_size); i++) | ||
934 | __free_page(stt->pages[i]); | ||
935 | kfree(stt); | ||
936 | mutex_unlock(&kvm->lock); | ||
937 | |||
938 | kvm_put_kvm(kvm); | ||
939 | } | ||
940 | |||
941 | static int kvm_spapr_tce_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | ||
942 | { | ||
943 | struct kvmppc_spapr_tce_table *stt = vma->vm_file->private_data; | ||
944 | struct page *page; | ||
945 | |||
946 | if (vmf->pgoff >= kvmppc_stt_npages(stt->window_size)) | ||
947 | return VM_FAULT_SIGBUS; | ||
948 | |||
949 | page = stt->pages[vmf->pgoff]; | ||
950 | get_page(page); | ||
951 | vmf->page = page; | ||
952 | return 0; | ||
953 | } | ||
954 | |||
955 | static const struct vm_operations_struct kvm_spapr_tce_vm_ops = { | ||
956 | .fault = kvm_spapr_tce_fault, | ||
957 | }; | ||
958 | |||
959 | static int kvm_spapr_tce_mmap(struct file *file, struct vm_area_struct *vma) | ||
960 | { | ||
961 | vma->vm_ops = &kvm_spapr_tce_vm_ops; | ||
962 | return 0; | ||
963 | } | ||
964 | |||
965 | static int kvm_spapr_tce_release(struct inode *inode, struct file *filp) | ||
966 | { | ||
967 | struct kvmppc_spapr_tce_table *stt = filp->private_data; | ||
968 | |||
969 | release_spapr_tce_table(stt); | ||
970 | return 0; | ||
971 | } | ||
972 | |||
973 | static struct file_operations kvm_spapr_tce_fops = { | ||
974 | .mmap = kvm_spapr_tce_mmap, | ||
975 | .release = kvm_spapr_tce_release, | ||
976 | }; | ||
977 | |||
978 | long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm, | ||
979 | struct kvm_create_spapr_tce *args) | ||
980 | { | ||
981 | struct kvmppc_spapr_tce_table *stt = NULL; | ||
982 | long npages; | ||
983 | int ret = -ENOMEM; | ||
984 | int i; | ||
985 | |||
986 | /* Check this LIOBN hasn't been previously allocated */ | ||
987 | list_for_each_entry(stt, &kvm->arch.spapr_tce_tables, list) { | ||
988 | if (stt->liobn == args->liobn) | ||
989 | return -EBUSY; | ||
990 | } | ||
991 | |||
992 | npages = kvmppc_stt_npages(args->window_size); | ||
993 | |||
994 | stt = kzalloc(sizeof(*stt) + npages* sizeof(struct page *), | ||
995 | GFP_KERNEL); | ||
996 | if (!stt) | ||
997 | goto fail; | ||
998 | |||
999 | stt->liobn = args->liobn; | ||
1000 | stt->window_size = args->window_size; | ||
1001 | stt->kvm = kvm; | ||
1002 | |||
1003 | for (i = 0; i < npages; i++) { | ||
1004 | stt->pages[i] = alloc_page(GFP_KERNEL | __GFP_ZERO); | ||
1005 | if (!stt->pages[i]) | ||
1006 | goto fail; | ||
1007 | } | ||
1008 | |||
1009 | kvm_get_kvm(kvm); | ||
1010 | |||
1011 | mutex_lock(&kvm->lock); | ||
1012 | list_add(&stt->list, &kvm->arch.spapr_tce_tables); | ||
1013 | |||
1014 | mutex_unlock(&kvm->lock); | ||
1015 | |||
1016 | return anon_inode_getfd("kvm-spapr-tce", &kvm_spapr_tce_fops, | ||
1017 | stt, O_RDWR); | ||
1018 | |||
1019 | fail: | ||
1020 | if (stt) { | ||
1021 | for (i = 0; i < npages; i++) | ||
1022 | if (stt->pages[i]) | ||
1023 | __free_page(stt->pages[i]); | ||
1024 | |||
1025 | kfree(stt); | ||
1026 | } | ||
1027 | return ret; | ||
1028 | } | ||
1029 | 1096 | ||
1030 | /* Work out RMLS (real mode limit selector) field value for a given RMA size. | 1097 | /* Work out RMLS (real mode limit selector) field value for a given RMA size. |
1031 | Assumes POWER7 or PPC970. */ | 1098 | Assumes POWER7 or PPC970. */ |
@@ -1108,6 +1175,38 @@ long kvm_vm_ioctl_allocate_rma(struct kvm *kvm, struct kvm_allocate_rma *ret) | |||
1108 | return fd; | 1175 | return fd; |
1109 | } | 1176 | } |
1110 | 1177 | ||
1178 | static void kvmppc_add_seg_page_size(struct kvm_ppc_one_seg_page_size **sps, | ||
1179 | int linux_psize) | ||
1180 | { | ||
1181 | struct mmu_psize_def *def = &mmu_psize_defs[linux_psize]; | ||
1182 | |||
1183 | if (!def->shift) | ||
1184 | return; | ||
1185 | (*sps)->page_shift = def->shift; | ||
1186 | (*sps)->slb_enc = def->sllp; | ||
1187 | (*sps)->enc[0].page_shift = def->shift; | ||
1188 | (*sps)->enc[0].pte_enc = def->penc; | ||
1189 | (*sps)++; | ||
1190 | } | ||
1191 | |||
1192 | int kvm_vm_ioctl_get_smmu_info(struct kvm *kvm, struct kvm_ppc_smmu_info *info) | ||
1193 | { | ||
1194 | struct kvm_ppc_one_seg_page_size *sps; | ||
1195 | |||
1196 | info->flags = KVM_PPC_PAGE_SIZES_REAL; | ||
1197 | if (mmu_has_feature(MMU_FTR_1T_SEGMENT)) | ||
1198 | info->flags |= KVM_PPC_1T_SEGMENTS; | ||
1199 | info->slb_size = mmu_slb_size; | ||
1200 | |||
1201 | /* We only support these sizes for now, and no muti-size segments */ | ||
1202 | sps = &info->sps[0]; | ||
1203 | kvmppc_add_seg_page_size(&sps, MMU_PAGE_4K); | ||
1204 | kvmppc_add_seg_page_size(&sps, MMU_PAGE_64K); | ||
1205 | kvmppc_add_seg_page_size(&sps, MMU_PAGE_16M); | ||
1206 | |||
1207 | return 0; | ||
1208 | } | ||
1209 | |||
1111 | /* | 1210 | /* |
1112 | * Get (and clear) the dirty memory log for a memory slot. | 1211 | * Get (and clear) the dirty memory log for a memory slot. |
1113 | */ | 1212 | */ |
@@ -1404,12 +1503,12 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
1404 | return EMULATE_FAIL; | 1503 | return EMULATE_FAIL; |
1405 | } | 1504 | } |
1406 | 1505 | ||
1407 | int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs) | 1506 | int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val) |
1408 | { | 1507 | { |
1409 | return EMULATE_FAIL; | 1508 | return EMULATE_FAIL; |
1410 | } | 1509 | } |
1411 | 1510 | ||
1412 | int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt) | 1511 | int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val) |
1413 | { | 1512 | { |
1414 | return EMULATE_FAIL; | 1513 | return EMULATE_FAIL; |
1415 | } | 1514 | } |