On Tue, Aug 18, 2009 at 5:39 PM, Avi Kivity<avi@xxxxxxxxxx> wrote: > On 08/18/2009 03:48 PM, Mohammed Gamal wrote: >> >> + >> +static int emulate_pop_sreg(struct x86_emulate_ctxt *ctxt, >> + struct x86_emulate_ops *ops, int seg) >> +{ >> + struct kvm_segment segment; >> + int rc; >> + >> + kvm_x86_ops->get_segment(ctxt->vcpu,&segment, seg); >> + rc = emulate_pop(ctxt, ops,&segment.selector, sizeof(uint16_t)); >> > > 'pop seg' is still subject to the operand size (I think). > >> + kvm_x86_ops->set_segment(ctxt->vcpu,&segment, seg); >> But we're popping the contents of the stack top to a segment register which is going to be of 16-bits anyway, so we know the length before hand, no? > > You need to call kvm_load_segment_descriptor() so that the segment cache is > also loaded correctly. > > Note some of these instructions are not encodable in long mode; need to > check for that instead of emulating the wrong instruction. > >> @@ -1707,18 +1732,45 @@ special_insn: >> add: /* add */ >> emulate_2op_SrcV("add", c->src, c->dst, ctxt->eflags); >> break; >> + case 0x06: /* push es */ >> + emulate_push_sreg(ctxt, VCPU_SREG_ES); >> + break; >> + case 0x07: /* pop es */ >> + rc = emulate_pop_sreg(ctxt, ops, VCPU_SREG_ES); >> + if (rc != 0) >> + goto done; >> + break; >> case 0x08 ... 0x0d: >> or: /* or */ >> emulate_2op_SrcV("or", c->src, c->dst, ctxt->eflags); >> break; >> + case 0x0e: /* push cs */ >> + emulate_push_sreg(ctxt, VCPU_SREG_CS); >> + break; >> case 0x10 ... 0x15: >> adc: /* adc */ >> emulate_2op_SrcV("adc", c->src, c->dst, ctxt->eflags); >> break; >> + case 0x16: /* push ss */ >> + emulate_push_sreg(ctxt, VCPU_SREG_SS); >> + break; >> + case 0x17: /* pop ss */ >> + rc = emulate_pop_sreg(ctxt, ops, VCPU_SREG_SS); >> + if (rc != 0) >> + goto done; >> + break; >> case 0x18 ... 0x1d: >> sbb: /* sbb */ >> emulate_2op_SrcV("sbb", c->src, c->dst, ctxt->eflags); >> break; >> + case 0x1e: /* push ds */ >> + emulate_push_sreg(ctxt, VCPU_SREG_DS); >> + break; >> + case 0x1f: /* pop ds */ >> + rc = emulate_pop_sreg(ctxt, ops, VCPU_SREG_DS); >> + if (rc != 0) >> + goto done; >> + break; >> case 0x20 ... 0x25: >> and: /* and */ >> emulate_2op_SrcV("and", c->src, c->dst, ctxt->eflags); >> > > I was under the impression that the emulator doesn't support long mode yet, is that still the case? -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html