diff options
Diffstat (limited to 'qemu/roms/SLOF/other-licence/x86emu/x86emu_changes.diff')
-rw-r--r-- | qemu/roms/SLOF/other-licence/x86emu/x86emu_changes.diff | 877 |
1 files changed, 0 insertions, 877 deletions
diff --git a/qemu/roms/SLOF/other-licence/x86emu/x86emu_changes.diff b/qemu/roms/SLOF/other-licence/x86emu/x86emu_changes.diff deleted file mode 100644 index 52b971a7f..000000000 --- a/qemu/roms/SLOF/other-licence/x86emu/x86emu_changes.diff +++ /dev/null @@ -1,877 +0,0 @@ -Index: debug.c -=================================================================== -RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/debug.c,v -retrieving revision 1.1 -retrieving revision 1.3 -diff -u -u -r1.1 -r1.3 ---- debug.c 7 Sep 2007 10:01:21 -0000 1.1 -+++ debug.c 15 Jan 2008 13:49:25 -0000 1.3 -@@ -52,7 +52,11 @@ - void X86EMU_trace_regs (void) - { - if (DEBUG_TRACE()) { -- x86emu_dump_regs(); -+ if (M.x86.mode & (SYSMODE_PREFIX_DATA | SYSMODE_PREFIX_ADDR)) { -+ x86emu_dump_xregs(); -+ } else { -+ x86emu_dump_regs(); -+ } - } - if (DEBUG_DECODE() && ! DEBUG_DECODE_NOPRINT()) { - printk("%04x:%04x ",M.x86.saved_cs, M.x86.saved_ip); -@@ -185,7 +189,7 @@ - for (i=0; i< M.x86.enc_pos; i++) { - sprintf(buf1+2*i,"%02x", fetch_data_byte_abs(s,o+i)); - } -- printk("%-20s",buf1); -+ printk("%-20s ",buf1); - } - - static void print_decoded_instruction (void) -Index: ops2.c -=================================================================== -RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/ops2.c,v -retrieving revision 1.1 -retrieving revision 1.3 -diff -u -u -r1.1 -r1.3 ---- ops2.c 7 Sep 2007 10:01:21 -0000 1.1 -+++ ops2.c 20 Mar 2008 15:48:34 -0000 1.3 -@@ -149,8 +149,69 @@ - target += (s16) M.x86.R_IP; - DECODE_PRINTF2("%04x\n", target); - TRACE_AND_STEP(); -- if (cond) -+ if (cond) { - M.x86.R_IP = (u16)target; -+ JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, " LONG COND "); -+ } -+ DECODE_CLEAR_SEGOVR(); -+ END_OF_INSTR(); -+} -+ -+/**************************************************************************** -+REMARKS: -+Handles opcode 0x0f,0xC8-0xCF -+****************************************************************************/ -+s32 x86emu_bswap(s32 reg) -+{ -+ // perform the byte swap -+ s32 temp = reg; -+ reg = (temp & 0xFF000000) >> 24; -+ reg |= (temp & 0xFF0000) >> 8; -+ reg |= (temp & 0xFF00) << 8; -+ reg |= (temp & 0xFF) << 24; -+ return reg; -+} -+ -+void x86emuOp2_bswap(u8 op2) -+{ -+ /* byte swap 32 bit register */ -+ START_OF_INSTR(); -+ DECODE_PRINTF("BSWAP\t"); -+ switch (op2) { -+ case 0xc8: -+ DECODE_PRINTF("EAX\n"); -+ M.x86.R_EAX = x86emu_bswap(M.x86.R_EAX); -+ break; -+ case 0xc9: -+ DECODE_PRINTF("ECX\n"); -+ M.x86.R_ECX = x86emu_bswap(M.x86.R_ECX); -+ break; -+ case 0xca: -+ DECODE_PRINTF("EDX\n"); -+ M.x86.R_EDX = x86emu_bswap(M.x86.R_EDX); -+ break; -+ case 0xcb: -+ DECODE_PRINTF("EBX\n"); -+ M.x86.R_EBX = x86emu_bswap(M.x86.R_EBX); -+ break; -+ case 0xcc: -+ DECODE_PRINTF("ESP\n"); -+ M.x86.R_ESP = x86emu_bswap(M.x86.R_ESP); -+ break; -+ case 0xcd: -+ DECODE_PRINTF("EBP\n"); -+ M.x86.R_EBP = x86emu_bswap(M.x86.R_EBP); -+ break; -+ case 0xce: -+ DECODE_PRINTF("ESI\n"); -+ M.x86.R_ESI = x86emu_bswap(M.x86.R_ESI); -+ break; -+ case 0xcf: -+ DECODE_PRINTF("EDI\n"); -+ M.x86.R_EDI = x86emu_bswap(M.x86.R_EDI); -+ break; -+ } -+ TRACE_AND_STEP(); - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); - } -@@ -1702,14 +1763,14 @@ - /* 0xc5 */ x86emuOp2_illegal_op, - /* 0xc6 */ x86emuOp2_illegal_op, - /* 0xc7 */ x86emuOp2_illegal_op, --/* 0xc8 */ x86emuOp2_illegal_op, /* TODO: bswap */ --/* 0xc9 */ x86emuOp2_illegal_op, /* TODO: bswap */ --/* 0xca */ x86emuOp2_illegal_op, /* TODO: bswap */ --/* 0xcb */ x86emuOp2_illegal_op, /* TODO: bswap */ --/* 0xcc */ x86emuOp2_illegal_op, /* TODO: bswap */ --/* 0xcd */ x86emuOp2_illegal_op, /* TODO: bswap */ --/* 0xce */ x86emuOp2_illegal_op, /* TODO: bswap */ --/* 0xcf */ x86emuOp2_illegal_op, /* TODO: bswap */ -+/* 0xc8 */ x86emuOp2_bswap, -+/* 0xc9 */ x86emuOp2_bswap, -+/* 0xca */ x86emuOp2_bswap, -+/* 0xcb */ x86emuOp2_bswap, -+/* 0xcc */ x86emuOp2_bswap, -+/* 0xcd */ x86emuOp2_bswap, -+/* 0xce */ x86emuOp2_bswap, -+/* 0xcf */ x86emuOp2_bswap, - - /* 0xd0 */ x86emuOp2_illegal_op, - /* 0xd1 */ x86emuOp2_illegal_op, -Index: ops.c -=================================================================== -RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/ops.c,v -retrieving revision 1.1 -diff -u -u -r1.1 ops.c ---- ops.c 7 Sep 2007 10:01:21 -0000 1.1 -+++ ops.c 20 Mar 2008 16:52:00 -0000 -@@ -1061,7 +1061,11 @@ - imm = (s8)fetch_byte_imm(); - DECODE_PRINTF2("PUSH\t%d\n", imm); - TRACE_AND_STEP(); -- push_word(imm); -+ if (M.x86.mode & SYSMODE_PREFIX_DATA) { -+ push_long(imm); -+ } else { -+ push_word(imm); -+ } - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); - } -@@ -1256,8 +1260,10 @@ - target = (u16)(M.x86.R_IP + (s16)offset); - DECODE_PRINTF2("%x\n", target); - TRACE_AND_STEP(); -- if (cond) -+ if (cond) { - M.x86.R_IP = target; -+ JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, " NEAR COND "); -+ } - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); - } -@@ -2516,9 +2522,11 @@ - count = 1; - if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { - /* dont care whether REPE or REPNE */ -- /* move them until CX is ZERO. */ -- count = M.x86.R_CX; -+ /* move them until (E)CX is ZERO. */ -+ count = (M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX; - M.x86.R_CX = 0; -+ if (M.x86.mode & SYSMODE_32BIT_REP) -+ M.x86.R_ECX = 0; - M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); - } - while (count--) { -@@ -2526,6 +2534,8 @@ - store_data_byte_abs(M.x86.R_ES, M.x86.R_DI, val); - M.x86.R_SI += inc; - M.x86.R_DI += inc; -+ if (M.x86.intr & INTR_HALTED) -+ break; - } - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); -@@ -2559,9 +2569,11 @@ - count = 1; - if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { - /* dont care whether REPE or REPNE */ -- /* move them until CX is ZERO. */ -- count = M.x86.R_CX; -+ /* move them until (E)CX is ZERO. */ -+ count = (M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX; - M.x86.R_CX = 0; -+ if (M.x86.mode & SYSMODE_32BIT_REP) -+ M.x86.R_ECX = 0; - M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); - } - while (count--) { -@@ -2574,6 +2586,8 @@ - } - M.x86.R_SI += inc; - M.x86.R_DI += inc; -+ if (M.x86.intr & INTR_HALTED) -+ break; - } - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); -@@ -2598,16 +2612,21 @@ - - if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { - /* REPE */ -- /* move them until CX is ZERO. */ -- while (M.x86.R_CX != 0) { -+ /* move them until (E)CX is ZERO. */ -+ while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { - val1 = fetch_data_byte(M.x86.R_SI); - val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI); - cmp_byte(val1, val2); -- M.x86.R_CX -= 1; -+ if (M.x86.mode & SYSMODE_32BIT_REP) -+ M.x86.R_ECX -= 1; -+ else -+ M.x86.R_CX -= 1; - M.x86.R_SI += inc; - M.x86.R_DI += inc; - if ( (M.x86.mode & SYSMODE_PREFIX_REPE) && (ACCESS_FLAG(F_ZF) == 0) ) break; - if ( (M.x86.mode & SYSMODE_PREFIX_REPNE) && ACCESS_FLAG(F_ZF) ) break; -+ if (M.x86.intr & INTR_HALTED) -+ break; - } - M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); - } else { -@@ -2644,8 +2663,8 @@ - TRACE_AND_STEP(); - if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { - /* REPE */ -- /* move them until CX is ZERO. */ -- while (M.x86.R_CX != 0) { -+ /* move them until (E)CX is ZERO. */ -+ while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { - if (M.x86.mode & SYSMODE_PREFIX_DATA) { - val1 = fetch_data_long(M.x86.R_SI); - val2 = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI); -@@ -2655,11 +2674,16 @@ - val2 = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI); - cmp_word((u16)val1, (u16)val2); - } -- M.x86.R_CX -= 1; -+ if (M.x86.mode & SYSMODE_32BIT_REP) -+ M.x86.R_ECX -= 1; -+ else -+ M.x86.R_CX -= 1; - M.x86.R_SI += inc; - M.x86.R_DI += inc; - if ( (M.x86.mode & SYSMODE_PREFIX_REPE) && ACCESS_FLAG(F_ZF) == 0 ) break; - if ( (M.x86.mode & SYSMODE_PREFIX_REPNE) && ACCESS_FLAG(F_ZF) ) break; -+ if (M.x86.intr & INTR_HALTED) -+ break; - } - M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); - } else { -@@ -2741,11 +2765,16 @@ - TRACE_AND_STEP(); - if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { - /* dont care whether REPE or REPNE */ -- /* move them until CX is ZERO. */ -- while (M.x86.R_CX != 0) { -+ /* move them until (E)CX is ZERO. */ -+ while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { - store_data_byte_abs(M.x86.R_ES, M.x86.R_DI, M.x86.R_AL); -- M.x86.R_CX -= 1; -+ if (M.x86.mode & SYSMODE_32BIT_REP) -+ M.x86.R_ECX -= 1; -+ else -+ M.x86.R_CX -= 1; - M.x86.R_DI += inc; -+ if (M.x86.intr & INTR_HALTED) -+ break; - } - M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); - } else { -@@ -2783,9 +2812,11 @@ - count = 1; - if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { - /* dont care whether REPE or REPNE */ -- /* move them until CX is ZERO. */ -- count = M.x86.R_CX; -+ /* move them until (E)CX is ZERO. */ -+ count = (M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX; - M.x86.R_CX = 0; -+ if (M.x86.mode & SYSMODE_32BIT_REP) -+ M.x86.R_ECX = 0; - M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); - } - while (count--) { -@@ -2795,6 +2826,8 @@ - store_data_word_abs(M.x86.R_ES, M.x86.R_DI, M.x86.R_AX); - } - M.x86.R_DI += inc; -+ if (M.x86.intr & INTR_HALTED) -+ break; - } - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); -@@ -2817,11 +2850,16 @@ - inc = 1; - if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { - /* dont care whether REPE or REPNE */ -- /* move them until CX is ZERO. */ -- while (M.x86.R_CX != 0) { -+ /* move them until (E)CX is ZERO. */ -+ while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { - M.x86.R_AL = fetch_data_byte(M.x86.R_SI); -- M.x86.R_CX -= 1; -+ if (M.x86.mode & SYSMODE_32BIT_REP) -+ M.x86.R_ECX -= 1; -+ else -+ M.x86.R_CX -= 1; - M.x86.R_SI += inc; -+ if (M.x86.intr & INTR_HALTED) -+ break; - } - M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); - } else { -@@ -2859,9 +2897,11 @@ - count = 1; - if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { - /* dont care whether REPE or REPNE */ -- /* move them until CX is ZERO. */ -- count = M.x86.R_CX; -+ /* move them until (E)CX is ZERO. */ -+ count = (M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX; - M.x86.R_CX = 0; -+ if (M.x86.mode & SYSMODE_32BIT_REP) -+ M.x86.R_ECX = 0; - M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); - } - while (count--) { -@@ -2871,6 +2911,8 @@ - M.x86.R_AX = fetch_data_word(M.x86.R_SI); - } - M.x86.R_SI += inc; -+ if (M.x86.intr & INTR_HALTED) -+ break; - } - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); -@@ -2894,26 +2936,36 @@ - inc = 1; - if (M.x86.mode & SYSMODE_PREFIX_REPE) { - /* REPE */ -- /* move them until CX is ZERO. */ -- while (M.x86.R_CX != 0) { -+ /* move them until (E)CX is ZERO. */ -+ while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { - val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI); - cmp_byte(M.x86.R_AL, val2); -- M.x86.R_CX -= 1; -+ if (M.x86.mode & SYSMODE_32BIT_REP) -+ M.x86.R_ECX -= 1; -+ else -+ M.x86.R_CX -= 1; - M.x86.R_DI += inc; - if (ACCESS_FLAG(F_ZF) == 0) - break; -+ if (M.x86.intr & INTR_HALTED) -+ break; - } - M.x86.mode &= ~SYSMODE_PREFIX_REPE; - } else if (M.x86.mode & SYSMODE_PREFIX_REPNE) { - /* REPNE */ -- /* move them until CX is ZERO. */ -- while (M.x86.R_CX != 0) { -+ /* move them until (E)CX is ZERO. */ -+ while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { - val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI); - cmp_byte(M.x86.R_AL, val2); -- M.x86.R_CX -= 1; -+ if (M.x86.mode & SYSMODE_32BIT_REP) -+ M.x86.R_ECX -= 1; -+ else -+ M.x86.R_CX -= 1; - M.x86.R_DI += inc; - if (ACCESS_FLAG(F_ZF)) - break; /* zero flag set means equal */ -+ if (M.x86.intr & INTR_HALTED) -+ break; - } - M.x86.mode &= ~SYSMODE_PREFIX_REPNE; - } else { -@@ -2951,8 +3003,8 @@ - TRACE_AND_STEP(); - if (M.x86.mode & SYSMODE_PREFIX_REPE) { - /* REPE */ -- /* move them until CX is ZERO. */ -- while (M.x86.R_CX != 0) { -+ /* move them until (E)CX is ZERO. */ -+ while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { - if (M.x86.mode & SYSMODE_PREFIX_DATA) { - val = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI); - cmp_long(M.x86.R_EAX, val); -@@ -2960,16 +3012,21 @@ - val = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI); - cmp_word(M.x86.R_AX, (u16)val); - } -- M.x86.R_CX -= 1; -+ if (M.x86.mode & SYSMODE_32BIT_REP) -+ M.x86.R_ECX -= 1; -+ else -+ M.x86.R_CX -= 1; - M.x86.R_DI += inc; - if (ACCESS_FLAG(F_ZF) == 0) - break; -+ if (M.x86.intr & INTR_HALTED) -+ break; - } - M.x86.mode &= ~SYSMODE_PREFIX_REPE; - } else if (M.x86.mode & SYSMODE_PREFIX_REPNE) { - /* REPNE */ -- /* move them until CX is ZERO. */ -- while (M.x86.R_CX != 0) { -+ /* move them until (E)CX is ZERO. */ -+ while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { - if (M.x86.mode & SYSMODE_PREFIX_DATA) { - val = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI); - cmp_long(M.x86.R_EAX, val); -@@ -2977,10 +3034,15 @@ - val = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI); - cmp_word(M.x86.R_AX, (u16)val); - } -- M.x86.R_CX -= 1; -+ if (M.x86.mode & SYSMODE_32BIT_REP) -+ M.x86.R_ECX -= 1; -+ else -+ M.x86.R_CX -= 1; - M.x86.R_DI += inc; - if (ACCESS_FLAG(F_ZF)) - break; /* zero flag set means equal */ -+ if (M.x86.intr & INTR_HALTED) -+ break; - } - M.x86.mode &= ~SYSMODE_PREFIX_REPNE; - } else { -@@ -3238,9 +3300,9 @@ - DECODE_PRINTF("RET\t"); - imm = fetch_word_imm(); - DECODE_PRINTF2("%x\n", imm); -- RETURN_TRACE("RET",M.x86.saved_cs,M.x86.saved_ip); - TRACE_AND_STEP(); - M.x86.R_IP = pop_word(); -+ RETURN_TRACE(M.x86.saved_cs,M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, "NEAR"); - M.x86.R_SP += imm; - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); -@@ -3254,9 +3316,9 @@ - { - START_OF_INSTR(); - DECODE_PRINTF("RET\n"); -- RETURN_TRACE("RET",M.x86.saved_cs,M.x86.saved_ip); - TRACE_AND_STEP(); - M.x86.R_IP = pop_word(); -+ RETURN_TRACE(M.x86.saved_cs,M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, "NEAR"); - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); - } -@@ -3471,10 +3533,10 @@ - DECODE_PRINTF("RETF\t"); - imm = fetch_word_imm(); - DECODE_PRINTF2("%x\n", imm); -- RETURN_TRACE("RETF",M.x86.saved_cs,M.x86.saved_ip); - TRACE_AND_STEP(); - M.x86.R_IP = pop_word(); - M.x86.R_CS = pop_word(); -+ RETURN_TRACE(M.x86.saved_cs,M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, "FAR"); - M.x86.R_SP += imm; - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); -@@ -3488,10 +3550,10 @@ - { - START_OF_INSTR(); - DECODE_PRINTF("RETF\n"); -- RETURN_TRACE("RETF",M.x86.saved_cs,M.x86.saved_ip); - TRACE_AND_STEP(); - M.x86.R_IP = pop_word(); - M.x86.R_CS = pop_word(); -+ RETURN_TRACE(M.x86.saved_cs,M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, "FAR"); - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); - } -@@ -4020,8 +4082,11 @@ - ip += (s16) M.x86.R_IP; - DECODE_PRINTF2("%04x\n", ip); - TRACE_AND_STEP(); -- M.x86.R_CX -= 1; -- if (M.x86.R_CX != 0 && !ACCESS_FLAG(F_ZF)) /* CX != 0 and !ZF */ -+ if (M.x86.mode & SYSMODE_PREFIX_ADDR) -+ M.x86.R_ECX -= 1; -+ else -+ M.x86.R_CX -= 1; -+ if (((M.x86.mode & SYSMODE_PREFIX_ADDR) ? M.x86.R_ECX : M.x86.R_CX) != 0 && !ACCESS_FLAG(F_ZF)) /* (E)CX != 0 and !ZF */ - M.x86.R_IP = ip; - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); -@@ -4041,8 +4106,11 @@ - ip += (s16) M.x86.R_IP; - DECODE_PRINTF2("%04x\n", ip); - TRACE_AND_STEP(); -- M.x86.R_CX -= 1; -- if (M.x86.R_CX != 0 && ACCESS_FLAG(F_ZF)) /* CX != 0 and ZF */ -+ if (M.x86.mode & SYSMODE_PREFIX_ADDR) -+ M.x86.R_ECX -= 1; -+ else -+ M.x86.R_CX -= 1; -+ if (((M.x86.mode & SYSMODE_PREFIX_ADDR) ? M.x86.R_ECX : M.x86.R_CX) != 0 && ACCESS_FLAG(F_ZF)) /* (E)CX != 0 and ZF */ - M.x86.R_IP = ip; - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); -@@ -4062,8 +4130,11 @@ - ip += (s16) M.x86.R_IP; - DECODE_PRINTF2("%04x\n", ip); - TRACE_AND_STEP(); -- M.x86.R_CX -= 1; -- if (M.x86.R_CX != 0) -+ if (M.x86.mode & SYSMODE_PREFIX_ADDR) -+ M.x86.R_ECX -= 1; -+ else -+ M.x86.R_CX -= 1; -+ if (((M.x86.mode & SYSMODE_PREFIX_ADDR) ? M.x86.R_ECX : M.x86.R_CX) != 0) /* (E)CX != 0 */ - M.x86.R_IP = ip; - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); -@@ -4085,8 +4156,10 @@ - target = (u16)(M.x86.R_IP + offset); - DECODE_PRINTF2("%x\n", target); - TRACE_AND_STEP(); -- if (M.x86.R_CX == 0) -+ if (M.x86.R_CX == 0) { - M.x86.R_IP = target; -+ JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, " CXZ "); -+ } - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); - } -@@ -4213,6 +4286,7 @@ - ip = (s16)fetch_word_imm(); - ip += (s16)M.x86.R_IP; - DECODE_PRINTF2("%04x\n", ip); -+ JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, ip, " NEAR "); - TRACE_AND_STEP(); - M.x86.R_IP = (u16)ip; - DECODE_CLEAR_SEGOVR(); -@@ -4233,6 +4307,7 @@ - cs = fetch_word_imm(); - DECODE_PRINTF2("%04x:", cs); - DECODE_PRINTF2("%04x\n", ip); -+ JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, cs, ip, " FAR "); - TRACE_AND_STEP(); - M.x86.R_IP = ip; - M.x86.R_CS = cs; -@@ -4254,6 +4329,7 @@ - offset = (s8)fetch_byte_imm(); - target = (u16)(M.x86.R_IP + offset); - DECODE_PRINTF2("%x\n", target); -+ JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, target, " BYTE "); - TRACE_AND_STEP(); - M.x86.R_IP = target; - DECODE_CLEAR_SEGOVR(); -@@ -4357,6 +4433,8 @@ - DECODE_PRINTF("REPNE\n"); - TRACE_AND_STEP(); - M.x86.mode |= SYSMODE_PREFIX_REPNE; -+ if (M.x86.mode & SYSMODE_PREFIX_ADDR) -+ M.x86.mode |= SYSMODE_32BIT_REP; - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); - } -@@ -4371,6 +4449,8 @@ - DECODE_PRINTF("REPE\n"); - TRACE_AND_STEP(); - M.x86.mode |= SYSMODE_PREFIX_REPE; -+ if (M.x86.mode & SYSMODE_PREFIX_ADDR) -+ M.x86.mode |= SYSMODE_32BIT_REP; - DECODE_CLEAR_SEGOVR(); - END_OF_INSTR(); - } -@@ -5013,12 +5093,14 @@ - break; - case 4: /* jmp word ptr ... */ - destval = fetch_data_word(destoffset); -+ JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, destval, " WORD "); - TRACE_AND_STEP(); - M.x86.R_IP = destval; - break; - case 5: /* jmp far ptr ... */ - destval = fetch_data_word(destoffset); - destval2 = fetch_data_word(destoffset + 2); -+ JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, destval2, destval, " FAR "); - TRACE_AND_STEP(); - M.x86.R_IP = destval; - M.x86.R_CS = destval2; -Index: prim_ops.c -=================================================================== -RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/prim_ops.c,v -retrieving revision 1.1 -retrieving revision 1.3 -diff -u -u -r1.1 -r1.3 ---- prim_ops.c 7 Sep 2007 10:01:21 -0000 1.1 -+++ prim_ops.c 16 Jan 2008 14:18:15 -0000 1.3 -@@ -1921,7 +1921,7 @@ - void imul_long_direct(u32 *res_lo, u32* res_hi,u32 d, u32 s) - { - #ifdef __HAS_LONG_LONG__ -- s64 res = (s64)d * (s64)s; -+ s64 res = (s64)(s32)d * (s64)(s32)s; - - *res_lo = (u32)res; - *res_hi = (u32)(res >> 32); -@@ -2013,7 +2013,7 @@ - void mul_long(u32 s) - { - #ifdef __HAS_LONG_LONG__ -- u64 res = (u32)M.x86.R_EAX * (u32)s; -+ u64 res = (u64)M.x86.R_EAX * s; - - M.x86.R_EAX = (u32)res; - M.x86.R_EDX = (u32)(res >> 32); -@@ -2312,16 +2312,15 @@ - } - if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { - /* dont care whether REPE or REPNE */ -- /* in until CX is ZERO. */ -- u32 count = ((M.x86.mode & SYSMODE_PREFIX_DATA) ? -+ /* in until (E)CX is ZERO. */ -+ u32 count = ((M.x86.mode & SYSMODE_32BIT_REP) ? - M.x86.R_ECX : M.x86.R_CX); -- - while (count--) { - single_in(size); - M.x86.R_DI += inc; - } - M.x86.R_CX = 0; -- if (M.x86.mode & SYSMODE_PREFIX_DATA) { -+ if (M.x86.mode & SYSMODE_32BIT_REP) { - M.x86.R_ECX = 0; - } - M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); -@@ -2355,15 +2354,15 @@ - } - if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { - /* dont care whether REPE or REPNE */ -- /* out until CX is ZERO. */ -- u32 count = ((M.x86.mode & SYSMODE_PREFIX_DATA) ? -+ /* out until (E)CX is ZERO. */ -+ u32 count = ((M.x86.mode & SYSMODE_32BIT_REP) ? - M.x86.R_ECX : M.x86.R_CX); - while (count--) { - single_out(size); - M.x86.R_SI += inc; - } - M.x86.R_CX = 0; -- if (M.x86.mode & SYSMODE_PREFIX_DATA) { -+ if (M.x86.mode & SYSMODE_32BIT_REP) { - M.x86.R_ECX = 0; - } - M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); -Index: sys.c -=================================================================== -RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/sys.c,v -retrieving revision 1.1 -retrieving revision 1.2 -diff -u -u -r1.1 -r1.2 ---- sys.c 7 Sep 2007 10:01:21 -0000 1.1 -+++ sys.c 7 Sep 2007 10:03:13 -0000 1.2 -@@ -45,11 +45,6 @@ - #include <x86emu/regs.h> - #include "debug.h" - #include "prim_ops.h" --#ifdef LINUXBIOS_VERSION --#include "io.h" --#else --#include <sys/io.h> --#endif - - #ifdef IN_MODULE - #include "xf86_ansic.h" -@@ -220,7 +215,7 @@ - { - DB(if (DEBUG_IO_TRACE()) - printk("inb %#04x \n", addr);) -- return inb(addr); -+ return 0; - } - - /**************************************************************************** -@@ -235,7 +230,7 @@ - { - DB(if (DEBUG_IO_TRACE()) - printk("inw %#04x \n", addr);) -- return inw(addr); -+ return 0; - } - - /**************************************************************************** -@@ -250,7 +245,7 @@ - { - DB(if (DEBUG_IO_TRACE()) - printk("inl %#04x \n", addr);) -- return inl(addr); -+ return 0; - } - - /**************************************************************************** -@@ -264,7 +259,6 @@ - { - DB(if (DEBUG_IO_TRACE()) - printk("outb %#02x -> %#04x \n", val, addr);) -- outb(val, addr); - return; - } - -@@ -279,7 +273,6 @@ - { - DB(if (DEBUG_IO_TRACE()) - printk("outw %#04x -> %#04x \n", val, addr);) -- outw(val, addr); - return; - } - -@@ -295,7 +288,6 @@ - DB(if (DEBUG_IO_TRACE()) - printk("outl %#08x -> %#04x \n", val, addr);) - -- outl(val, addr); - return; - } - -@@ -405,6 +397,6 @@ - - void X86EMU_setMemBase(void *base, size_t size) - { -- M.mem_base = (int) base; -+ M.mem_base = (unsigned long) base; - M.mem_size = size; - } -Index: include/x86emu/debug.h -=================================================================== -RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/include/x86emu/debug.h,v -retrieving revision 1.1 -retrieving revision 1.4 -diff -u -u -r1.1 -r1.4 ---- include/x86emu/debug.h 7 Sep 2007 10:01:21 -0000 1.1 -+++ include/x86emu/debug.h 20 Mar 2008 15:25:27 -0000 1.4 -@@ -40,8 +40,6 @@ - #ifndef __X86EMU_DEBUG_H - #define __X86EMU_DEBUG_H - --//#define DEBUG 0 --#undef DEBUG - /*---------------------- Macros and type definitions ----------------------*/ - - /* checks to be enabled for "runtime" */ -@@ -78,6 +76,8 @@ - # define DEBUG_SYSINT() (M.x86.debug & DEBUG_SYSINT_F) - # define DEBUG_TRACECALL() (M.x86.debug & DEBUG_TRACECALL_F) - # define DEBUG_TRACECALLREGS() (M.x86.debug & DEBUG_TRACECALL_REGS_F) -+# define DEBUG_TRACEJMP() (M.x86.debug & DEBUG_TRACEJMP_F) -+# define DEBUG_TRACEJMPREGS() (M.x86.debug & DEBUG_TRACEJMP_REGS_F) - # define DEBUG_SYS() (M.x86.debug & DEBUG_SYS_F) - # define DEBUG_MEM_TRACE() (M.x86.debug & DEBUG_MEM_TRACE_F) - # define DEBUG_IO_TRACE() (M.x86.debug & DEBUG_IO_TRACE_F) -@@ -96,6 +96,8 @@ - # define DEBUG_SYSINT() 0 - # define DEBUG_TRACECALL() 0 - # define DEBUG_TRACECALLREGS() 0 -+# define DEBUG_TRACEJMP() 0 -+# define DEBUG_TRACEJMPREGS() 0 - # define DEBUG_SYS() 0 - # define DEBUG_MEM_TRACE() 0 - # define DEBUG_IO_TRACE() 0 -@@ -169,14 +171,20 @@ - x86emu_dump_regs(); \ - if (DEBUG_TRACECALL()) \ - printk("%04x:%04x: CALL %s%04x:%04x\n", u , v, s, w, x); --# define RETURN_TRACE(n,u,v) \ -+# define RETURN_TRACE(u,v,w,x,s) \ - if (DEBUG_TRACECALLREGS()) \ - x86emu_dump_regs(); \ - if (DEBUG_TRACECALL()) \ -- printk("%04x:%04x: %s\n",u,v,n); -+ printk("%04x:%04x: RET %s %04x:%04x\n",u,v,s,w,x); -+# define JMP_TRACE(u,v,w,x,s) \ -+ if (DEBUG_TRACEJMPREGS()) \ -+ x86emu_dump_regs(); \ -+ if (DEBUG_TRACEJMP()) \ -+ printk("%04x:%04x: JMP %s%04x:%04x\n", u , v, s, w, x); - #else - # define CALL_TRACE(u,v,w,x,s) --# define RETURN_TRACE(n,u,v) -+# define RETURN_TRACE(u,v,w,x,s) -+# define JMP_TRACE(u,v,w,x,s) - #endif - - #ifdef DEBUG -Index: include/x86emu/regs.h -=================================================================== -RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/include/x86emu/regs.h,v -retrieving revision 1.1 -retrieving revision 1.4 -diff -u -u -r1.1 -r1.4 ---- include/x86emu/regs.h 7 Sep 2007 10:01:21 -0000 1.1 -+++ include/x86emu/regs.h 15 Jan 2008 13:46:40 -0000 1.4 -@@ -231,6 +231,9 @@ - #define SYSMODE_PREFIX_REPNE 0x00000100 - #define SYSMODE_PREFIX_DATA 0x00000200 - #define SYSMODE_PREFIX_ADDR 0x00000400 -+//phueper: for REP(E|NE) Instructions, we need to decide wether it should be using -+//the 32bit ECX register as or the 16bit CX register as count register -+#define SYSMODE_32BIT_REP 0x00000800 - #define SYSMODE_INTR_PENDING 0x10000000 - #define SYSMODE_EXTRN_INTR 0x20000000 - #define SYSMODE_HALTED 0x40000000 -@@ -250,7 +253,8 @@ - SYSMODE_SEGOVR_GS | \ - SYSMODE_SEGOVR_SS | \ - SYSMODE_PREFIX_DATA | \ -- SYSMODE_PREFIX_ADDR) -+ SYSMODE_PREFIX_ADDR | \ -+ SYSMODE_32BIT_REP) - - #define INTR_SYNCH 0x1 - #define INTR_ASYNCH 0x2 -@@ -274,9 +278,9 @@ - */ - u32 mode; - volatile int intr; /* mask of pending interrupts */ -- int debug; -+ volatile int debug; - #ifdef DEBUG -- int check; -+ int check; - u16 saved_ip; - u16 saved_cs; - int enc_pos; -Index: include/x86emu/x86emu.h -=================================================================== -RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/include/x86emu/x86emu.h,v -retrieving revision 1.1 -retrieving revision 1.3 -diff -u -u -r1.1 -r1.3 ---- include/x86emu/x86emu.h 7 Sep 2007 10:01:21 -0000 1.1 -+++ include/x86emu/x86emu.h 19 Oct 2007 08:42:15 -0000 1.3 -@@ -47,6 +47,7 @@ - #include <console.h> - #define printk(x...) printk(BIOS_DEBUG, x) - #else -+#include <stdio.h> - #define printk printf - #endif - -@@ -189,6 +181,8 @@ - #define DEBUG_TRACECALL_REGS_F 0x004000 - #define DEBUG_DECODE_NOPRINT_F 0x008000 - #define DEBUG_SAVE_IP_CS_F 0x010000 -+#define DEBUG_TRACEJMP_F 0x020000 -+#define DEBUG_TRACEJMP_REGS_F 0x040000 - #define DEBUG_SYS_F (DEBUG_SVC_F|DEBUG_FS_F|DEBUG_PROC_F) - - void X86EMU_trace_regs(void); -@@ -200,5 +194,4 @@ - #ifdef __cplusplus - } /* End of "C" linkage for C++ */ - #endif -- - #endif /* __X86EMU_X86EMU_H */ |