From 8e761077e164cefe27359e79d8ed9dc2bb77560a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Sun, 18 Oct 2009 17:52:10 +0000 Subject: [PATCH] handle opcode 0xff subcode 7 as invalid instruction, fixes dif-2 and others Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3484 --- src/cpu/core_dyn_x86/decoder.h | 5 +++-- src/cpu/core_dynrec/decoder.h | 13 +++++++++++-- src/cpu/core_dynrec/decoder_opcodes.h | 15 ++++++++------- src/cpu/core_normal/prefix_66.h | 4 ++-- src/cpu/core_normal/prefix_none.h | 4 ++-- 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/cpu/core_dyn_x86/decoder.h b/src/cpu/core_dyn_x86/decoder.h index aba48201..3a838f34 100644 --- a/src/cpu/core_dyn_x86/decoder.h +++ b/src/cpu/core_dyn_x86/decoder.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: decoder.h,v 1.58 2009-10-08 20:01:31 c2woody Exp $ */ +/* $Id: decoder.h,v 1.59 2009-10-18 17:52:09 c2woody Exp $ */ #define X86_DYNFPU_DH_ENABLED #define X86_INLINED_MEMACCESS @@ -2665,7 +2665,8 @@ restart_prefix: dyn_push(src); break; default: - IllegalOption("opcode 0xff"); + LOG(LOG_CPU,LOG_ERROR)("CPU:GRP5:Illegal opcode 0xff"); + goto illegalopcode; }} break; default: diff --git a/src/cpu/core_dynrec/decoder.h b/src/cpu/core_dynrec/decoder.h index f2e077fc..8d7846c7 100644 --- a/src/cpu/core_dynrec/decoder.h +++ b/src/cpu/core_dynrec/decoder.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: decoder.h,v 1.7 2009-10-08 20:01:31 c2woody Exp $ */ +/* $Id: decoder.h,v 1.8 2009-10-18 17:52:10 c2woody Exp $ */ #include "decoder_basic.h" @@ -566,7 +566,16 @@ restart_prefix: if (dyn_grp4_eb()) goto finish_block; break; case 0xff: - if (dyn_grp4_ev()) goto core_close_block; + switch (dyn_grp4_ev()) { + case 0: + break; + case 1: + goto core_close_block; + case 2: + goto illegalopcode; + default: + break; + } break; default: diff --git a/src/cpu/core_dynrec/decoder_opcodes.h b/src/cpu/core_dynrec/decoder_opcodes.h index 25605046..b12733b3 100644 --- a/src/cpu/core_dynrec/decoder_opcodes.h +++ b/src/cpu/core_dynrec/decoder_opcodes.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: decoder_opcodes.h,v 1.9 2009-06-25 19:31:43 c2woody Exp $ */ +/* $Id: decoder_opcodes.h,v 1.10 2009-10-18 17:52:10 c2woody Exp $ */ /* @@ -818,7 +818,7 @@ static bool dyn_grp4_eb(void) { return false; } -static bool dyn_grp4_ev(void) { +static Bitu dyn_grp4_ev(void) { dyn_get_modrm(); if (decode.modrm.mod<3) { dyn_fill_ea(FC_ADDR); @@ -848,10 +848,10 @@ static bool dyn_grp4_ev(void) { gen_restore_addr_reg(); gen_mov_word_from_reg(FC_ADDR,decode.big_op?(void*)(®_eip):(void*)(®_ip),decode.big_op); - return true; + return 1; case 0x4: // JMP Ev gen_mov_word_from_reg(FC_OP1,decode.big_op?(void*)(®_eip):(void*)(®_ip),decode.big_op); - return true; + return 1; case 0x3: // CALL Ep case 0x5: // JMP Ep if (!decode.big_op) gen_extend_word(false,FC_OP1); @@ -865,15 +865,16 @@ static bool dyn_grp4_ev(void) { gen_restore_reg(FC_OP1,FC_ADDR); gen_call_function_IRRR(decode.modrm.reg == 3 ? (void*)(&CPU_CALL) : (void*)(&CPU_JMP), decode.big_op,FC_OP2,FC_ADDR,FC_RETOP); - return true; + return 1; case 0x6: // PUSH Ev if (decode.big_op) gen_call_function_raw((void*)&dynrec_push_dword); else gen_call_function_raw((void*)&dynrec_push_word); break; default: - IllegalOptionDynrec("dyn_grp4_ev"); +// IllegalOptionDynrec("dyn_grp4_ev"); + return 2; } - return false; + return 0; } diff --git a/src/cpu/core_normal/prefix_66.h b/src/cpu/core_normal/prefix_66.h index 3d34b705..39769ce8 100644 --- a/src/cpu/core_normal/prefix_66.h +++ b/src/cpu/core_normal/prefix_66.h @@ -709,8 +709,8 @@ else {GetEAa;Push_32(LoadMd(eaa));} break; default: - E_Exit("CPU:66:GRP5:Illegal call %2X",which); - break; + LOG(LOG_CPU,LOG_ERROR)("CPU:66:GRP5:Illegal call %2X",which); + goto illegal_opcode; } break; } diff --git a/src/cpu/core_normal/prefix_none.h b/src/cpu/core_normal/prefix_none.h index 6232be23..043cabdc 100644 --- a/src/cpu/core_normal/prefix_none.h +++ b/src/cpu/core_normal/prefix_none.h @@ -1165,8 +1165,8 @@ else {GetEAa;Push_16(LoadMw(eaa));} break; default: - E_Exit("CPU:GRP5:Illegal Call %2X",which); - break; + LOG(LOG_CPU,LOG_ERROR)("CPU:GRP5:Illegal Call %2X",which); + goto illegal_opcode; } break; }