Commit 9d27abd94fe2c48281a77112d58422b392a80f7b

Authored by bellard
1 parent 148dfc2a

fixed invalid CPL logic in vm86 mode - use generic CPU dump state function


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@142 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 23 additions and 73 deletions
exec-i386.c
... ... @@ -188,74 +188,6 @@ void raise_exception(int exception_index)
188 188 raise_exception_err(exception_index, 0);
189 189 }
190 190  
191   -#if defined(DEBUG_EXEC)
192   -static const char *cc_op_str[] = {
193   - "DYNAMIC",
194   - "EFLAGS",
195   - "MUL",
196   - "ADDB",
197   - "ADDW",
198   - "ADDL",
199   - "ADCB",
200   - "ADCW",
201   - "ADCL",
202   - "SUBB",
203   - "SUBW",
204   - "SUBL",
205   - "SBBB",
206   - "SBBW",
207   - "SBBL",
208   - "LOGICB",
209   - "LOGICW",
210   - "LOGICL",
211   - "INCB",
212   - "INCW",
213   - "INCL",
214   - "DECB",
215   - "DECW",
216   - "DECL",
217   - "SHLB",
218   - "SHLW",
219   - "SHLL",
220   - "SARB",
221   - "SARW",
222   - "SARL",
223   -};
224   -
225   -static void cpu_x86_dump_state(FILE *f)
226   -{
227   - int eflags;
228   - char cc_op_name[32];
229   - eflags = cc_table[CC_OP].compute_all();
230   - eflags |= (DF & DF_MASK);
231   - if ((unsigned)env->cc_op < CC_OP_NB)
232   - strcpy(cc_op_name, cc_op_str[env->cc_op]);
233   - else
234   - snprintf(cc_op_name, sizeof(cc_op_name), "[%d]", env->cc_op);
235   - fprintf(f,
236   - "EAX=%08x EBX=%08X ECX=%08x EDX=%08x\n"
237   - "ESI=%08x EDI=%08X EBP=%08x ESP=%08x\n"
238   - "CCS=%08x CCD=%08x CCO=%-8s EFL=%c%c%c%c%c%c%c\n"
239   - "EIP=%08x\n",
240   - env->regs[R_EAX], env->regs[R_EBX], env->regs[R_ECX], env->regs[R_EDX],
241   - env->regs[R_ESI], env->regs[R_EDI], env->regs[R_EBP], env->regs[R_ESP],
242   - env->cc_src, env->cc_dst, cc_op_name,
243   - eflags & DF_MASK ? 'D' : '-',
244   - eflags & CC_O ? 'O' : '-',
245   - eflags & CC_S ? 'S' : '-',
246   - eflags & CC_Z ? 'Z' : '-',
247   - eflags & CC_A ? 'A' : '-',
248   - eflags & CC_P ? 'P' : '-',
249   - eflags & CC_C ? 'C' : '-',
250   - env->eip);
251   -#if 1
252   - fprintf(f, "ST0=%f ST1=%f ST2=%f ST3=%f\n",
253   - (double)ST0, (double)ST1, (double)ST(2), (double)ST(3));
254   -#endif
255   -}
256   -
257   -#endif
258   -
259 191 void cpu_x86_tblocks_init(void)
260 192 {
261 193 if (!code_gen_ptr) {
... ... @@ -399,7 +331,7 @@ int cpu_x86_exec(CPUX86State *env1)
399 331 CC_OP = CC_OP_EFLAGS;
400 332 env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
401 333 env->interrupt_request = 0;
402   -
  334 +
403 335 /* prepare setjmp context for exception handling */
404 336 if (setjmp(env->jmp_env) == 0) {
405 337 for(;;) {
... ... @@ -408,7 +340,19 @@ int cpu_x86_exec(CPUX86State *env1)
408 340 }
409 341 #ifdef DEBUG_EXEC
410 342 if (loglevel) {
411   - cpu_x86_dump_state(logfile);
  343 + /* XXX: save all volatile state in cpu state */
  344 + /* restore flags in standard format */
  345 + env->regs[R_EAX] = EAX;
  346 + env->regs[R_EBX] = EBX;
  347 + env->regs[R_ECX] = ECX;
  348 + env->regs[R_EDX] = EDX;
  349 + env->regs[R_ESI] = ESI;
  350 + env->regs[R_EDI] = EDI;
  351 + env->regs[R_EBP] = EBP;
  352 + env->regs[R_ESP] = ESP;
  353 + env->eflags = env->eflags | cc_table[CC_OP].compute_all() | (DF & DF_MASK);
  354 + cpu_x86_dump_state(env, logfile, 0);
  355 + env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
412 356 }
413 357 #endif
414 358 /* we compute the CPU state. We assume it will not
... ... @@ -419,9 +363,14 @@ int cpu_x86_exec(CPUX86State *env1)
419 363 (unsigned long)env->seg_cache[R_ES].base |
420 364 (unsigned long)env->seg_cache[R_SS].base) != 0) <<
421 365 GEN_FLAG_ADDSEG_SHIFT;
422   - flags |= (env->eflags & VM_MASK) >> (17 - GEN_FLAG_VM_SHIFT);
  366 + if (!(env->eflags & VM_MASK)) {
  367 + flags |= (env->segs[R_CS] & 3) << GEN_FLAG_CPL_SHIFT;
  368 + } else {
  369 + /* NOTE: a dummy CPL is kept */
  370 + flags |= (1 << GEN_FLAG_VM_SHIFT);
  371 + flags |= (3 << GEN_FLAG_CPL_SHIFT);
  372 + }
423 373 flags |= (env->eflags & IOPL_MASK) >> (12 - GEN_FLAG_IOPL_SHIFT);
424   - flags |= (env->segs[R_CS] & 3) << GEN_FLAG_CPL_SHIFT;
425 374 cs_base = env->seg_cache[R_CS].base;
426 375 pc = cs_base + env->eip;
427 376 tb = tb_find(&ptb, (unsigned long)pc, (unsigned long)cs_base,
... ... @@ -449,12 +398,13 @@ int cpu_x86_exec(CPUX86State *env1)
449 398 code_gen_ptr = (void *)(((unsigned long)code_gen_ptr + code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
450 399 cpu_unlock();
451 400 }
  401 +#ifdef DEBUG_EXEC
452 402 if (loglevel) {
453 403 fprintf(logfile, "Trace 0x%08lx [0x%08lx] %s\n",
454 404 (long)tb->tc_ptr, (long)tb->pc,
455 405 lookup_symbol((void *)tb->pc));
456   - fflush(logfile);
457 406 }
  407 +#endif
458 408 /* execute the generated code */
459 409 tc_ptr = tb->tc_ptr;
460 410 gen_func = (void *)tc_ptr;
... ...