summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGleb Natapov <gleb@redhat.com>2012-12-11 17:14:12 +0400
committerMarcelo Tosatti <mtosatti@redhat.com>2012-12-12 03:00:28 +0400
commit58b7825bc324da55415034a9f6ca5d716b8fd898 (patch)
tree819453213ec9f5c68eae10088467f1abe75d9cb4
parent0b26b588d97031fe8e16a35186220a6c14c89849 (diff)
downloadlinux-58b7825bc324da55415034a9f6ca5d716b8fd898.tar.xz
KVM: emulator: fix real mode segment checks in address linearization
In real mode CS register is writable, so do not #GP on write. Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
-rw-r--r--arch/x86/kvm/emulate.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 39171cb307ea..979869f70468 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -677,8 +677,9 @@ static int __linearize(struct x86_emulate_ctxt *ctxt,
addr.seg);
if (!usable)
goto bad;
- /* code segment or read-only data segment */
- if (((desc.type & 8) || !(desc.type & 2)) && write)
+ /* code segment in protected mode or read-only data segment */
+ if ((((ctxt->mode != X86EMUL_MODE_REAL) && (desc.type & 8))
+ || !(desc.type & 2)) && write)
goto bad;
/* unreadable code segment */
if (!fetch && (desc.type & 8) && !(desc.type & 2))