On Tue, Aug 18, 2009 at 5:39 PM, Avi Kivity<[email protected]> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html