From: Jack Lange Date: Thu, 30 Oct 2008 22:15:05 +0000 (-0500) Subject: fixed xed to handle SMSW instructions X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=976d67e1c6f988ca38ae83347859ccc86d485651 fixed xed to handle SMSW instructions FreeDOS works --- diff --git a/palacios/src/palacios/vmm_ctrl_regs.c b/palacios/src/palacios/vmm_ctrl_regs.c index 894bfc2..cc11c04 100644 --- a/palacios/src/palacios/vmm_ctrl_regs.c +++ b/palacios/src/palacios/vmm_ctrl_regs.c @@ -229,7 +229,7 @@ int v3_handle_cr0_read(struct guest_info * info) { struct cr0_32 * dst_reg = (struct cr0_32 *)(dec_instr.dst_operand.operand); struct cr0_32 * shadow_cr0 = (struct cr0_32 *)&(info->ctrl_regs.cr0); - PrintDebug("MOVCR2 (mode=%s)\n", info->cpu_mode); + PrintDebug("MOVCR2 (mode=%s)\n", v3_cpu_mode_to_str(info->cpu_mode)); if (info->shdw_pg_mode == SHADOW_PAGING) { struct cr0_32 * guest_cr0 = (struct cr0_32 *)&(info->shdw_pg_state.guest_cr0); diff --git a/palacios/src/palacios/vmm_xed.c b/palacios/src/palacios/vmm_xed.c index e6fa06c..9b16078 100644 --- a/palacios/src/palacios/vmm_xed.c +++ b/palacios/src/palacios/vmm_xed.c @@ -246,7 +246,7 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins if ((!xed_operand_is_register(op_enum)) || (!is_flags_reg(xed_decoded_inst_get_reg(&xed_instr, op_enum)))) { // special case - PrintDebug("Special Case not handled\n"); + PrintError("Special Case not handled\n"); return -1; } } @@ -256,7 +256,7 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins if (get_opcode(iform, &(instr->opcode)) == -1) { - PrintDebug("Could not get opcode. (iform=%s)\n", xed_iform_enum_t2str(iform)); + PrintError("Could not get opcode. (iform=%s)\n", xed_iform_enum_t2str(iform)); return -1; } @@ -430,7 +430,7 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins // set third operand if (instr->num_operands >= 3) { const xed_operand_t * op = xed_inst_operand(xi, 2); - // xed_operand_type_enum_t op_type = xed_operand_type(op); + xed_operand_type_enum_t op_type = xed_operand_type(op); xed_operand_enum_t op_enum = xed_operand_name(op); if (xed_operand_is_register(op_enum)) { @@ -454,7 +454,7 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins } else { - // PrintError("Unhandled third operand type %s\n", xed_operand_type_enum_t2str(op_type)); + PrintError("Unhandled third operand type %s\n", xed_operand_type_enum_t2str(op_type)); return -1; } @@ -987,6 +987,9 @@ static int get_opcode(xed_iform_enum_t iform, addr_t * opcode) { *opcode = (addr_t)&V3_OPCODE_MOV2CR; break; + case XED_IFORM_SMSW_GPRv: + *opcode = (addr_t)&V3_OPCODE_SMSW; + break; case XED_IFORM_LMSW_GPR16: *opcode = (addr_t)&V3_OPCODE_LMSW; @@ -996,6 +999,8 @@ static int get_opcode(xed_iform_enum_t iform, addr_t * opcode) { *opcode = (addr_t)&V3_OPCODE_CLTS; break; + + default: *opcode = 0; return -1;