lkml.org 
[lkml]   [2008]   [Jun]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 24/50] KVM: x86 emulator: add support for jmp far 0xea
    Date
    From: Guillaume Thouvenin <guillaume.thouvenin@ext.bull.net>

    Add support for jmp far (opcode 0xea) instruction.

    Signed-off-by: Guillaume Thouvenin <guillaume.thouvenin@ext.bull.net>
    Signed-off-by: Laurent Vivier <laurent.vivier@bull.net>
    Signed-off-by: Avi Kivity <avi@qumranet.com>
    ---
    arch/x86/kvm/x86_emulate.c | 31 +++++++++++++++++++++++++++++--
    1 files changed, 29 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
    index a928aa6..48b62cc 100644
    --- a/arch/x86/kvm/x86_emulate.c
    +++ b/arch/x86/kvm/x86_emulate.c
    @@ -168,7 +168,8 @@ static u16 opcode_table[256] = {
    /* 0xE0 - 0xE7 */
    0, 0, 0, 0, 0, 0, 0, 0,
    /* 0xE8 - 0xEF */
    - ImplicitOps | Stack, SrcImm|ImplicitOps, 0, SrcImmByte|ImplicitOps,
    + ImplicitOps | Stack, SrcImm | ImplicitOps,
    + ImplicitOps, SrcImmByte | ImplicitOps,
    0, 0, 0, 0,
    /* 0xF0 - 0xF7 */
    0, 0, 0, 0,
    @@ -1661,7 +1662,33 @@ special_insn:
    break;
    }
    case 0xe9: /* jmp rel */
    - case 0xeb: /* jmp rel short */
    + goto jmp;
    + case 0xea: /* jmp far */ {
    + uint32_t eip;
    + uint16_t sel;
    +
    + switch (c->op_bytes) {
    + case 2:
    + eip = insn_fetch(u16, 2, c->eip);
    + break;
    + case 4:
    + eip = insn_fetch(u32, 4, c->eip);
    + break;
    + default:
    + DPRINTF("jmp far: Invalid op_bytes\n");
    + goto cannot_emulate;
    + }
    + sel = insn_fetch(u16, 2, c->eip);
    + if (kvm_load_segment_descriptor(ctxt->vcpu, sel, 9, VCPU_SREG_CS) < 0) {
    + DPRINTF("jmp far: Failed to load CS descriptor\n");
    + goto cannot_emulate;
    + }
    +
    + c->eip = eip;
    + break;
    + }
    + case 0xeb:
    + jmp: /* jmp rel short */
    jmp_rel(c, c->src.val);
    c->dst.type = OP_NONE; /* Disable writeback. */
    break;
    --
    1.5.6


    \
     
     \ /
      Last update: 2008-06-26 14:45    [W:0.020 / U:93.252 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site