From: Jack Lange Date: Mon, 11 Apr 2011 23:52:47 +0000 (-0500) Subject: nother shot at movsx/movzx X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=4e5bdcc3b8c668e1ed6fe8cf3f595dbfdad8bb05;p=palacios.git nother shot at movsx/movzx --- diff --git a/palacios/include/palacios/vmm_decoder.h b/palacios/include/palacios/vmm_decoder.h index 145de82..aba2d40 100644 --- a/palacios/include/palacios/vmm_decoder.h +++ b/palacios/include/palacios/vmm_decoder.h @@ -43,8 +43,8 @@ struct x86_operand { addr_t operand; uint_t size; v3_operand_type_t type; - uint8_t read : 1; - uint8_t write : 1; + uint8_t read : 1; // This operand value will be read by the instruction + uint8_t write : 1; // This operand value will be written to by the instruction } __attribute__((packed)); struct x86_prefixes { diff --git a/palacios/src/palacios/vmm_v3dec.c b/palacios/src/palacios/vmm_v3dec.c index 2547087..4fa6e04 100644 --- a/palacios/src/palacios/vmm_v3dec.c +++ b/palacios/src/palacios/vmm_v3dec.c @@ -232,20 +232,66 @@ static int parse_operands(struct guest_info * core, uint8_t * instr_ptr, case SUB_MEM2_8: case XOR_MEM2_8: case MOV_MEM2_8: - case MOVSX_8: - case MOVZX_8: case ADC_MEM2: case ADD_MEM2: case AND_MEM2: case OR_MEM2: case SUB_MEM2: case XOR_MEM2: - case MOV_MEM2: + case MOV_MEM2: { + uint8_t reg_code = 0; + + ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->src_operand), ®_code); + + if (ret == -1) { + PrintError("Error decoding operand\n"); + return -1; + } + + instr_ptr += ret; + + instr->dst_operand.size = operand_width; + instr->dst_operand.type = REG_OPERAND; + decode_gpr(core, reg_code, &(instr->dst_operand)); + + instr->src_operand.read = 1; + instr->dst_operand.write = 1; + + instr->num_operands = 2; + + break; + } + case MOVSX_8: + case MOVZX_8: { + uint8_t reg_code = 0; + + ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->src_operand), ®_code); + instr->src_operand.size = 1; + + if (ret == -1) { + PrintError("Error decoding operand\n"); + return -1; + } + + instr_ptr += ret; + + instr->dst_operand.size = operand_width; + instr->dst_operand.type = REG_OPERAND; + decode_gpr(core, reg_code, &(instr->dst_operand)); + + instr->src_operand.read = 1; + instr->dst_operand.write = 1; + + instr->num_operands = 2; + + break; + } case MOVSX: case MOVZX: { uint8_t reg_code = 0; ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->src_operand), ®_code); + instr->src_operand.size = 2; if (ret == -1) { PrintError("Error decoding operand\n"); @@ -354,14 +400,13 @@ static int parse_operands(struct guest_info * core, uint8_t * instr_ptr, ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->dst_operand), ®_code); - if (ret == -1) { PrintError("Error decoding operand for (%s)\n", op_form_to_str(form)); return -1; } instr_ptr += ret; - + instr->src_operand.type = REG_OPERAND; instr->src_operand.size = operand_width; decode_cr(core, reg_code, &(instr->src_operand));