KVM: emulator: fix real mode segment checks in address linearization
authorGleb Natapov <gleb@redhat.com>
Tue, 11 Dec 2012 13:14:12 +0000 (15:14 +0200)
committerMarcelo Tosatti <mtosatti@redhat.com>
Tue, 11 Dec 2012 23:00:28 +0000 (21:00 -0200)
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>
arch/x86/kvm/emulate.c

index 39171cb307ea05d6687bfc083ddd87935cf4ca4d..979869f70468f6b8ff799ea540bb19b8ea9a84d2 100644 (file)
@@ -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))