summaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorNadav Amit2014-12-25 01:52:22 +0100
committerPaolo Bonzini2015-01-08 22:48:07 +0100
commite2cefa746e7e2a1104931d411b6f5de159d98ec6 (patch)
tree4f0bfcc2ac19ae66b6b92e06ed3ad24b1971911d /arch/x86
parentKVM: x86: POP [ESP] is not emulated correctly (diff)
downloadkernel-qcow2-linux-e2cefa746e7e2a1104931d411b6f5de159d98ec6.tar.gz
kernel-qcow2-linux-e2cefa746e7e2a1104931d411b6f5de159d98ec6.tar.xz
kernel-qcow2-linux-e2cefa746e7e2a1104931d411b6f5de159d98ec6.zip
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>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kvm/emulate.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index cc24b74b7454..e36e1fc5bf85 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -1618,10 +1618,13 @@ static int __load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
if (seg_desc.s) {
/* mark segment as accessed */
- seg_desc.type |= 1;
- ret = write_segment_descriptor(ctxt, selector, &seg_desc);
- if (ret != X86EMUL_CONTINUE)
- return ret;
+ if (!(seg_desc.type & 1)) {
+ seg_desc.type |= 1;
+ ret = write_segment_descriptor(ctxt, selector,
+ &seg_desc);
+ if (ret != X86EMUL_CONTINUE)
+ return ret;
+ }
} else if (ctxt->mode == X86EMUL_MODE_PROT64) {
ret = ctxt->ops->read_std(ctxt, desc_addr+8, &base3,
sizeof(base3), &ctxt->exception);