struct kvm_memory_slot *memslot, unsigned long *map);
 extern void kvmppc_update_lpcr(struct kvm *kvm, unsigned long lpcr,
                        unsigned long mask);
+extern void kvmppc_set_fscr(struct kvm_vcpu *vcpu, u64 fscr);
 
 extern void kvmppc_entry_trampoline(void);
 extern void kvmppc_hv_entry_trampoline(void);
 
        case SPRN_GQR7:
                to_book3s(vcpu)->gqr[sprn - SPRN_GQR0] = spr_val;
                break;
+#ifdef CONFIG_PPC_BOOK3S_64
        case SPRN_FSCR:
-               vcpu->arch.fscr = spr_val;
+               kvmppc_set_fscr(vcpu, spr_val);
                break;
-#ifdef CONFIG_PPC_BOOK3S_64
        case SPRN_BESCR:
                vcpu->arch.bescr = spr_val;
                break;
        case SPRN_GQR7:
                *spr_val = to_book3s(vcpu)->gqr[sprn - SPRN_GQR0];
                break;
+#ifdef CONFIG_PPC_BOOK3S_64
        case SPRN_FSCR:
                *spr_val = vcpu->arch.fscr;
                break;
-#ifdef CONFIG_PPC_BOOK3S_64
        case SPRN_BESCR:
                *spr_val = vcpu->arch.bescr;
                break;
 
 
        return RESUME_GUEST;
 }
+
+void kvmppc_set_fscr(struct kvm_vcpu *vcpu, u64 fscr)
+{
+       if ((vcpu->arch.fscr & FSCR_TAR) && !(fscr & FSCR_TAR)) {
+               /* TAR got dropped, drop it in shadow too */
+               kvmppc_giveup_fac(vcpu, FSCR_TAR_LG);
+       }
+       vcpu->arch.fscr = fscr;
+}
 #endif
 
 int kvmppc_handle_exit_pr(struct kvm_run *run, struct kvm_vcpu *vcpu,