mirror of
https://github.com/torvalds/linux.git
synced 2024-11-06 20:21:57 +00:00
KVM: x86: emulating descriptor load misses long-mode case
In 64-bit mode a #GP should be delivered to the guest "if the code segment descriptor pointed to by the selector in the 64-bit gate doesn't have the L-bit set and the D-bit clear." - Intel SDM "Interrupt 13—General Protection Exception (#GP)". This patch fixes the behavior of CS loading emulation code. Although the comment says that segment loading is not supported in long mode, this function is executed in long mode, so the fix is necassary. Signed-off-by: Nadav Amit <namit@cs.technion.ac.il> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
77c3913b74
commit
040c8dc8a5
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user