mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-04-04 05:13:56 +00:00
KVM: x86 emulator: emulate CLTS internally
Avoid using ctxt->vcpu; we can do everything with ->get_cr() and ->set_cr(). A side effect is that we no longer activate the fpu on emulated CLTS; but that should be very rare. Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
fd72c41922
commit
2d04a05bd7
3 changed files with 11 additions and 9 deletions
|
@ -691,7 +691,6 @@ int kvm_fast_pio_out(struct kvm_vcpu *vcpu, int size, unsigned short port);
|
||||||
void kvm_emulate_cpuid(struct kvm_vcpu *vcpu);
|
void kvm_emulate_cpuid(struct kvm_vcpu *vcpu);
|
||||||
int kvm_emulate_halt(struct kvm_vcpu *vcpu);
|
int kvm_emulate_halt(struct kvm_vcpu *vcpu);
|
||||||
int emulate_invlpg(struct kvm_vcpu *vcpu, gva_t address);
|
int emulate_invlpg(struct kvm_vcpu *vcpu, gva_t address);
|
||||||
int emulate_clts(struct kvm_vcpu *vcpu);
|
|
||||||
int kvm_emulate_wbinvd(struct kvm_vcpu *vcpu);
|
int kvm_emulate_wbinvd(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
void kvm_get_segment(struct kvm_vcpu *vcpu, struct kvm_segment *var, int seg);
|
void kvm_get_segment(struct kvm_vcpu *vcpu, struct kvm_segment *var, int seg);
|
||||||
|
|
|
@ -2579,6 +2579,16 @@ static int em_invlpg(struct x86_emulate_ctxt *ctxt)
|
||||||
return X86EMUL_CONTINUE;
|
return X86EMUL_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int em_clts(struct x86_emulate_ctxt *ctxt)
|
||||||
|
{
|
||||||
|
ulong cr0;
|
||||||
|
|
||||||
|
cr0 = ctxt->ops->get_cr(ctxt, 0);
|
||||||
|
cr0 &= ~X86_CR0_TS;
|
||||||
|
ctxt->ops->set_cr(ctxt, 0, cr0);
|
||||||
|
return X86EMUL_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
static bool valid_cr(int nr)
|
static bool valid_cr(int nr)
|
||||||
{
|
{
|
||||||
switch (nr) {
|
switch (nr) {
|
||||||
|
@ -4079,7 +4089,7 @@ twobyte_insn:
|
||||||
rc = emulate_syscall(ctxt, ops);
|
rc = emulate_syscall(ctxt, ops);
|
||||||
break;
|
break;
|
||||||
case 0x06:
|
case 0x06:
|
||||||
emulate_clts(ctxt->vcpu);
|
rc = em_clts(ctxt);
|
||||||
break;
|
break;
|
||||||
case 0x09: /* wbinvd */
|
case 0x09: /* wbinvd */
|
||||||
kvm_emulate_wbinvd(ctxt->vcpu);
|
kvm_emulate_wbinvd(ctxt->vcpu);
|
||||||
|
|
|
@ -4153,13 +4153,6 @@ int kvm_emulate_wbinvd(struct kvm_vcpu *vcpu)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_emulate_wbinvd);
|
EXPORT_SYMBOL_GPL(kvm_emulate_wbinvd);
|
||||||
|
|
||||||
int emulate_clts(struct kvm_vcpu *vcpu)
|
|
||||||
{
|
|
||||||
kvm_x86_ops->set_cr0(vcpu, kvm_read_cr0_bits(vcpu, ~X86_CR0_TS));
|
|
||||||
kvm_x86_ops->fpu_activate(vcpu);
|
|
||||||
return X86EMUL_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int emulator_get_dr(struct x86_emulate_ctxt *ctxt, int dr, unsigned long *dest)
|
int emulator_get_dr(struct x86_emulate_ctxt *ctxt, int dr, unsigned long *dest)
|
||||||
{
|
{
|
||||||
return _kvm_get_dr(emul_to_vcpu(ctxt), dr, dest);
|
return _kvm_get_dr(emul_to_vcpu(ctxt), dr, dest);
|
||||||
|
|
Loading…
Add table
Reference in a new issue