| 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; |
| @@ -366,7 +370,7 @@ |
| |
| /* Function to log information at runtime */ |
| |
| -//void printk(const char *fmt, ...); |
| +void printk(const char *fmt, ...); |
| |
| #ifdef __cplusplus |
| } /* End of "C" linkage for C++ */ |
| 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 |
| @@ -42,14 +42,6 @@ |
| #ifndef __X86EMU_X86EMU_H |
| #define __X86EMU_X86EMU_H |
| |
| -/* FIXME: undefine printk for the moment */ |
| -#ifdef LINUXBIOS_VERSION |
| -#include <console.h> |
| -#define printk(x...) printk(BIOS_DEBUG, x) |
| -#else |
| -#define printk printf |
| -#endif |
| - |
| #ifdef SCITECH |
| #include "scitech.h" |
| #define X86API _ASMAPI |
| @@ -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 */ |