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);

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);


--
error compiling committee.c: too many arguments to function

--
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

Reply via email to