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
This commit is contained in:
		
							parent
							
								
									148dfc2a8b
								
							
						
					
					
						commit
						9d27abd94f
					
				
							
								
								
									
										94
									
								
								exec-i386.c
									
									
									
									
									
								
							
							
						
						
									
										94
									
								
								exec-i386.c
									
									
									
									
									
								
							@ -188,74 +188,6 @@ void raise_exception(int exception_index)
 | 
				
			|||||||
    raise_exception_err(exception_index, 0);
 | 
					    raise_exception_err(exception_index, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(DEBUG_EXEC)
 | 
					 | 
				
			||||||
static const char *cc_op_str[] = {
 | 
					 | 
				
			||||||
    "DYNAMIC",
 | 
					 | 
				
			||||||
    "EFLAGS",
 | 
					 | 
				
			||||||
    "MUL",
 | 
					 | 
				
			||||||
    "ADDB",
 | 
					 | 
				
			||||||
    "ADDW",
 | 
					 | 
				
			||||||
    "ADDL",
 | 
					 | 
				
			||||||
    "ADCB",
 | 
					 | 
				
			||||||
    "ADCW",
 | 
					 | 
				
			||||||
    "ADCL",
 | 
					 | 
				
			||||||
    "SUBB",
 | 
					 | 
				
			||||||
    "SUBW",
 | 
					 | 
				
			||||||
    "SUBL",
 | 
					 | 
				
			||||||
    "SBBB",
 | 
					 | 
				
			||||||
    "SBBW",
 | 
					 | 
				
			||||||
    "SBBL",
 | 
					 | 
				
			||||||
    "LOGICB",
 | 
					 | 
				
			||||||
    "LOGICW",
 | 
					 | 
				
			||||||
    "LOGICL",
 | 
					 | 
				
			||||||
    "INCB",
 | 
					 | 
				
			||||||
    "INCW",
 | 
					 | 
				
			||||||
    "INCL",
 | 
					 | 
				
			||||||
    "DECB",
 | 
					 | 
				
			||||||
    "DECW",
 | 
					 | 
				
			||||||
    "DECL",
 | 
					 | 
				
			||||||
    "SHLB",
 | 
					 | 
				
			||||||
    "SHLW",
 | 
					 | 
				
			||||||
    "SHLL",
 | 
					 | 
				
			||||||
    "SARB",
 | 
					 | 
				
			||||||
    "SARW",
 | 
					 | 
				
			||||||
    "SARL",
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void cpu_x86_dump_state(FILE *f)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int eflags;
 | 
					 | 
				
			||||||
    char cc_op_name[32];
 | 
					 | 
				
			||||||
    eflags = cc_table[CC_OP].compute_all();
 | 
					 | 
				
			||||||
    eflags |= (DF & DF_MASK);
 | 
					 | 
				
			||||||
    if ((unsigned)env->cc_op < CC_OP_NB)
 | 
					 | 
				
			||||||
        strcpy(cc_op_name, cc_op_str[env->cc_op]);
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        snprintf(cc_op_name, sizeof(cc_op_name), "[%d]", env->cc_op);
 | 
					 | 
				
			||||||
    fprintf(f, 
 | 
					 | 
				
			||||||
            "EAX=%08x EBX=%08X ECX=%08x EDX=%08x\n"
 | 
					 | 
				
			||||||
            "ESI=%08x EDI=%08X EBP=%08x ESP=%08x\n"
 | 
					 | 
				
			||||||
            "CCS=%08x CCD=%08x CCO=%-8s EFL=%c%c%c%c%c%c%c\n"
 | 
					 | 
				
			||||||
            "EIP=%08x\n",
 | 
					 | 
				
			||||||
            env->regs[R_EAX], env->regs[R_EBX], env->regs[R_ECX], env->regs[R_EDX], 
 | 
					 | 
				
			||||||
            env->regs[R_ESI], env->regs[R_EDI], env->regs[R_EBP], env->regs[R_ESP], 
 | 
					 | 
				
			||||||
            env->cc_src, env->cc_dst, cc_op_name,
 | 
					 | 
				
			||||||
            eflags & DF_MASK ? 'D' : '-',
 | 
					 | 
				
			||||||
            eflags & CC_O ? 'O' : '-',
 | 
					 | 
				
			||||||
            eflags & CC_S ? 'S' : '-',
 | 
					 | 
				
			||||||
            eflags & CC_Z ? 'Z' : '-',
 | 
					 | 
				
			||||||
            eflags & CC_A ? 'A' : '-',
 | 
					 | 
				
			||||||
            eflags & CC_P ? 'P' : '-',
 | 
					 | 
				
			||||||
            eflags & CC_C ? 'C' : '-',
 | 
					 | 
				
			||||||
            env->eip);
 | 
					 | 
				
			||||||
#if 1
 | 
					 | 
				
			||||||
    fprintf(f, "ST0=%f ST1=%f ST2=%f ST3=%f\n", 
 | 
					 | 
				
			||||||
            (double)ST0, (double)ST1, (double)ST(2), (double)ST(3));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void cpu_x86_tblocks_init(void)
 | 
					void cpu_x86_tblocks_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (!code_gen_ptr) {
 | 
					    if (!code_gen_ptr) {
 | 
				
			||||||
@ -408,7 +340,19 @@ int cpu_x86_exec(CPUX86State *env1)
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
#ifdef DEBUG_EXEC
 | 
					#ifdef DEBUG_EXEC
 | 
				
			||||||
            if (loglevel) {
 | 
					            if (loglevel) {
 | 
				
			||||||
                cpu_x86_dump_state(logfile);
 | 
					                /* XXX: save all volatile state in cpu state */
 | 
				
			||||||
 | 
					                /* restore flags in standard format */
 | 
				
			||||||
 | 
					                env->regs[R_EAX] = EAX;
 | 
				
			||||||
 | 
					                env->regs[R_EBX] = EBX;
 | 
				
			||||||
 | 
					                env->regs[R_ECX] = ECX;
 | 
				
			||||||
 | 
					                env->regs[R_EDX] = EDX;
 | 
				
			||||||
 | 
					                env->regs[R_ESI] = ESI;
 | 
				
			||||||
 | 
					                env->regs[R_EDI] = EDI;
 | 
				
			||||||
 | 
					                env->regs[R_EBP] = EBP;
 | 
				
			||||||
 | 
					                env->regs[R_ESP] = ESP;
 | 
				
			||||||
 | 
					                env->eflags = env->eflags | cc_table[CC_OP].compute_all() | (DF & DF_MASK);
 | 
				
			||||||
 | 
					                cpu_x86_dump_state(env, logfile, 0);
 | 
				
			||||||
 | 
					                env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
            /* we compute the CPU state. We assume it will not
 | 
					            /* we compute the CPU state. We assume it will not
 | 
				
			||||||
@ -419,9 +363,14 @@ int cpu_x86_exec(CPUX86State *env1)
 | 
				
			|||||||
                       (unsigned long)env->seg_cache[R_ES].base |
 | 
					                       (unsigned long)env->seg_cache[R_ES].base |
 | 
				
			||||||
                       (unsigned long)env->seg_cache[R_SS].base) != 0) << 
 | 
					                       (unsigned long)env->seg_cache[R_SS].base) != 0) << 
 | 
				
			||||||
                GEN_FLAG_ADDSEG_SHIFT;
 | 
					                GEN_FLAG_ADDSEG_SHIFT;
 | 
				
			||||||
            flags |= (env->eflags & VM_MASK) >> (17 - GEN_FLAG_VM_SHIFT);
 | 
					            if (!(env->eflags & VM_MASK)) {
 | 
				
			||||||
            flags |= (env->eflags & IOPL_MASK) >> (12 - GEN_FLAG_IOPL_SHIFT);
 | 
					 | 
				
			||||||
                flags |= (env->segs[R_CS] & 3) << GEN_FLAG_CPL_SHIFT;
 | 
					                flags |= (env->segs[R_CS] & 3) << GEN_FLAG_CPL_SHIFT;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                /* NOTE: a dummy CPL is kept */
 | 
				
			||||||
 | 
					                flags |= (1 << GEN_FLAG_VM_SHIFT);
 | 
				
			||||||
 | 
					                flags |= (3 << GEN_FLAG_CPL_SHIFT);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            flags |= (env->eflags & IOPL_MASK) >> (12 - GEN_FLAG_IOPL_SHIFT);
 | 
				
			||||||
            cs_base = env->seg_cache[R_CS].base;
 | 
					            cs_base = env->seg_cache[R_CS].base;
 | 
				
			||||||
            pc = cs_base + env->eip;
 | 
					            pc = cs_base + env->eip;
 | 
				
			||||||
            tb = tb_find(&ptb, (unsigned long)pc, (unsigned long)cs_base, 
 | 
					            tb = tb_find(&ptb, (unsigned long)pc, (unsigned long)cs_base, 
 | 
				
			||||||
@ -449,12 +398,13 @@ int cpu_x86_exec(CPUX86State *env1)
 | 
				
			|||||||
                code_gen_ptr = (void *)(((unsigned long)code_gen_ptr + code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
 | 
					                code_gen_ptr = (void *)(((unsigned long)code_gen_ptr + code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
 | 
				
			||||||
                cpu_unlock();
 | 
					                cpu_unlock();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					#ifdef DEBUG_EXEC
 | 
				
			||||||
	    if (loglevel) {
 | 
						    if (loglevel) {
 | 
				
			||||||
		fprintf(logfile, "Trace 0x%08lx [0x%08lx] %s\n",
 | 
							fprintf(logfile, "Trace 0x%08lx [0x%08lx] %s\n",
 | 
				
			||||||
			(long)tb->tc_ptr, (long)tb->pc,
 | 
								(long)tb->tc_ptr, (long)tb->pc,
 | 
				
			||||||
			lookup_symbol((void *)tb->pc));
 | 
								lookup_symbol((void *)tb->pc));
 | 
				
			||||||
		fflush(logfile);
 | 
					 | 
				
			||||||
	    }
 | 
						    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
            /* execute the generated code */
 | 
					            /* execute the generated code */
 | 
				
			||||||
            tc_ptr = tb->tc_ptr;
 | 
					            tc_ptr = tb->tc_ptr;
 | 
				
			||||||
            gen_func = (void *)tc_ptr;
 | 
					            gen_func = (void *)tc_ptr;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user