Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea5e97e8 authored by Kevin Wolf's avatar Kevin Wolf Committed by Avi Kivity
Browse files

KVM: SVM: Fix CPL updates



Keep CPL at 0 in real mode and at 3 in VM86. In protected/long mode, use
RPL rather than DPL of the code segment.

Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 66b0ab8f
Loading
Loading
Loading
Loading
+16 −3
Original line number Diff line number Diff line
@@ -1332,6 +1332,21 @@ static void svm_vcpu_put(struct kvm_vcpu *vcpu)
		wrmsrl(host_save_user_msrs[i], svm->host_user_msrs[i]);
}

static void svm_update_cpl(struct kvm_vcpu *vcpu)
{
	struct vcpu_svm *svm = to_svm(vcpu);
	int cpl;

	if (!is_protmode(vcpu))
		cpl = 0;
	else if (svm->vmcb->save.rflags & X86_EFLAGS_VM)
		cpl = 3;
	else
		cpl = svm->vmcb->save.cs.selector & 0x3;

	svm->vmcb->save.cpl = cpl;
}

static unsigned long svm_get_rflags(struct kvm_vcpu *vcpu)
{
	return to_svm(vcpu)->vmcb->save.rflags;
@@ -1607,9 +1622,7 @@ static void svm_set_segment(struct kvm_vcpu *vcpu,
		s->attrib |= (var->g & 1) << SVM_SELECTOR_G_SHIFT;
	}
	if (seg == VCPU_SREG_CS)
		svm->vmcb->save.cpl
			= (svm->vmcb->save.cs.attrib
			   >> SVM_SELECTOR_DPL_SHIFT) & 3;
		svm_update_cpl(vcpu);

	mark_dirty(svm->vmcb, VMCB_SEG);
}