|
@@ -1051,6 +1051,11 @@ retry:
|
|
goto retry;
|
|
goto retry;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu)) {
|
|
|
|
+ vcpu->arch.sie_block->ihcpu = 0xffff;
|
|
|
|
+ goto retry;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (kvm_check_request(KVM_REQ_ENABLE_IBS, vcpu)) {
|
|
if (kvm_check_request(KVM_REQ_ENABLE_IBS, vcpu)) {
|
|
if (!ibs_enabled(vcpu)) {
|
|
if (!ibs_enabled(vcpu)) {
|
|
trace_kvm_s390_enable_disable_ibs(vcpu->vcpu_id, 1);
|
|
trace_kvm_s390_enable_disable_ibs(vcpu->vcpu_id, 1);
|
|
@@ -1306,7 +1311,8 @@ static void sync_regs(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
|
kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
|
|
kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
|
|
if (kvm_run->kvm_dirty_regs & KVM_SYNC_CRS) {
|
|
if (kvm_run->kvm_dirty_regs & KVM_SYNC_CRS) {
|
|
memcpy(&vcpu->arch.sie_block->gcr, &kvm_run->s.regs.crs, 128);
|
|
memcpy(&vcpu->arch.sie_block->gcr, &kvm_run->s.regs.crs, 128);
|
|
- kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
|
|
|
|
|
|
+ /* some control register changes require a tlb flush */
|
|
|
|
+ kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
|
|
}
|
|
}
|
|
if (kvm_run->kvm_dirty_regs & KVM_SYNC_ARCH0) {
|
|
if (kvm_run->kvm_dirty_regs & KVM_SYNC_ARCH0) {
|
|
vcpu->arch.sie_block->cputm = kvm_run->s.regs.cputm;
|
|
vcpu->arch.sie_block->cputm = kvm_run->s.regs.cputm;
|
|
@@ -1519,7 +1525,7 @@ void kvm_s390_vcpu_start(struct kvm_vcpu *vcpu)
|
|
* Another VCPU might have used IBS while we were offline.
|
|
* Another VCPU might have used IBS while we were offline.
|
|
* Let's play safe and flush the VCPU at startup.
|
|
* Let's play safe and flush the VCPU at startup.
|
|
*/
|
|
*/
|
|
- vcpu->arch.sie_block->ihcpu = 0xffff;
|
|
|
|
|
|
+ kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
|
|
spin_unlock(&vcpu->kvm->arch.start_stop_lock);
|
|
spin_unlock(&vcpu->kvm->arch.start_stop_lock);
|
|
return;
|
|
return;
|
|
}
|
|
}
|