X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_xed.c;h=36612bafced9e500beaa647e41642481c64b0225;hb=5c74af8079462fc7b26ce6deb436ffe49e106137;hp=a3b39d5164c7fa9537c48018b1503c95569ae5a5;hpb=d3a58bbcc5cc9105e894771b1b2c39f76c86a70e;p=palacios-OLD.git diff --git a/palacios/src/palacios/vmm_xed.c b/palacios/src/palacios/vmm_xed.c index a3b39d5..36612ba 100644 --- a/palacios/src/palacios/vmm_xed.c +++ b/palacios/src/palacios/vmm_xed.c @@ -35,7 +35,7 @@ -#ifndef CONFIG_DEBUG_XED +#ifndef CONFIG_DEBUG_DECODER #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -203,11 +203,15 @@ static int decode_string_op(struct guest_info * info, return -1; } + if (get_memory_operand(info, xed_instr, 1, &(instr->src_operand)) == -1) { PrintError("Could not get Source memory operand\n"); return -1; } + instr->dst_operand.write = 1; + instr->src_operand.read = 1; + if (instr->prefixes.rep == 1) { addr_t reg_addr = 0; uint_t reg_length = 0; @@ -232,6 +236,9 @@ static int decode_string_op(struct guest_info * info, &(instr->src_operand.size)); instr->src_operand.type = REG_OPERAND; + instr->src_operand.read = 1; + instr->dst_operand.write = 1; + if (instr->prefixes.rep == 1) { addr_t reg_addr = 0; uint_t reg_length = 0; @@ -333,7 +340,7 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins xed_iform_enum_t iform = xed_decoded_inst_get_iform_enum(&xed_instr); -#ifdef CONFIG_DEBUG_XED +#ifdef CONFIG_DEBUG_DECODER xed_iclass_enum_t iclass = xed_decoded_inst_get_iclass(&xed_instr); PrintDebug("iform=%s, iclass=%s\n", xed_iform_enum_t2str(iform), xed_iclass_enum_t2str(iclass)); @@ -395,6 +402,18 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins v3_op = &(instr->dst_operand); + if ((op->_rw == XED_OPERAND_ACTION_RW) || + (op->_rw == XED_OPERAND_ACTION_R)|| + (op->_rw == XED_OPERAND_ACTION_RCW)) { + v3_op->read = 1; + } + + if ((op->_rw == XED_OPERAND_ACTION_RW) || + (op->_rw == XED_OPERAND_ACTION_W) || + (op->_rw == XED_OPERAND_ACTION_CRW)) { + v3_op->write = 1; + } + if (xed_operand_is_register(op_enum)) { xed_reg_enum_t xed_reg = xed_decoded_inst_get_reg(&xed_instr, op_enum); int v3_reg_type = xed_reg_to_v3_reg(info, @@ -461,6 +480,18 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins */ v3_op = &(instr->src_operand); + if ((op->_rw == XED_OPERAND_ACTION_RW) || + (op->_rw == XED_OPERAND_ACTION_R)|| + (op->_rw == XED_OPERAND_ACTION_RCW)) { + v3_op->read = 1; + } + + if ((op->_rw == XED_OPERAND_ACTION_RW) || + (op->_rw == XED_OPERAND_ACTION_W) || + (op->_rw == XED_OPERAND_ACTION_CRW)) { + v3_op->write = 1; + } + if (xed_operand_is_register(op_enum)) { xed_reg_enum_t xed_reg = xed_decoded_inst_get_reg(&xed_instr, op_enum); int v3_reg_type = xed_reg_to_v3_reg(info, @@ -527,6 +558,18 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins xed_operand_type_enum_t op_type = xed_operand_type(op); xed_operand_enum_t op_enum = xed_operand_name(op); + if ((op->_rw == XED_OPERAND_ACTION_RW) || + (op->_rw == XED_OPERAND_ACTION_R)|| + (op->_rw == XED_OPERAND_ACTION_RCW)) { + instr->third_operand.read = 1; + } + + if ((op->_rw == XED_OPERAND_ACTION_RW) || + (op->_rw == XED_OPERAND_ACTION_W) || + (op->_rw == XED_OPERAND_ACTION_CRW)) { + instr->third_operand.write = 1; + } + if (xed_operand_is_register(op_enum)) { xed_reg_enum_t xed_reg = xed_decoded_inst_get_reg(&xed_instr, op_enum); int v3_reg_type = xed_reg_to_v3_reg(info, @@ -556,7 +599,7 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins } -int v3_encode(struct guest_info * info, struct x86_instr * instr, char * instr_buf) { +int v3_encode(struct guest_info * info, struct x86_instr * instr, uint8_t * instr_buf) { return -1; }