|
|
1.1 ! root 1: Index: debug.c ! 2: =================================================================== ! 3: RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/debug.c,v ! 4: retrieving revision 1.1 ! 5: retrieving revision 1.3 ! 6: diff -u -u -r1.1 -r1.3 ! 7: --- debug.c 7 Sep 2007 10:01:21 -0000 1.1 ! 8: +++ debug.c 15 Jan 2008 13:49:25 -0000 1.3 ! 9: @@ -52,7 +52,11 @@ ! 10: void X86EMU_trace_regs (void) ! 11: { ! 12: if (DEBUG_TRACE()) { ! 13: - x86emu_dump_regs(); ! 14: + if (M.x86.mode & (SYSMODE_PREFIX_DATA | SYSMODE_PREFIX_ADDR)) { ! 15: + x86emu_dump_xregs(); ! 16: + } else { ! 17: + x86emu_dump_regs(); ! 18: + } ! 19: } ! 20: if (DEBUG_DECODE() && ! DEBUG_DECODE_NOPRINT()) { ! 21: printk("%04x:%04x ",M.x86.saved_cs, M.x86.saved_ip); ! 22: @@ -185,7 +189,7 @@ ! 23: for (i=0; i< M.x86.enc_pos; i++) { ! 24: sprintf(buf1+2*i,"%02x", fetch_data_byte_abs(s,o+i)); ! 25: } ! 26: - printk("%-20s",buf1); ! 27: + printk("%-20s ",buf1); ! 28: } ! 29: ! 30: static void print_decoded_instruction (void) ! 31: Index: ops2.c ! 32: =================================================================== ! 33: RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/ops2.c,v ! 34: retrieving revision 1.1 ! 35: retrieving revision 1.3 ! 36: diff -u -u -r1.1 -r1.3 ! 37: --- ops2.c 7 Sep 2007 10:01:21 -0000 1.1 ! 38: +++ ops2.c 20 Mar 2008 15:48:34 -0000 1.3 ! 39: @@ -149,8 +149,69 @@ ! 40: target += (s16) M.x86.R_IP; ! 41: DECODE_PRINTF2("%04x\n", target); ! 42: TRACE_AND_STEP(); ! 43: - if (cond) ! 44: + if (cond) { ! 45: M.x86.R_IP = (u16)target; ! 46: + JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, " LONG COND "); ! 47: + } ! 48: + DECODE_CLEAR_SEGOVR(); ! 49: + END_OF_INSTR(); ! 50: +} ! 51: + ! 52: +/**************************************************************************** ! 53: +REMARKS: ! 54: +Handles opcode 0x0f,0xC8-0xCF ! 55: +****************************************************************************/ ! 56: +s32 x86emu_bswap(s32 reg) ! 57: +{ ! 58: + // perform the byte swap ! 59: + s32 temp = reg; ! 60: + reg = (temp & 0xFF000000) >> 24; ! 61: + reg |= (temp & 0xFF0000) >> 8; ! 62: + reg |= (temp & 0xFF00) << 8; ! 63: + reg |= (temp & 0xFF) << 24; ! 64: + return reg; ! 65: +} ! 66: + ! 67: +void x86emuOp2_bswap(u8 op2) ! 68: +{ ! 69: + /* byte swap 32 bit register */ ! 70: + START_OF_INSTR(); ! 71: + DECODE_PRINTF("BSWAP\t"); ! 72: + switch (op2) { ! 73: + case 0xc8: ! 74: + DECODE_PRINTF("EAX\n"); ! 75: + M.x86.R_EAX = x86emu_bswap(M.x86.R_EAX); ! 76: + break; ! 77: + case 0xc9: ! 78: + DECODE_PRINTF("ECX\n"); ! 79: + M.x86.R_ECX = x86emu_bswap(M.x86.R_ECX); ! 80: + break; ! 81: + case 0xca: ! 82: + DECODE_PRINTF("EDX\n"); ! 83: + M.x86.R_EDX = x86emu_bswap(M.x86.R_EDX); ! 84: + break; ! 85: + case 0xcb: ! 86: + DECODE_PRINTF("EBX\n"); ! 87: + M.x86.R_EBX = x86emu_bswap(M.x86.R_EBX); ! 88: + break; ! 89: + case 0xcc: ! 90: + DECODE_PRINTF("ESP\n"); ! 91: + M.x86.R_ESP = x86emu_bswap(M.x86.R_ESP); ! 92: + break; ! 93: + case 0xcd: ! 94: + DECODE_PRINTF("EBP\n"); ! 95: + M.x86.R_EBP = x86emu_bswap(M.x86.R_EBP); ! 96: + break; ! 97: + case 0xce: ! 98: + DECODE_PRINTF("ESI\n"); ! 99: + M.x86.R_ESI = x86emu_bswap(M.x86.R_ESI); ! 100: + break; ! 101: + case 0xcf: ! 102: + DECODE_PRINTF("EDI\n"); ! 103: + M.x86.R_EDI = x86emu_bswap(M.x86.R_EDI); ! 104: + break; ! 105: + } ! 106: + TRACE_AND_STEP(); ! 107: DECODE_CLEAR_SEGOVR(); ! 108: END_OF_INSTR(); ! 109: } ! 110: @@ -1702,14 +1763,14 @@ ! 111: /* 0xc5 */ x86emuOp2_illegal_op, ! 112: /* 0xc6 */ x86emuOp2_illegal_op, ! 113: /* 0xc7 */ x86emuOp2_illegal_op, ! 114: -/* 0xc8 */ x86emuOp2_illegal_op, /* TODO: bswap */ ! 115: -/* 0xc9 */ x86emuOp2_illegal_op, /* TODO: bswap */ ! 116: -/* 0xca */ x86emuOp2_illegal_op, /* TODO: bswap */ ! 117: -/* 0xcb */ x86emuOp2_illegal_op, /* TODO: bswap */ ! 118: -/* 0xcc */ x86emuOp2_illegal_op, /* TODO: bswap */ ! 119: -/* 0xcd */ x86emuOp2_illegal_op, /* TODO: bswap */ ! 120: -/* 0xce */ x86emuOp2_illegal_op, /* TODO: bswap */ ! 121: -/* 0xcf */ x86emuOp2_illegal_op, /* TODO: bswap */ ! 122: +/* 0xc8 */ x86emuOp2_bswap, ! 123: +/* 0xc9 */ x86emuOp2_bswap, ! 124: +/* 0xca */ x86emuOp2_bswap, ! 125: +/* 0xcb */ x86emuOp2_bswap, ! 126: +/* 0xcc */ x86emuOp2_bswap, ! 127: +/* 0xcd */ x86emuOp2_bswap, ! 128: +/* 0xce */ x86emuOp2_bswap, ! 129: +/* 0xcf */ x86emuOp2_bswap, ! 130: ! 131: /* 0xd0 */ x86emuOp2_illegal_op, ! 132: /* 0xd1 */ x86emuOp2_illegal_op, ! 133: Index: ops.c ! 134: =================================================================== ! 135: RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/ops.c,v ! 136: retrieving revision 1.1 ! 137: diff -u -u -r1.1 ops.c ! 138: --- ops.c 7 Sep 2007 10:01:21 -0000 1.1 ! 139: +++ ops.c 20 Mar 2008 16:52:00 -0000 ! 140: @@ -1061,7 +1061,11 @@ ! 141: imm = (s8)fetch_byte_imm(); ! 142: DECODE_PRINTF2("PUSH\t%d\n", imm); ! 143: TRACE_AND_STEP(); ! 144: - push_word(imm); ! 145: + if (M.x86.mode & SYSMODE_PREFIX_DATA) { ! 146: + push_long(imm); ! 147: + } else { ! 148: + push_word(imm); ! 149: + } ! 150: DECODE_CLEAR_SEGOVR(); ! 151: END_OF_INSTR(); ! 152: } ! 153: @@ -1256,8 +1260,10 @@ ! 154: target = (u16)(M.x86.R_IP + (s16)offset); ! 155: DECODE_PRINTF2("%x\n", target); ! 156: TRACE_AND_STEP(); ! 157: - if (cond) ! 158: + if (cond) { ! 159: M.x86.R_IP = target; ! 160: + JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, " NEAR COND "); ! 161: + } ! 162: DECODE_CLEAR_SEGOVR(); ! 163: END_OF_INSTR(); ! 164: } ! 165: @@ -2516,9 +2522,11 @@ ! 166: count = 1; ! 167: if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { ! 168: /* dont care whether REPE or REPNE */ ! 169: - /* move them until CX is ZERO. */ ! 170: - count = M.x86.R_CX; ! 171: + /* move them until (E)CX is ZERO. */ ! 172: + count = (M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX; ! 173: M.x86.R_CX = 0; ! 174: + if (M.x86.mode & SYSMODE_32BIT_REP) ! 175: + M.x86.R_ECX = 0; ! 176: M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); ! 177: } ! 178: while (count--) { ! 179: @@ -2526,6 +2534,8 @@ ! 180: store_data_byte_abs(M.x86.R_ES, M.x86.R_DI, val); ! 181: M.x86.R_SI += inc; ! 182: M.x86.R_DI += inc; ! 183: + if (M.x86.intr & INTR_HALTED) ! 184: + break; ! 185: } ! 186: DECODE_CLEAR_SEGOVR(); ! 187: END_OF_INSTR(); ! 188: @@ -2559,9 +2569,11 @@ ! 189: count = 1; ! 190: if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { ! 191: /* dont care whether REPE or REPNE */ ! 192: - /* move them until CX is ZERO. */ ! 193: - count = M.x86.R_CX; ! 194: + /* move them until (E)CX is ZERO. */ ! 195: + count = (M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX; ! 196: M.x86.R_CX = 0; ! 197: + if (M.x86.mode & SYSMODE_32BIT_REP) ! 198: + M.x86.R_ECX = 0; ! 199: M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); ! 200: } ! 201: while (count--) { ! 202: @@ -2574,6 +2586,8 @@ ! 203: } ! 204: M.x86.R_SI += inc; ! 205: M.x86.R_DI += inc; ! 206: + if (M.x86.intr & INTR_HALTED) ! 207: + break; ! 208: } ! 209: DECODE_CLEAR_SEGOVR(); ! 210: END_OF_INSTR(); ! 211: @@ -2598,16 +2612,21 @@ ! 212: ! 213: if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { ! 214: /* REPE */ ! 215: - /* move them until CX is ZERO. */ ! 216: - while (M.x86.R_CX != 0) { ! 217: + /* move them until (E)CX is ZERO. */ ! 218: + while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { ! 219: val1 = fetch_data_byte(M.x86.R_SI); ! 220: val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI); ! 221: cmp_byte(val1, val2); ! 222: - M.x86.R_CX -= 1; ! 223: + if (M.x86.mode & SYSMODE_32BIT_REP) ! 224: + M.x86.R_ECX -= 1; ! 225: + else ! 226: + M.x86.R_CX -= 1; ! 227: M.x86.R_SI += inc; ! 228: M.x86.R_DI += inc; ! 229: if ( (M.x86.mode & SYSMODE_PREFIX_REPE) && (ACCESS_FLAG(F_ZF) == 0) ) break; ! 230: if ( (M.x86.mode & SYSMODE_PREFIX_REPNE) && ACCESS_FLAG(F_ZF) ) break; ! 231: + if (M.x86.intr & INTR_HALTED) ! 232: + break; ! 233: } ! 234: M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); ! 235: } else { ! 236: @@ -2644,8 +2663,8 @@ ! 237: TRACE_AND_STEP(); ! 238: if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { ! 239: /* REPE */ ! 240: - /* move them until CX is ZERO. */ ! 241: - while (M.x86.R_CX != 0) { ! 242: + /* move them until (E)CX is ZERO. */ ! 243: + while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { ! 244: if (M.x86.mode & SYSMODE_PREFIX_DATA) { ! 245: val1 = fetch_data_long(M.x86.R_SI); ! 246: val2 = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI); ! 247: @@ -2655,11 +2674,16 @@ ! 248: val2 = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI); ! 249: cmp_word((u16)val1, (u16)val2); ! 250: } ! 251: - M.x86.R_CX -= 1; ! 252: + if (M.x86.mode & SYSMODE_32BIT_REP) ! 253: + M.x86.R_ECX -= 1; ! 254: + else ! 255: + M.x86.R_CX -= 1; ! 256: M.x86.R_SI += inc; ! 257: M.x86.R_DI += inc; ! 258: if ( (M.x86.mode & SYSMODE_PREFIX_REPE) && ACCESS_FLAG(F_ZF) == 0 ) break; ! 259: if ( (M.x86.mode & SYSMODE_PREFIX_REPNE) && ACCESS_FLAG(F_ZF) ) break; ! 260: + if (M.x86.intr & INTR_HALTED) ! 261: + break; ! 262: } ! 263: M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); ! 264: } else { ! 265: @@ -2741,11 +2765,16 @@ ! 266: TRACE_AND_STEP(); ! 267: if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { ! 268: /* dont care whether REPE or REPNE */ ! 269: - /* move them until CX is ZERO. */ ! 270: - while (M.x86.R_CX != 0) { ! 271: + /* move them until (E)CX is ZERO. */ ! 272: + while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { ! 273: store_data_byte_abs(M.x86.R_ES, M.x86.R_DI, M.x86.R_AL); ! 274: - M.x86.R_CX -= 1; ! 275: + if (M.x86.mode & SYSMODE_32BIT_REP) ! 276: + M.x86.R_ECX -= 1; ! 277: + else ! 278: + M.x86.R_CX -= 1; ! 279: M.x86.R_DI += inc; ! 280: + if (M.x86.intr & INTR_HALTED) ! 281: + break; ! 282: } ! 283: M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); ! 284: } else { ! 285: @@ -2783,9 +2812,11 @@ ! 286: count = 1; ! 287: if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { ! 288: /* dont care whether REPE or REPNE */ ! 289: - /* move them until CX is ZERO. */ ! 290: - count = M.x86.R_CX; ! 291: + /* move them until (E)CX is ZERO. */ ! 292: + count = (M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX; ! 293: M.x86.R_CX = 0; ! 294: + if (M.x86.mode & SYSMODE_32BIT_REP) ! 295: + M.x86.R_ECX = 0; ! 296: M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); ! 297: } ! 298: while (count--) { ! 299: @@ -2795,6 +2826,8 @@ ! 300: store_data_word_abs(M.x86.R_ES, M.x86.R_DI, M.x86.R_AX); ! 301: } ! 302: M.x86.R_DI += inc; ! 303: + if (M.x86.intr & INTR_HALTED) ! 304: + break; ! 305: } ! 306: DECODE_CLEAR_SEGOVR(); ! 307: END_OF_INSTR(); ! 308: @@ -2817,11 +2850,16 @@ ! 309: inc = 1; ! 310: if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { ! 311: /* dont care whether REPE or REPNE */ ! 312: - /* move them until CX is ZERO. */ ! 313: - while (M.x86.R_CX != 0) { ! 314: + /* move them until (E)CX is ZERO. */ ! 315: + while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { ! 316: M.x86.R_AL = fetch_data_byte(M.x86.R_SI); ! 317: - M.x86.R_CX -= 1; ! 318: + if (M.x86.mode & SYSMODE_32BIT_REP) ! 319: + M.x86.R_ECX -= 1; ! 320: + else ! 321: + M.x86.R_CX -= 1; ! 322: M.x86.R_SI += inc; ! 323: + if (M.x86.intr & INTR_HALTED) ! 324: + break; ! 325: } ! 326: M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); ! 327: } else { ! 328: @@ -2859,9 +2897,11 @@ ! 329: count = 1; ! 330: if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { ! 331: /* dont care whether REPE or REPNE */ ! 332: - /* move them until CX is ZERO. */ ! 333: - count = M.x86.R_CX; ! 334: + /* move them until (E)CX is ZERO. */ ! 335: + count = (M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX; ! 336: M.x86.R_CX = 0; ! 337: + if (M.x86.mode & SYSMODE_32BIT_REP) ! 338: + M.x86.R_ECX = 0; ! 339: M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); ! 340: } ! 341: while (count--) { ! 342: @@ -2871,6 +2911,8 @@ ! 343: M.x86.R_AX = fetch_data_word(M.x86.R_SI); ! 344: } ! 345: M.x86.R_SI += inc; ! 346: + if (M.x86.intr & INTR_HALTED) ! 347: + break; ! 348: } ! 349: DECODE_CLEAR_SEGOVR(); ! 350: END_OF_INSTR(); ! 351: @@ -2894,26 +2936,36 @@ ! 352: inc = 1; ! 353: if (M.x86.mode & SYSMODE_PREFIX_REPE) { ! 354: /* REPE */ ! 355: - /* move them until CX is ZERO. */ ! 356: - while (M.x86.R_CX != 0) { ! 357: + /* move them until (E)CX is ZERO. */ ! 358: + while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { ! 359: val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI); ! 360: cmp_byte(M.x86.R_AL, val2); ! 361: - M.x86.R_CX -= 1; ! 362: + if (M.x86.mode & SYSMODE_32BIT_REP) ! 363: + M.x86.R_ECX -= 1; ! 364: + else ! 365: + M.x86.R_CX -= 1; ! 366: M.x86.R_DI += inc; ! 367: if (ACCESS_FLAG(F_ZF) == 0) ! 368: break; ! 369: + if (M.x86.intr & INTR_HALTED) ! 370: + break; ! 371: } ! 372: M.x86.mode &= ~SYSMODE_PREFIX_REPE; ! 373: } else if (M.x86.mode & SYSMODE_PREFIX_REPNE) { ! 374: /* REPNE */ ! 375: - /* move them until CX is ZERO. */ ! 376: - while (M.x86.R_CX != 0) { ! 377: + /* move them until (E)CX is ZERO. */ ! 378: + while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { ! 379: val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI); ! 380: cmp_byte(M.x86.R_AL, val2); ! 381: - M.x86.R_CX -= 1; ! 382: + if (M.x86.mode & SYSMODE_32BIT_REP) ! 383: + M.x86.R_ECX -= 1; ! 384: + else ! 385: + M.x86.R_CX -= 1; ! 386: M.x86.R_DI += inc; ! 387: if (ACCESS_FLAG(F_ZF)) ! 388: break; /* zero flag set means equal */ ! 389: + if (M.x86.intr & INTR_HALTED) ! 390: + break; ! 391: } ! 392: M.x86.mode &= ~SYSMODE_PREFIX_REPNE; ! 393: } else { ! 394: @@ -2951,8 +3003,8 @@ ! 395: TRACE_AND_STEP(); ! 396: if (M.x86.mode & SYSMODE_PREFIX_REPE) { ! 397: /* REPE */ ! 398: - /* move them until CX is ZERO. */ ! 399: - while (M.x86.R_CX != 0) { ! 400: + /* move them until (E)CX is ZERO. */ ! 401: + while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { ! 402: if (M.x86.mode & SYSMODE_PREFIX_DATA) { ! 403: val = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI); ! 404: cmp_long(M.x86.R_EAX, val); ! 405: @@ -2960,16 +3012,21 @@ ! 406: val = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI); ! 407: cmp_word(M.x86.R_AX, (u16)val); ! 408: } ! 409: - M.x86.R_CX -= 1; ! 410: + if (M.x86.mode & SYSMODE_32BIT_REP) ! 411: + M.x86.R_ECX -= 1; ! 412: + else ! 413: + M.x86.R_CX -= 1; ! 414: M.x86.R_DI += inc; ! 415: if (ACCESS_FLAG(F_ZF) == 0) ! 416: break; ! 417: + if (M.x86.intr & INTR_HALTED) ! 418: + break; ! 419: } ! 420: M.x86.mode &= ~SYSMODE_PREFIX_REPE; ! 421: } else if (M.x86.mode & SYSMODE_PREFIX_REPNE) { ! 422: /* REPNE */ ! 423: - /* move them until CX is ZERO. */ ! 424: - while (M.x86.R_CX != 0) { ! 425: + /* move them until (E)CX is ZERO. */ ! 426: + while (((M.x86.mode & SYSMODE_32BIT_REP) ? M.x86.R_ECX : M.x86.R_CX) != 0) { ! 427: if (M.x86.mode & SYSMODE_PREFIX_DATA) { ! 428: val = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI); ! 429: cmp_long(M.x86.R_EAX, val); ! 430: @@ -2977,10 +3034,15 @@ ! 431: val = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI); ! 432: cmp_word(M.x86.R_AX, (u16)val); ! 433: } ! 434: - M.x86.R_CX -= 1; ! 435: + if (M.x86.mode & SYSMODE_32BIT_REP) ! 436: + M.x86.R_ECX -= 1; ! 437: + else ! 438: + M.x86.R_CX -= 1; ! 439: M.x86.R_DI += inc; ! 440: if (ACCESS_FLAG(F_ZF)) ! 441: break; /* zero flag set means equal */ ! 442: + if (M.x86.intr & INTR_HALTED) ! 443: + break; ! 444: } ! 445: M.x86.mode &= ~SYSMODE_PREFIX_REPNE; ! 446: } else { ! 447: @@ -3238,9 +3300,9 @@ ! 448: DECODE_PRINTF("RET\t"); ! 449: imm = fetch_word_imm(); ! 450: DECODE_PRINTF2("%x\n", imm); ! 451: - RETURN_TRACE("RET",M.x86.saved_cs,M.x86.saved_ip); ! 452: TRACE_AND_STEP(); ! 453: M.x86.R_IP = pop_word(); ! 454: + RETURN_TRACE(M.x86.saved_cs,M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, "NEAR"); ! 455: M.x86.R_SP += imm; ! 456: DECODE_CLEAR_SEGOVR(); ! 457: END_OF_INSTR(); ! 458: @@ -3254,9 +3316,9 @@ ! 459: { ! 460: START_OF_INSTR(); ! 461: DECODE_PRINTF("RET\n"); ! 462: - RETURN_TRACE("RET",M.x86.saved_cs,M.x86.saved_ip); ! 463: TRACE_AND_STEP(); ! 464: M.x86.R_IP = pop_word(); ! 465: + RETURN_TRACE(M.x86.saved_cs,M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, "NEAR"); ! 466: DECODE_CLEAR_SEGOVR(); ! 467: END_OF_INSTR(); ! 468: } ! 469: @@ -3471,10 +3533,10 @@ ! 470: DECODE_PRINTF("RETF\t"); ! 471: imm = fetch_word_imm(); ! 472: DECODE_PRINTF2("%x\n", imm); ! 473: - RETURN_TRACE("RETF",M.x86.saved_cs,M.x86.saved_ip); ! 474: TRACE_AND_STEP(); ! 475: M.x86.R_IP = pop_word(); ! 476: M.x86.R_CS = pop_word(); ! 477: + RETURN_TRACE(M.x86.saved_cs,M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, "FAR"); ! 478: M.x86.R_SP += imm; ! 479: DECODE_CLEAR_SEGOVR(); ! 480: END_OF_INSTR(); ! 481: @@ -3488,10 +3550,10 @@ ! 482: { ! 483: START_OF_INSTR(); ! 484: DECODE_PRINTF("RETF\n"); ! 485: - RETURN_TRACE("RETF",M.x86.saved_cs,M.x86.saved_ip); ! 486: TRACE_AND_STEP(); ! 487: M.x86.R_IP = pop_word(); ! 488: M.x86.R_CS = pop_word(); ! 489: + RETURN_TRACE(M.x86.saved_cs,M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, "FAR"); ! 490: DECODE_CLEAR_SEGOVR(); ! 491: END_OF_INSTR(); ! 492: } ! 493: @@ -4020,8 +4082,11 @@ ! 494: ip += (s16) M.x86.R_IP; ! 495: DECODE_PRINTF2("%04x\n", ip); ! 496: TRACE_AND_STEP(); ! 497: - M.x86.R_CX -= 1; ! 498: - if (M.x86.R_CX != 0 && !ACCESS_FLAG(F_ZF)) /* CX != 0 and !ZF */ ! 499: + if (M.x86.mode & SYSMODE_PREFIX_ADDR) ! 500: + M.x86.R_ECX -= 1; ! 501: + else ! 502: + M.x86.R_CX -= 1; ! 503: + 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 */ ! 504: M.x86.R_IP = ip; ! 505: DECODE_CLEAR_SEGOVR(); ! 506: END_OF_INSTR(); ! 507: @@ -4041,8 +4106,11 @@ ! 508: ip += (s16) M.x86.R_IP; ! 509: DECODE_PRINTF2("%04x\n", ip); ! 510: TRACE_AND_STEP(); ! 511: - M.x86.R_CX -= 1; ! 512: - if (M.x86.R_CX != 0 && ACCESS_FLAG(F_ZF)) /* CX != 0 and ZF */ ! 513: + if (M.x86.mode & SYSMODE_PREFIX_ADDR) ! 514: + M.x86.R_ECX -= 1; ! 515: + else ! 516: + M.x86.R_CX -= 1; ! 517: + 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 */ ! 518: M.x86.R_IP = ip; ! 519: DECODE_CLEAR_SEGOVR(); ! 520: END_OF_INSTR(); ! 521: @@ -4062,8 +4130,11 @@ ! 522: ip += (s16) M.x86.R_IP; ! 523: DECODE_PRINTF2("%04x\n", ip); ! 524: TRACE_AND_STEP(); ! 525: - M.x86.R_CX -= 1; ! 526: - if (M.x86.R_CX != 0) ! 527: + if (M.x86.mode & SYSMODE_PREFIX_ADDR) ! 528: + M.x86.R_ECX -= 1; ! 529: + else ! 530: + M.x86.R_CX -= 1; ! 531: + if (((M.x86.mode & SYSMODE_PREFIX_ADDR) ? M.x86.R_ECX : M.x86.R_CX) != 0) /* (E)CX != 0 */ ! 532: M.x86.R_IP = ip; ! 533: DECODE_CLEAR_SEGOVR(); ! 534: END_OF_INSTR(); ! 535: @@ -4085,8 +4156,10 @@ ! 536: target = (u16)(M.x86.R_IP + offset); ! 537: DECODE_PRINTF2("%x\n", target); ! 538: TRACE_AND_STEP(); ! 539: - if (M.x86.R_CX == 0) ! 540: + if (M.x86.R_CX == 0) { ! 541: M.x86.R_IP = target; ! 542: + JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, " CXZ "); ! 543: + } ! 544: DECODE_CLEAR_SEGOVR(); ! 545: END_OF_INSTR(); ! 546: } ! 547: @@ -4213,6 +4286,7 @@ ! 548: ip = (s16)fetch_word_imm(); ! 549: ip += (s16)M.x86.R_IP; ! 550: DECODE_PRINTF2("%04x\n", ip); ! 551: + JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, ip, " NEAR "); ! 552: TRACE_AND_STEP(); ! 553: M.x86.R_IP = (u16)ip; ! 554: DECODE_CLEAR_SEGOVR(); ! 555: @@ -4233,6 +4307,7 @@ ! 556: cs = fetch_word_imm(); ! 557: DECODE_PRINTF2("%04x:", cs); ! 558: DECODE_PRINTF2("%04x\n", ip); ! 559: + JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, cs, ip, " FAR "); ! 560: TRACE_AND_STEP(); ! 561: M.x86.R_IP = ip; ! 562: M.x86.R_CS = cs; ! 563: @@ -4254,6 +4329,7 @@ ! 564: offset = (s8)fetch_byte_imm(); ! 565: target = (u16)(M.x86.R_IP + offset); ! 566: DECODE_PRINTF2("%x\n", target); ! 567: + JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, target, " BYTE "); ! 568: TRACE_AND_STEP(); ! 569: M.x86.R_IP = target; ! 570: DECODE_CLEAR_SEGOVR(); ! 571: @@ -4357,6 +4433,8 @@ ! 572: DECODE_PRINTF("REPNE\n"); ! 573: TRACE_AND_STEP(); ! 574: M.x86.mode |= SYSMODE_PREFIX_REPNE; ! 575: + if (M.x86.mode & SYSMODE_PREFIX_ADDR) ! 576: + M.x86.mode |= SYSMODE_32BIT_REP; ! 577: DECODE_CLEAR_SEGOVR(); ! 578: END_OF_INSTR(); ! 579: } ! 580: @@ -4371,6 +4449,8 @@ ! 581: DECODE_PRINTF("REPE\n"); ! 582: TRACE_AND_STEP(); ! 583: M.x86.mode |= SYSMODE_PREFIX_REPE; ! 584: + if (M.x86.mode & SYSMODE_PREFIX_ADDR) ! 585: + M.x86.mode |= SYSMODE_32BIT_REP; ! 586: DECODE_CLEAR_SEGOVR(); ! 587: END_OF_INSTR(); ! 588: } ! 589: @@ -5013,12 +5093,14 @@ ! 590: break; ! 591: case 4: /* jmp word ptr ... */ ! 592: destval = fetch_data_word(destoffset); ! 593: + JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, destval, " WORD "); ! 594: TRACE_AND_STEP(); ! 595: M.x86.R_IP = destval; ! 596: break; ! 597: case 5: /* jmp far ptr ... */ ! 598: destval = fetch_data_word(destoffset); ! 599: destval2 = fetch_data_word(destoffset + 2); ! 600: + JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, destval2, destval, " FAR "); ! 601: TRACE_AND_STEP(); ! 602: M.x86.R_IP = destval; ! 603: M.x86.R_CS = destval2; ! 604: Index: prim_ops.c ! 605: =================================================================== ! 606: RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/prim_ops.c,v ! 607: retrieving revision 1.1 ! 608: retrieving revision 1.3 ! 609: diff -u -u -r1.1 -r1.3 ! 610: --- prim_ops.c 7 Sep 2007 10:01:21 -0000 1.1 ! 611: +++ prim_ops.c 16 Jan 2008 14:18:15 -0000 1.3 ! 612: @@ -1921,7 +1921,7 @@ ! 613: void imul_long_direct(u32 *res_lo, u32* res_hi,u32 d, u32 s) ! 614: { ! 615: #ifdef __HAS_LONG_LONG__ ! 616: - s64 res = (s64)d * (s64)s; ! 617: + s64 res = (s64)(s32)d * (s64)(s32)s; ! 618: ! 619: *res_lo = (u32)res; ! 620: *res_hi = (u32)(res >> 32); ! 621: @@ -2013,7 +2013,7 @@ ! 622: void mul_long(u32 s) ! 623: { ! 624: #ifdef __HAS_LONG_LONG__ ! 625: - u64 res = (u32)M.x86.R_EAX * (u32)s; ! 626: + u64 res = (u64)M.x86.R_EAX * s; ! 627: ! 628: M.x86.R_EAX = (u32)res; ! 629: M.x86.R_EDX = (u32)(res >> 32); ! 630: @@ -2312,16 +2312,15 @@ ! 631: } ! 632: if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { ! 633: /* dont care whether REPE or REPNE */ ! 634: - /* in until CX is ZERO. */ ! 635: - u32 count = ((M.x86.mode & SYSMODE_PREFIX_DATA) ? ! 636: + /* in until (E)CX is ZERO. */ ! 637: + u32 count = ((M.x86.mode & SYSMODE_32BIT_REP) ? ! 638: M.x86.R_ECX : M.x86.R_CX); ! 639: - ! 640: while (count--) { ! 641: single_in(size); ! 642: M.x86.R_DI += inc; ! 643: } ! 644: M.x86.R_CX = 0; ! 645: - if (M.x86.mode & SYSMODE_PREFIX_DATA) { ! 646: + if (M.x86.mode & SYSMODE_32BIT_REP) { ! 647: M.x86.R_ECX = 0; ! 648: } ! 649: M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); ! 650: @@ -2355,15 +2354,15 @@ ! 651: } ! 652: if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) { ! 653: /* dont care whether REPE or REPNE */ ! 654: - /* out until CX is ZERO. */ ! 655: - u32 count = ((M.x86.mode & SYSMODE_PREFIX_DATA) ? ! 656: + /* out until (E)CX is ZERO. */ ! 657: + u32 count = ((M.x86.mode & SYSMODE_32BIT_REP) ? ! 658: M.x86.R_ECX : M.x86.R_CX); ! 659: while (count--) { ! 660: single_out(size); ! 661: M.x86.R_SI += inc; ! 662: } ! 663: M.x86.R_CX = 0; ! 664: - if (M.x86.mode & SYSMODE_PREFIX_DATA) { ! 665: + if (M.x86.mode & SYSMODE_32BIT_REP) { ! 666: M.x86.R_ECX = 0; ! 667: } ! 668: M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE); ! 669: Index: sys.c ! 670: =================================================================== ! 671: RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/sys.c,v ! 672: retrieving revision 1.1 ! 673: retrieving revision 1.2 ! 674: diff -u -u -r1.1 -r1.2 ! 675: --- sys.c 7 Sep 2007 10:01:21 -0000 1.1 ! 676: +++ sys.c 7 Sep 2007 10:03:13 -0000 1.2 ! 677: @@ -45,11 +45,6 @@ ! 678: #include <x86emu/regs.h> ! 679: #include "debug.h" ! 680: #include "prim_ops.h" ! 681: -#ifdef LINUXBIOS_VERSION ! 682: -#include "io.h" ! 683: -#else ! 684: -#include <sys/io.h> ! 685: -#endif ! 686: ! 687: #ifdef IN_MODULE ! 688: #include "xf86_ansic.h" ! 689: @@ -220,7 +215,7 @@ ! 690: { ! 691: DB(if (DEBUG_IO_TRACE()) ! 692: printk("inb %#04x \n", addr);) ! 693: - return inb(addr); ! 694: + return 0; ! 695: } ! 696: ! 697: /**************************************************************************** ! 698: @@ -235,7 +230,7 @@ ! 699: { ! 700: DB(if (DEBUG_IO_TRACE()) ! 701: printk("inw %#04x \n", addr);) ! 702: - return inw(addr); ! 703: + return 0; ! 704: } ! 705: ! 706: /**************************************************************************** ! 707: @@ -250,7 +245,7 @@ ! 708: { ! 709: DB(if (DEBUG_IO_TRACE()) ! 710: printk("inl %#04x \n", addr);) ! 711: - return inl(addr); ! 712: + return 0; ! 713: } ! 714: ! 715: /**************************************************************************** ! 716: @@ -264,7 +259,6 @@ ! 717: { ! 718: DB(if (DEBUG_IO_TRACE()) ! 719: printk("outb %#02x -> %#04x \n", val, addr);) ! 720: - outb(val, addr); ! 721: return; ! 722: } ! 723: ! 724: @@ -279,7 +273,6 @@ ! 725: { ! 726: DB(if (DEBUG_IO_TRACE()) ! 727: printk("outw %#04x -> %#04x \n", val, addr);) ! 728: - outw(val, addr); ! 729: return; ! 730: } ! 731: ! 732: @@ -295,7 +288,6 @@ ! 733: DB(if (DEBUG_IO_TRACE()) ! 734: printk("outl %#08x -> %#04x \n", val, addr);) ! 735: ! 736: - outl(val, addr); ! 737: return; ! 738: } ! 739: ! 740: @@ -405,6 +397,6 @@ ! 741: ! 742: void X86EMU_setMemBase(void *base, size_t size) ! 743: { ! 744: - M.mem_base = (int) base; ! 745: + M.mem_base = (unsigned long) base; ! 746: M.mem_size = size; ! 747: } ! 748: Index: include/x86emu/debug.h ! 749: =================================================================== ! 750: RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/include/x86emu/debug.h,v ! 751: retrieving revision 1.1 ! 752: retrieving revision 1.4 ! 753: diff -u -u -r1.1 -r1.4 ! 754: --- include/x86emu/debug.h 7 Sep 2007 10:01:21 -0000 1.1 ! 755: +++ include/x86emu/debug.h 20 Mar 2008 15:25:27 -0000 1.4 ! 756: @@ -40,8 +40,6 @@ ! 757: #ifndef __X86EMU_DEBUG_H ! 758: #define __X86EMU_DEBUG_H ! 759: ! 760: -//#define DEBUG 0 ! 761: -#undef DEBUG ! 762: /*---------------------- Macros and type definitions ----------------------*/ ! 763: ! 764: /* checks to be enabled for "runtime" */ ! 765: @@ -78,6 +76,8 @@ ! 766: # define DEBUG_SYSINT() (M.x86.debug & DEBUG_SYSINT_F) ! 767: # define DEBUG_TRACECALL() (M.x86.debug & DEBUG_TRACECALL_F) ! 768: # define DEBUG_TRACECALLREGS() (M.x86.debug & DEBUG_TRACECALL_REGS_F) ! 769: +# define DEBUG_TRACEJMP() (M.x86.debug & DEBUG_TRACEJMP_F) ! 770: +# define DEBUG_TRACEJMPREGS() (M.x86.debug & DEBUG_TRACEJMP_REGS_F) ! 771: # define DEBUG_SYS() (M.x86.debug & DEBUG_SYS_F) ! 772: # define DEBUG_MEM_TRACE() (M.x86.debug & DEBUG_MEM_TRACE_F) ! 773: # define DEBUG_IO_TRACE() (M.x86.debug & DEBUG_IO_TRACE_F) ! 774: @@ -96,6 +96,8 @@ ! 775: # define DEBUG_SYSINT() 0 ! 776: # define DEBUG_TRACECALL() 0 ! 777: # define DEBUG_TRACECALLREGS() 0 ! 778: +# define DEBUG_TRACEJMP() 0 ! 779: +# define DEBUG_TRACEJMPREGS() 0 ! 780: # define DEBUG_SYS() 0 ! 781: # define DEBUG_MEM_TRACE() 0 ! 782: # define DEBUG_IO_TRACE() 0 ! 783: @@ -169,14 +171,20 @@ ! 784: x86emu_dump_regs(); \ ! 785: if (DEBUG_TRACECALL()) \ ! 786: printk("%04x:%04x: CALL %s%04x:%04x\n", u , v, s, w, x); ! 787: -# define RETURN_TRACE(n,u,v) \ ! 788: +# define RETURN_TRACE(u,v,w,x,s) \ ! 789: if (DEBUG_TRACECALLREGS()) \ ! 790: x86emu_dump_regs(); \ ! 791: if (DEBUG_TRACECALL()) \ ! 792: - printk("%04x:%04x: %s\n",u,v,n); ! 793: + printk("%04x:%04x: RET %s %04x:%04x\n",u,v,s,w,x); ! 794: +# define JMP_TRACE(u,v,w,x,s) \ ! 795: + if (DEBUG_TRACEJMPREGS()) \ ! 796: + x86emu_dump_regs(); \ ! 797: + if (DEBUG_TRACEJMP()) \ ! 798: + printk("%04x:%04x: JMP %s%04x:%04x\n", u , v, s, w, x); ! 799: #else ! 800: # define CALL_TRACE(u,v,w,x,s) ! 801: -# define RETURN_TRACE(n,u,v) ! 802: +# define RETURN_TRACE(u,v,w,x,s) ! 803: +# define JMP_TRACE(u,v,w,x,s) ! 804: #endif ! 805: ! 806: #ifdef DEBUG ! 807: Index: include/x86emu/regs.h ! 808: =================================================================== ! 809: RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/include/x86emu/regs.h,v ! 810: retrieving revision 1.1 ! 811: retrieving revision 1.4 ! 812: diff -u -u -r1.1 -r1.4 ! 813: --- include/x86emu/regs.h 7 Sep 2007 10:01:21 -0000 1.1 ! 814: +++ include/x86emu/regs.h 15 Jan 2008 13:46:40 -0000 1.4 ! 815: @@ -231,6 +231,9 @@ ! 816: #define SYSMODE_PREFIX_REPNE 0x00000100 ! 817: #define SYSMODE_PREFIX_DATA 0x00000200 ! 818: #define SYSMODE_PREFIX_ADDR 0x00000400 ! 819: +//phueper: for REP(E|NE) Instructions, we need to decide wether it should be using ! 820: +//the 32bit ECX register as or the 16bit CX register as count register ! 821: +#define SYSMODE_32BIT_REP 0x00000800 ! 822: #define SYSMODE_INTR_PENDING 0x10000000 ! 823: #define SYSMODE_EXTRN_INTR 0x20000000 ! 824: #define SYSMODE_HALTED 0x40000000 ! 825: @@ -250,7 +253,8 @@ ! 826: SYSMODE_SEGOVR_GS | \ ! 827: SYSMODE_SEGOVR_SS | \ ! 828: SYSMODE_PREFIX_DATA | \ ! 829: - SYSMODE_PREFIX_ADDR) ! 830: + SYSMODE_PREFIX_ADDR | \ ! 831: + SYSMODE_32BIT_REP) ! 832: ! 833: #define INTR_SYNCH 0x1 ! 834: #define INTR_ASYNCH 0x2 ! 835: @@ -274,9 +278,9 @@ ! 836: */ ! 837: u32 mode; ! 838: volatile int intr; /* mask of pending interrupts */ ! 839: - int debug; ! 840: + volatile int debug; ! 841: #ifdef DEBUG ! 842: - int check; ! 843: + int check; ! 844: u16 saved_ip; ! 845: u16 saved_cs; ! 846: int enc_pos; ! 847: @@ -366,7 +370,7 @@ ! 848: ! 849: /* Function to log information at runtime */ ! 850: ! 851: -//void printk(const char *fmt, ...); ! 852: +void printk(const char *fmt, ...); ! 853: ! 854: #ifdef __cplusplus ! 855: } /* End of "C" linkage for C++ */ ! 856: Index: include/x86emu/x86emu.h ! 857: =================================================================== ! 858: RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/include/x86emu/x86emu.h,v ! 859: retrieving revision 1.1 ! 860: retrieving revision 1.3 ! 861: diff -u -u -r1.1 -r1.3 ! 862: --- include/x86emu/x86emu.h 7 Sep 2007 10:01:21 -0000 1.1 ! 863: +++ include/x86emu/x86emu.h 19 Oct 2007 08:42:15 -0000 1.3 ! 864: @@ -42,14 +42,6 @@ ! 865: #ifndef __X86EMU_X86EMU_H ! 866: #define __X86EMU_X86EMU_H ! 867: ! 868: -/* FIXME: undefine printk for the moment */ ! 869: -#ifdef LINUXBIOS_VERSION ! 870: -#include <console.h> ! 871: -#define printk(x...) printk(BIOS_DEBUG, x) ! 872: -#else ! 873: -#define printk printf ! 874: -#endif ! 875: - ! 876: #ifdef SCITECH ! 877: #include "scitech.h" ! 878: #define X86API _ASMAPI ! 879: @@ -189,6 +181,8 @@ ! 880: #define DEBUG_TRACECALL_REGS_F 0x004000 ! 881: #define DEBUG_DECODE_NOPRINT_F 0x008000 ! 882: #define DEBUG_SAVE_IP_CS_F 0x010000 ! 883: +#define DEBUG_TRACEJMP_F 0x020000 ! 884: +#define DEBUG_TRACEJMP_REGS_F 0x040000 ! 885: #define DEBUG_SYS_F (DEBUG_SVC_F|DEBUG_FS_F|DEBUG_PROC_F) ! 886: ! 887: void X86EMU_trace_regs(void); ! 888: @@ -200,5 +194,4 @@ ! 889: #ifdef __cplusplus ! 890: } /* End of "C" linkage for C++ */ ! 891: #endif ! 892: - ! 893: #endif /* __X86EMU_X86EMU_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.