提交 869be99c 编写于 作者: A Avi Kivity

KVM: x86 emulator: make loading TR set the busy bit

Guest software doesn't actually depend on it, but vmx will refuse us
entry if we don't.  Set the bit in both the cached segment and memory,
just to be nice.
Signed-off-by: NAvi Kivity <avi@redhat.com>
上级 e919464b
...@@ -1335,7 +1335,7 @@ static int write_segment_descriptor(struct x86_emulate_ctxt *ctxt, ...@@ -1335,7 +1335,7 @@ static int write_segment_descriptor(struct x86_emulate_ctxt *ctxt,
static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt, static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
u16 selector, int seg) u16 selector, int seg)
{ {
struct desc_struct seg_desc; struct desc_struct seg_desc, old_desc;
u8 dpl, rpl, cpl; u8 dpl, rpl, cpl;
unsigned err_vec = GP_VECTOR; unsigned err_vec = GP_VECTOR;
u32 err_code = 0; u32 err_code = 0;
...@@ -1422,6 +1422,12 @@ static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt, ...@@ -1422,6 +1422,12 @@ static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
case VCPU_SREG_TR: case VCPU_SREG_TR:
if (seg_desc.s || (seg_desc.type != 1 && seg_desc.type != 9)) if (seg_desc.s || (seg_desc.type != 1 && seg_desc.type != 9))
goto exception; goto exception;
old_desc = seg_desc;
seg_desc.type |= 2; /* busy */
ret = ctxt->ops->cmpxchg_emulated(ctxt, desc_addr, &old_desc, &seg_desc,
sizeof(seg_desc), &ctxt->exception);
if (ret != X86EMUL_CONTINUE)
return ret;
break; break;
case VCPU_SREG_LDTR: case VCPU_SREG_LDTR:
if (seg_desc.s || seg_desc.type != 2) if (seg_desc.s || seg_desc.type != 2)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册