2 ===================================================================
3 RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/debug.c,v
4 retrieving revision 1.1
5 retrieving revision 1.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
10 void X86EMU_trace_regs (void)
14 + if (M.x86.mode & (SYSMODE_PREFIX_DATA | SYSMODE_PREFIX_ADDR)) {
15 + x86emu_dump_xregs();
20 if (DEBUG_DECODE() && ! DEBUG_DECODE_NOPRINT()) {
21 printk("%04x:%04x ",M.x86.saved_cs, M.x86.saved_ip);
23 for (i=0; i< M.x86.enc_pos; i++) {
24 sprintf(buf1+2*i,"%02x", fetch_data_byte_abs(s,o+i));
26 - printk("%-20s",buf1);
27 + printk("%-20s ",buf1);
30 static void print_decoded_instruction (void)
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
40 target += (s16) M.x86.R_IP;
41 DECODE_PRINTF2("%04x\n", target);
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 ");
48 + DECODE_CLEAR_SEGOVR();
52 +/****************************************************************************
54 +Handles opcode 0x0f,0xC8-0xCF
55 +****************************************************************************/
56 +s32 x86emu_bswap(s32 reg)
58 + // perform the byte swap
60 + reg = (temp & 0xFF000000) >> 24;
61 + reg |= (temp & 0xFF0000) >> 8;
62 + reg |= (temp & 0xFF00) << 8;
63 + reg |= (temp & 0xFF) << 24;
67 +void x86emuOp2_bswap(u8 op2)
69 + /* byte swap 32 bit register */
71 + DECODE_PRINTF("BSWAP\t");
74 + DECODE_PRINTF("EAX\n");
75 + M.x86.R_EAX = x86emu_bswap(M.x86.R_EAX);
78 + DECODE_PRINTF("ECX\n");
79 + M.x86.R_ECX = x86emu_bswap(M.x86.R_ECX);
82 + DECODE_PRINTF("EDX\n");
83 + M.x86.R_EDX = x86emu_bswap(M.x86.R_EDX);
86 + DECODE_PRINTF("EBX\n");
87 + M.x86.R_EBX = x86emu_bswap(M.x86.R_EBX);
90 + DECODE_PRINTF("ESP\n");
91 + M.x86.R_ESP = x86emu_bswap(M.x86.R_ESP);
94 + DECODE_PRINTF("EBP\n");
95 + M.x86.R_EBP = x86emu_bswap(M.x86.R_EBP);
98 + DECODE_PRINTF("ESI\n");
99 + M.x86.R_ESI = x86emu_bswap(M.x86.R_ESI);
102 + DECODE_PRINTF("EDI\n");
103 + M.x86.R_EDI = x86emu_bswap(M.x86.R_EDI);
107 DECODE_CLEAR_SEGOVR();
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,
131 /* 0xd0 */ x86emuOp2_illegal_op,
132 /* 0xd1 */ x86emuOp2_illegal_op,
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);
145 + if (M.x86.mode & SYSMODE_PREFIX_DATA) {
150 DECODE_CLEAR_SEGOVR();
153 @@ -1256,8 +1260,10 @@
154 target = (u16)(M.x86.R_IP + (s16)offset);
155 DECODE_PRINTF2("%x\n", target);
160 + JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, " NEAR COND ");
162 DECODE_CLEAR_SEGOVR();
165 @@ -2516,9 +2522,11 @@
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;
174 + if (M.x86.mode & SYSMODE_32BIT_REP)
176 M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
179 @@ -2526,6 +2534,8 @@
180 store_data_byte_abs(M.x86.R_ES, M.x86.R_DI, val);
183 + if (M.x86.intr & INTR_HALTED)
186 DECODE_CLEAR_SEGOVR();
188 @@ -2559,9 +2569,11 @@
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;
197 + if (M.x86.mode & SYSMODE_32BIT_REP)
199 M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
202 @@ -2574,6 +2586,8 @@
206 + if (M.x86.intr & INTR_HALTED)
209 DECODE_CLEAR_SEGOVR();
211 @@ -2598,16 +2612,21 @@
213 if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
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);
223 + if (M.x86.mode & SYSMODE_32BIT_REP)
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)
234 M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
236 @@ -2644,8 +2663,8 @@
238 if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
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);
252 + if (M.x86.mode & SYSMODE_32BIT_REP)
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)
263 M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
265 @@ -2741,11 +2765,16 @@
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);
275 + if (M.x86.mode & SYSMODE_32BIT_REP)
280 + if (M.x86.intr & INTR_HALTED)
283 M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
285 @@ -2783,9 +2812,11 @@
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;
294 + if (M.x86.mode & SYSMODE_32BIT_REP)
296 M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
299 @@ -2795,6 +2826,8 @@
300 store_data_word_abs(M.x86.R_ES, M.x86.R_DI, M.x86.R_AX);
303 + if (M.x86.intr & INTR_HALTED)
306 DECODE_CLEAR_SEGOVR();
308 @@ -2817,11 +2850,16 @@
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);
318 + if (M.x86.mode & SYSMODE_32BIT_REP)
323 + if (M.x86.intr & INTR_HALTED)
326 M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
328 @@ -2859,9 +2897,11 @@
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;
337 + if (M.x86.mode & SYSMODE_32BIT_REP)
339 M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
342 @@ -2871,6 +2911,8 @@
343 M.x86.R_AX = fetch_data_word(M.x86.R_SI);
346 + if (M.x86.intr & INTR_HALTED)
349 DECODE_CLEAR_SEGOVR();
351 @@ -2894,26 +2936,36 @@
353 if (M.x86.mode & SYSMODE_PREFIX_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);
362 + if (M.x86.mode & SYSMODE_32BIT_REP)
367 if (ACCESS_FLAG(F_ZF) == 0)
369 + if (M.x86.intr & INTR_HALTED)
372 M.x86.mode &= ~SYSMODE_PREFIX_REPE;
373 } else if (M.x86.mode & SYSMODE_PREFIX_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);
382 + if (M.x86.mode & SYSMODE_32BIT_REP)
387 if (ACCESS_FLAG(F_ZF))
388 break; /* zero flag set means equal */
389 + if (M.x86.intr & INTR_HALTED)
392 M.x86.mode &= ~SYSMODE_PREFIX_REPNE;
394 @@ -2951,8 +3003,8 @@
396 if (M.x86.mode & SYSMODE_PREFIX_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);
410 + if (M.x86.mode & SYSMODE_32BIT_REP)
415 if (ACCESS_FLAG(F_ZF) == 0)
417 + if (M.x86.intr & INTR_HALTED)
420 M.x86.mode &= ~SYSMODE_PREFIX_REPE;
421 } else if (M.x86.mode & SYSMODE_PREFIX_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);
435 + if (M.x86.mode & SYSMODE_32BIT_REP)
440 if (ACCESS_FLAG(F_ZF))
441 break; /* zero flag set means equal */
442 + if (M.x86.intr & INTR_HALTED)
445 M.x86.mode &= ~SYSMODE_PREFIX_REPNE;
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);
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");
456 DECODE_CLEAR_SEGOVR();
458 @@ -3254,9 +3316,9 @@
461 DECODE_PRINTF("RET\n");
462 - RETURN_TRACE("RET",M.x86.saved_cs,M.x86.saved_ip);
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();
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);
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");
479 DECODE_CLEAR_SEGOVR();
481 @@ -3488,10 +3550,10 @@
484 DECODE_PRINTF("RETF\n");
485 - RETURN_TRACE("RETF",M.x86.saved_cs,M.x86.saved_ip);
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();
493 @@ -4020,8 +4082,11 @@
494 ip += (s16) M.x86.R_IP;
495 DECODE_PRINTF2("%04x\n", ip);
498 - if (M.x86.R_CX != 0 && !ACCESS_FLAG(F_ZF)) /* CX != 0 and !ZF */
499 + if (M.x86.mode & SYSMODE_PREFIX_ADDR)
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 */
505 DECODE_CLEAR_SEGOVR();
507 @@ -4041,8 +4106,11 @@
508 ip += (s16) M.x86.R_IP;
509 DECODE_PRINTF2("%04x\n", ip);
512 - if (M.x86.R_CX != 0 && ACCESS_FLAG(F_ZF)) /* CX != 0 and ZF */
513 + if (M.x86.mode & SYSMODE_PREFIX_ADDR)
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 */
519 DECODE_CLEAR_SEGOVR();
521 @@ -4062,8 +4130,11 @@
522 ip += (s16) M.x86.R_IP;
523 DECODE_PRINTF2("%04x\n", ip);
526 - if (M.x86.R_CX != 0)
527 + if (M.x86.mode & SYSMODE_PREFIX_ADDR)
531 + if (((M.x86.mode & SYSMODE_PREFIX_ADDR) ? M.x86.R_ECX : M.x86.R_CX) != 0) /* (E)CX != 0 */
533 DECODE_CLEAR_SEGOVR();
535 @@ -4085,8 +4156,10 @@
536 target = (u16)(M.x86.R_IP + offset);
537 DECODE_PRINTF2("%x\n", target);
539 - if (M.x86.R_CX == 0)
540 + if (M.x86.R_CX == 0) {
542 + JMP_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, M.x86.R_IP, " CXZ ");
544 DECODE_CLEAR_SEGOVR();
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 ");
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 ");
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 ");
570 DECODE_CLEAR_SEGOVR();
571 @@ -4357,6 +4433,8 @@
572 DECODE_PRINTF("REPNE\n");
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();
580 @@ -4371,6 +4449,8 @@
581 DECODE_PRINTF("REPE\n");
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();
589 @@ -5013,12 +5093,14 @@
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 ");
595 M.x86.R_IP = destval;
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 ");
602 M.x86.R_IP = destval;
603 M.x86.R_CS = destval2;
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)
615 #ifdef __HAS_LONG_LONG__
616 - s64 res = (s64)d * (s64)s;
617 + s64 res = (s64)(s32)d * (s64)(s32)s;
620 *res_hi = (u32)(res >> 32);
621 @@ -2013,7 +2013,7 @@
624 #ifdef __HAS_LONG_LONG__
625 - u64 res = (u32)M.x86.R_EAX * (u32)s;
626 + u64 res = (u64)M.x86.R_EAX * s;
628 M.x86.R_EAX = (u32)res;
629 M.x86.R_EDX = (u32)(res >> 32);
630 @@ -2312,16 +2312,15 @@
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);
645 - if (M.x86.mode & SYSMODE_PREFIX_DATA) {
646 + if (M.x86.mode & SYSMODE_32BIT_REP) {
649 M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
650 @@ -2355,15 +2354,15 @@
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);
664 - if (M.x86.mode & SYSMODE_PREFIX_DATA) {
665 + if (M.x86.mode & SYSMODE_32BIT_REP) {
668 M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
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
678 #include <x86emu/regs.h>
680 #include "prim_ops.h"
681 -#ifdef LINUXBIOS_VERSION
688 #include "xf86_ansic.h"
691 DB(if (DEBUG_IO_TRACE())
692 printk("inb %#04x \n", addr);)
697 /****************************************************************************
700 DB(if (DEBUG_IO_TRACE())
701 printk("inw %#04x \n", addr);)
706 /****************************************************************************
709 DB(if (DEBUG_IO_TRACE())
710 printk("inl %#04x \n", addr);)
715 /****************************************************************************
718 DB(if (DEBUG_IO_TRACE())
719 printk("outb %#02x -> %#04x \n", val, addr);)
726 DB(if (DEBUG_IO_TRACE())
727 printk("outw %#04x -> %#04x \n", val, addr);)
733 DB(if (DEBUG_IO_TRACE())
734 printk("outl %#08x -> %#04x \n", val, addr);)
742 void X86EMU_setMemBase(void *base, size_t size)
744 - M.mem_base = (int) base;
745 + M.mem_base = (unsigned long) base;
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
757 #ifndef __X86EMU_DEBUG_H
758 #define __X86EMU_DEBUG_H
762 /*---------------------- Macros and type definitions ----------------------*/
764 /* checks to be enabled for "runtime" */
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)
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);
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)
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
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
826 SYSMODE_SEGOVR_GS | \
827 SYSMODE_SEGOVR_SS | \
828 SYSMODE_PREFIX_DATA | \
829 - SYSMODE_PREFIX_ADDR)
830 + SYSMODE_PREFIX_ADDR | \
833 #define INTR_SYNCH 0x1
834 #define INTR_ASYNCH 0x2
838 volatile int intr; /* mask of pending interrupts */
840 + volatile int debug;
847 Index: include/x86emu/x86emu.h
848 ===================================================================
849 RCS file: /cvs/osdf/cvs/host/other-licence/x86emu/include/x86emu/x86emu.h,v
850 retrieving revision 1.1
851 retrieving revision 1.3
852 diff -u -u -r1.1 -r1.3
853 --- include/x86emu/x86emu.h 7 Sep 2007 10:01:21 -0000 1.1
854 +++ include/x86emu/x86emu.h 19 Oct 2007 08:42:15 -0000 1.3
857 #define printk(x...) printk(BIOS_DEBUG, x)
860 #define printk printf
864 #define DEBUG_TRACECALL_REGS_F 0x004000
865 #define DEBUG_DECODE_NOPRINT_F 0x008000
866 #define DEBUG_SAVE_IP_CS_F 0x010000
867 +#define DEBUG_TRACEJMP_F 0x020000
868 +#define DEBUG_TRACEJMP_REGS_F 0x040000
869 #define DEBUG_SYS_F (DEBUG_SVC_F|DEBUG_FS_F|DEBUG_PROC_F)
871 void X86EMU_trace_regs(void);
874 } /* End of "C" linkage for C++ */
877 #endif /* __X86EMU_X86EMU_H */