aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/svm.c
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2012-02-08 08:34:41 -0500
committerAvi Kivity <avi@redhat.com>2012-03-08 07:10:29 -0500
commit4cee4798a304ee1ea579423ca048f16ceaccdfb5 (patch)
tree1088f534433daf9e9f705453038ced11c059570e /arch/x86/kvm/svm.c
parentea5e97e8bf1d56a4d9461c39e082b9c31a7be4ff (diff)
KVM: x86 emulator: Allow PM/VM86 switch during task switch
Task switches can switch between Protected Mode and VM86. The current mode must be updated during the task switch emulation so that the new segment selectors are interpreted correctly. In order to let privilege checks succeed, rflags needs to be updated in the vcpu struct as this causes a CPL update. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/svm.c')
-rw-r--r--arch/x86/kvm/svm.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index ab39d84dee00..53efd597f39e 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1354,7 +1354,11 @@ static unsigned long svm_get_rflags(struct kvm_vcpu *vcpu)
1354 1354
1355static void svm_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags) 1355static void svm_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags)
1356{ 1356{
1357 unsigned long old_rflags = to_svm(vcpu)->vmcb->save.rflags;
1358
1357 to_svm(vcpu)->vmcb->save.rflags = rflags; 1359 to_svm(vcpu)->vmcb->save.rflags = rflags;
1360 if ((old_rflags ^ rflags) & X86_EFLAGS_VM)
1361 svm_update_cpl(vcpu);
1358} 1362}
1359 1363
1360static void svm_cache_reg(struct kvm_vcpu *vcpu, enum kvm_reg reg) 1364static void svm_cache_reg(struct kvm_vcpu *vcpu, enum kvm_reg reg)