KVM: x86: Do not set access bit on accessed segments

When segment is loaded, the segment access bit is set unconditionally.  In
fact, it should be set conditionally, based on whether the segment had the
accessed bit set before. In addition, it can improve performance.

Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Nadav Amit 2014-12-25 02:52:22 +02:00 committed by Paolo Bonzini
parent ab708099a0
commit e2cefa746e

View File

@ -1618,10 +1618,13 @@ static int __load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
if (seg_desc.s) { if (seg_desc.s) {
/* mark segment as accessed */ /* mark segment as accessed */
seg_desc.type |= 1; if (!(seg_desc.type & 1)) {
ret = write_segment_descriptor(ctxt, selector, &seg_desc); seg_desc.type |= 1;
if (ret != X86EMUL_CONTINUE) ret = write_segment_descriptor(ctxt, selector,
return ret; &seg_desc);
if (ret != X86EMUL_CONTINUE)
return ret;
}
} else if (ctxt->mode == X86EMUL_MODE_PROT64) { } else if (ctxt->mode == X86EMUL_MODE_PROT64) {
ret = ctxt->ops->read_std(ctxt, desc_addr+8, &base3, ret = ctxt->ops->read_std(ctxt, desc_addr+8, &base3,
sizeof(base3), &ctxt->exception); sizeof(base3), &ctxt->exception);