Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / other-licence / x86emu / x86emu_changes.diff
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 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
855 @@ -47,6 +47,7 @@
856  #include <console.h>
857  #define printk(x...) printk(BIOS_DEBUG, x)
858  #else
859 +#include <stdio.h>
860  #define printk printf
861  #endif
862  
863 @@ -189,6 +181,8 @@
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)
870  
871  void   X86EMU_trace_regs(void);
872 @@ -200,5 +194,4 @@
873  #ifdef  __cplusplus
874  }                                              /* End of "C" linkage for C++           */
875  #endif
876 -
877  #endif /* __X86EMU_X86EMU_H */