|
@@ -2020,6 +2020,7 @@ int emulate_invlpg(struct kvm_vcpu *vcpu, gva_t address)
|
|
|
|
|
|
int emulate_clts(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
+ KVMTRACE_0D(CLTS, vcpu, handler);
|
|
|
kvm_x86_ops->set_cr0(vcpu, vcpu->arch.cr0 & ~X86_CR0_TS);
|
|
|
return X86EMUL_CONTINUE;
|
|
|
}
|
|
@@ -2600,27 +2601,41 @@ void realmode_lmsw(struct kvm_vcpu *vcpu, unsigned long msw,
|
|
|
|
|
|
unsigned long realmode_get_cr(struct kvm_vcpu *vcpu, int cr)
|
|
|
{
|
|
|
+ unsigned long value;
|
|
|
+
|
|
|
kvm_x86_ops->decache_cr4_guest_bits(vcpu);
|
|
|
switch (cr) {
|
|
|
case 0:
|
|
|
- return vcpu->arch.cr0;
|
|
|
+ value = vcpu->arch.cr0;
|
|
|
+ break;
|
|
|
case 2:
|
|
|
- return vcpu->arch.cr2;
|
|
|
+ value = vcpu->arch.cr2;
|
|
|
+ break;
|
|
|
case 3:
|
|
|
- return vcpu->arch.cr3;
|
|
|
+ value = vcpu->arch.cr3;
|
|
|
+ break;
|
|
|
case 4:
|
|
|
- return vcpu->arch.cr4;
|
|
|
+ value = vcpu->arch.cr4;
|
|
|
+ break;
|
|
|
case 8:
|
|
|
- return kvm_get_cr8(vcpu);
|
|
|
+ value = kvm_get_cr8(vcpu);
|
|
|
+ break;
|
|
|
default:
|
|
|
vcpu_printf(vcpu, "%s: unexpected cr %u\n", __func__, cr);
|
|
|
return 0;
|
|
|
}
|
|
|
+ KVMTRACE_3D(CR_READ, vcpu, (u32)cr, (u32)value,
|
|
|
+ (u32)((u64)value >> 32), handler);
|
|
|
+
|
|
|
+ return value;
|
|
|
}
|
|
|
|
|
|
void realmode_set_cr(struct kvm_vcpu *vcpu, int cr, unsigned long val,
|
|
|
unsigned long *rflags)
|
|
|
{
|
|
|
+ KVMTRACE_3D(CR_WRITE, vcpu, (u32)cr, (u32)val,
|
|
|
+ (u32)((u64)val >> 32), handler);
|
|
|
+
|
|
|
switch (cr) {
|
|
|
case 0:
|
|
|
kvm_set_cr0(vcpu, mk_cr_64(vcpu->arch.cr0, val));
|