Commit c2ad2bb3 authored by Avi Kivity's avatar Avi Kivity

KVM: x86 emulator: drop use of is_long_mode()

Requires ctxt->vcpu, which is to be abolished.  Replace with open calls
to get_msr().
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 1ac9d0cf
...@@ -1844,12 +1844,14 @@ emulate_syscall(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1844,12 +1844,14 @@ emulate_syscall(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
struct desc_struct cs, ss; struct desc_struct cs, ss;
u64 msr_data; u64 msr_data;
u16 cs_sel, ss_sel; u16 cs_sel, ss_sel;
u64 efer = 0;
/* syscall is not available in real mode */ /* syscall is not available in real mode */
if (ctxt->mode == X86EMUL_MODE_REAL || if (ctxt->mode == X86EMUL_MODE_REAL ||
ctxt->mode == X86EMUL_MODE_VM86) ctxt->mode == X86EMUL_MODE_VM86)
return emulate_ud(ctxt); return emulate_ud(ctxt);
ops->get_msr(ctxt, MSR_EFER, &efer);
setup_syscalls_segments(ctxt, ops, &cs, &ss); setup_syscalls_segments(ctxt, ops, &cs, &ss);
ops->get_msr(ctxt, MSR_STAR, &msr_data); ops->get_msr(ctxt, MSR_STAR, &msr_data);
...@@ -1857,7 +1859,7 @@ emulate_syscall(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1857,7 +1859,7 @@ emulate_syscall(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
cs_sel = (u16)(msr_data & 0xfffc); cs_sel = (u16)(msr_data & 0xfffc);
ss_sel = (u16)(msr_data + 8); ss_sel = (u16)(msr_data + 8);
if (is_long_mode(ctxt->vcpu)) { if (efer & EFER_LMA) {
cs.d = 0; cs.d = 0;
cs.l = 1; cs.l = 1;
} }
...@@ -1867,7 +1869,7 @@ emulate_syscall(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1867,7 +1869,7 @@ emulate_syscall(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
ops->set_segment_selector(ctxt, ss_sel, VCPU_SREG_SS); ops->set_segment_selector(ctxt, ss_sel, VCPU_SREG_SS);
c->regs[VCPU_REGS_RCX] = c->eip; c->regs[VCPU_REGS_RCX] = c->eip;
if (is_long_mode(ctxt->vcpu)) { if (efer & EFER_LMA) {
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
c->regs[VCPU_REGS_R11] = ctxt->eflags & ~EFLG_RF; c->regs[VCPU_REGS_R11] = ctxt->eflags & ~EFLG_RF;
...@@ -1897,7 +1899,9 @@ emulate_sysenter(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1897,7 +1899,9 @@ emulate_sysenter(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
struct desc_struct cs, ss; struct desc_struct cs, ss;
u64 msr_data; u64 msr_data;
u16 cs_sel, ss_sel; u16 cs_sel, ss_sel;
u64 efer = 0;
ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);
/* inject #GP if in real mode */ /* inject #GP if in real mode */
if (ctxt->mode == X86EMUL_MODE_REAL) if (ctxt->mode == X86EMUL_MODE_REAL)
return emulate_gp(ctxt, 0); return emulate_gp(ctxt, 0);
...@@ -1927,8 +1931,7 @@ emulate_sysenter(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1927,8 +1931,7 @@ emulate_sysenter(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
cs_sel &= ~SELECTOR_RPL_MASK; cs_sel &= ~SELECTOR_RPL_MASK;
ss_sel = cs_sel + 8; ss_sel = cs_sel + 8;
ss_sel &= ~SELECTOR_RPL_MASK; ss_sel &= ~SELECTOR_RPL_MASK;
if (ctxt->mode == X86EMUL_MODE_PROT64 if (ctxt->mode == X86EMUL_MODE_PROT64 || (efer & EFER_LMA)) {
|| is_long_mode(ctxt->vcpu)) {
cs.d = 0; cs.d = 0;
cs.l = 1; cs.l = 1;
} }
...@@ -2603,6 +2606,7 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt) ...@@ -2603,6 +2606,7 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt)
struct decode_cache *c = &ctxt->decode; struct decode_cache *c = &ctxt->decode;
u64 new_val = c->src.val64; u64 new_val = c->src.val64;
int cr = c->modrm_reg; int cr = c->modrm_reg;
u64 efer = 0;
static u64 cr_reserved_bits[] = { static u64 cr_reserved_bits[] = {
0xffffffff00000000ULL, 0xffffffff00000000ULL,
...@@ -2620,7 +2624,7 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt) ...@@ -2620,7 +2624,7 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt)
switch (cr) { switch (cr) {
case 0: { case 0: {
u64 cr4, efer; u64 cr4;
if (((new_val & X86_CR0_PG) && !(new_val & X86_CR0_PE)) || if (((new_val & X86_CR0_PG) && !(new_val & X86_CR0_PE)) ||
((new_val & X86_CR0_NW) && !(new_val & X86_CR0_CD))) ((new_val & X86_CR0_NW) && !(new_val & X86_CR0_CD)))
return emulate_gp(ctxt, 0); return emulate_gp(ctxt, 0);
...@@ -2637,7 +2641,8 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt) ...@@ -2637,7 +2641,8 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt)
case 3: { case 3: {
u64 rsvd = 0; u64 rsvd = 0;
if (is_long_mode(ctxt->vcpu)) ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);
if (efer & EFER_LMA)
rsvd = CR3_L_MODE_RESERVED_BITS; rsvd = CR3_L_MODE_RESERVED_BITS;
else if (is_pae(ctxt->vcpu)) else if (is_pae(ctxt->vcpu))
rsvd = CR3_PAE_RESERVED_BITS; rsvd = CR3_PAE_RESERVED_BITS;
...@@ -2650,7 +2655,7 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt) ...@@ -2650,7 +2655,7 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt)
break; break;
} }
case 4: { case 4: {
u64 cr4, efer; u64 cr4;
cr4 = ctxt->ops->get_cr(ctxt, 4); cr4 = ctxt->ops->get_cr(ctxt, 4);
ctxt->ops->get_msr(ctxt, MSR_EFER, &efer); ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment