From: Jan Kiszka Date: Mon, 27 Dec 2010 14:56:44 +0000 (+0100) Subject: kvm: x86: Fix DPL write back of segment registers X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=acaa75507b34f7b588924a09c76c6848d209e08c;p=qemu.git kvm: x86: Fix DPL write back of segment registers The DPL is stored in the flags and not in the selector. In fact, the RPL may differ from the DPL at some point in time, and so we were corrupting the guest state so far. Signed-off-by: Jan Kiszka Signed-off-by: Avi Kivity --- diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 9a4bf98831..ee7bdf8012 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -602,7 +602,7 @@ static void set_seg(struct kvm_segment *lhs, const SegmentCache *rhs) lhs->limit = rhs->limit; lhs->type = (flags >> DESC_TYPE_SHIFT) & 15; lhs->present = (flags & DESC_P_MASK) != 0; - lhs->dpl = rhs->selector & 3; + lhs->dpl = (flags >> DESC_DPL_SHIFT) & 3; lhs->db = (flags >> DESC_B_SHIFT) & 1; lhs->s = (flags & DESC_S_MASK) != 0; lhs->l = (flags >> DESC_L_SHIFT) & 1;