KVM: PPC: Book3S PR: Support TAR handling for PR KVM HTM
Currently guest kernel doesn't handle TAR facility unavailable and it always runs with TAR bit on. PR KVM will lazily enable TAR. TAR is not a frequent-use register and it is not included in SVCPU struct. Due to the above, the checkpointed TAR val might be a bogus TAR val. To solve this issue, we will make vcpu->arch.fscr tar bit consistent with shadow_fscr when TM is enabled. At the end of emulating treclaim., the correct TAR val need to be loaded into the register if FSCR_TAR bit is on. At the beginning of emulating trechkpt., TAR needs to be flushed so that the right tar val can be copied into tar_tm. Tested with: tools/testing/selftests/powerpc/tm/tm-tar tools/testing/selftests/powerpc/ptrace/ptrace-tm-tar (remove DSCR/PPR related testing). Signed-off-by: Simon Guo <wei.guo.simon@gmail.com> Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
此提交包含在:
@@ -55,7 +55,9 @@
|
||||
|
||||
static int kvmppc_handle_ext(struct kvm_vcpu *vcpu, unsigned int exit_nr,
|
||||
ulong msr);
|
||||
static void kvmppc_giveup_fac(struct kvm_vcpu *vcpu, ulong fac);
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
static int kvmppc_handle_fac(struct kvm_vcpu *vcpu, ulong fac);
|
||||
#endif
|
||||
|
||||
/* Some compatibility defines */
|
||||
#ifdef CONFIG_PPC_BOOK3S_32
|
||||
@@ -346,6 +348,7 @@ void kvmppc_save_tm_pr(struct kvm_vcpu *vcpu)
|
||||
return;
|
||||
}
|
||||
|
||||
kvmppc_giveup_fac(vcpu, FSCR_TAR_LG);
|
||||
kvmppc_giveup_ext(vcpu, MSR_VSX);
|
||||
|
||||
preempt_disable();
|
||||
@@ -357,8 +360,11 @@ void kvmppc_restore_tm_pr(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
if (!MSR_TM_ACTIVE(kvmppc_get_msr(vcpu))) {
|
||||
kvmppc_restore_tm_sprs(vcpu);
|
||||
if (kvmppc_get_msr(vcpu) & MSR_TM)
|
||||
if (kvmppc_get_msr(vcpu) & MSR_TM) {
|
||||
kvmppc_handle_lost_math_exts(vcpu);
|
||||
if (vcpu->arch.fscr & FSCR_TAR)
|
||||
kvmppc_handle_fac(vcpu, FSCR_TAR_LG);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -366,9 +372,11 @@ void kvmppc_restore_tm_pr(struct kvm_vcpu *vcpu)
|
||||
_kvmppc_restore_tm_pr(vcpu, kvmppc_get_msr(vcpu));
|
||||
preempt_enable();
|
||||
|
||||
if (kvmppc_get_msr(vcpu) & MSR_TM)
|
||||
if (kvmppc_get_msr(vcpu) & MSR_TM) {
|
||||
kvmppc_handle_lost_math_exts(vcpu);
|
||||
|
||||
if (vcpu->arch.fscr & FSCR_TAR)
|
||||
kvmppc_handle_fac(vcpu, FSCR_TAR_LG);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -819,7 +827,7 @@ void kvmppc_giveup_ext(struct kvm_vcpu *vcpu, ulong msr)
|
||||
}
|
||||
|
||||
/* Give up facility (TAR / EBB / DSCR) */
|
||||
static void kvmppc_giveup_fac(struct kvm_vcpu *vcpu, ulong fac)
|
||||
void kvmppc_giveup_fac(struct kvm_vcpu *vcpu, ulong fac)
|
||||
{
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
if (!(vcpu->arch.shadow_fscr & (1ULL << fac))) {
|
||||
@@ -1020,7 +1028,12 @@ 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);
|
||||
} else if (!(vcpu->arch.fscr & FSCR_TAR) && (fscr & FSCR_TAR)) {
|
||||
vcpu->arch.fscr = fscr;
|
||||
kvmppc_handle_fac(vcpu, FSCR_TAR_LG);
|
||||
return;
|
||||
}
|
||||
|
||||
vcpu->arch.fscr = fscr;
|
||||
}
|
||||
#endif
|
||||
|
新增問題並參考
封鎖使用者