|
|
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.