Re: [PATCH] x86 emulator: Add 'push/pop sreg' instructions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux