KVM: x86: emulating descriptor load misses long-mode case
[sfrench/cifs-2.6.git] / arch / x86 / kvm / emulate.c
index 20d91873d8319e5fd0174124a7cf96bba082ef09..a46207a0583508ad662d179f2db1ede320a7645e 100644 (file)
@@ -1504,6 +1504,15 @@ static int __load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
                        if (rpl > cpl || dpl != cpl)
                                goto exception;
                }
+               /* in long-mode d/b must be clear if l is set */
+               if (seg_desc.d && seg_desc.l) {
+                       u64 efer = 0;
+
+                       ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);
+                       if (efer & EFER_LMA)
+                               goto exception;
+               }
+
                /* CS(RPL) <- CPL */
                selector = (selector & 0xfffc) | cpl;
                break;