KVM: x86 emulator: Check segment limits in real mode too
Segment limits are verified in real mode, not just protected mode. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
03ebebeb1f
commit
a5625189f6
@ -668,8 +668,6 @@ static int __linearize(struct x86_emulate_ctxt *ctxt,
|
|||||||
|
|
||||||
la = seg_base(ctxt, addr.seg) + addr.ea;
|
la = seg_base(ctxt, addr.seg) + addr.ea;
|
||||||
switch (ctxt->mode) {
|
switch (ctxt->mode) {
|
||||||
case X86EMUL_MODE_REAL:
|
|
||||||
break;
|
|
||||||
case X86EMUL_MODE_PROT64:
|
case X86EMUL_MODE_PROT64:
|
||||||
if (((signed long)la << 16) >> 16 != la)
|
if (((signed long)la << 16) >> 16 != la)
|
||||||
return emulate_gp(ctxt, 0);
|
return emulate_gp(ctxt, 0);
|
||||||
@ -699,6 +697,9 @@ static int __linearize(struct x86_emulate_ctxt *ctxt,
|
|||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
cpl = ctxt->ops->cpl(ctxt);
|
cpl = ctxt->ops->cpl(ctxt);
|
||||||
|
if (ctxt->mode == X86EMUL_MODE_REAL)
|
||||||
|
rpl = 0;
|
||||||
|
else
|
||||||
rpl = sel & 3;
|
rpl = sel & 3;
|
||||||
cpl = max(cpl, rpl);
|
cpl = max(cpl, rpl);
|
||||||
if (!(desc.type & 8)) {
|
if (!(desc.type & 8)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user