[Dosemu-cvs] SF.net SVN: dosemu: [1628] trunk
Brought to you by:
bartoldeman
From: <bar...@us...> - 2006-10-23 22:20:16
|
Revision: 1628 http://svn.sourceforge.net/dosemu/?rev=1628&view=rev Author: bartoldeman Date: 2006-10-23 15:19:55 -0700 (Mon, 23 Oct 2006) Log Message: ----------- Select JIT or simulated CPU emulation at runtime instead of at compiletime. Modified Paths: -------------- trunk/etc/dosemu.conf trunk/src/base/init/lexer.l.in trunk/src/base/init/parser.y.in trunk/src/emu-i386/simx86/Makefile trunk/src/emu-i386/simx86/codegen-arch.h trunk/src/emu-i386/simx86/codegen-sim.c trunk/src/emu-i386/simx86/codegen-x86.c trunk/src/emu-i386/simx86/codegen.h trunk/src/emu-i386/simx86/cpatch.c trunk/src/emu-i386/simx86/cpu-emu.c trunk/src/emu-i386/simx86/emu86.h trunk/src/emu-i386/simx86/fp87-sim.c trunk/src/emu-i386/simx86/fp87-x86.c trunk/src/emu-i386/simx86/interp.c trunk/src/emu-i386/simx86/sigsegv.c trunk/src/emu-i386/simx86/trees.c trunk/src/include/cpu-emu.h trunk/src/include/emu.h Modified: trunk/etc/dosemu.conf =================================================================== --- trunk/etc/dosemu.conf 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/etc/dosemu.conf 2006-10-23 22:19:55 UTC (rev 1628) @@ -36,6 +36,7 @@ # Usage of cpu emulation: "off" (default on x86), # "vm86" only (default on x86-64) or "full" (vm86 and DPMI, experimental!). +# Use "vm86sim" or "fullsim" to use simulation instead of JIT code generation. # $_cpu_emu = "off" Modified: trunk/src/base/init/lexer.l.in =================================================================== --- trunk/src/base/init/lexer.l.in 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/base/init/lexer.l.in 2006-10-23 22:19:55 UTC (rev 1628) @@ -406,6 +406,8 @@ cpuemu RETURN(CPUEMU); vm86 RETURN(VM86); full RETURN(FULL); +vm86sim RETURN(VM86SIM); +fullsim RETURN(FULLSIM); /* disk keywords */ hdimage RETURN(HDIMAGE); Modified: trunk/src/base/init/parser.y.in =================================================================== --- trunk/src/base/init/parser.y.in 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/base/init/parser.y.in 2006-10-23 22:19:55 UTC (rev 1628) @@ -255,7 +255,7 @@ /* speaker */ %token EMULATED NATIVE /* cpuemu */ -%token CPUEMU VM86 FULL +%token CPUEMU VM86 FULL VM86SIM FULLSIM /* keyboard */ %token RAWKEYBOARD %token PRESTROKE @@ -476,7 +476,14 @@ { #ifdef X86_EMULATOR config.cpuemu = $2; - c_printf("CONF: CPUEMU set to %d for %ld86\n", + if (config.cpuemu > 4) { + config.cpuemu -= 2; +#ifdef HOST_ARCH_X86 + config.cpusim = 1; +#endif + } + c_printf("CONF: %s CPUEMU set to %d for %ld86\n", + CONFIG_CPUSIM ? "simulated" : "JIT", config.cpuemu, vm86s.cpu_type); #endif } @@ -1673,6 +1680,8 @@ cpuemu : L_OFF { $$ = 0; } | VM86 { $$ = 3; } | FULL { $$ = 4; } + | VM86SIM { $$ = 5; } + | FULLSIM { $$ = 6; } | STRING { yyerror("got '%s', expected 'off', 'vm86' or 'full'", $1); free($1); } | error { yyerror("expected 'off', 'vm86' or 'full'"); } Modified: trunk/src/emu-i386/simx86/Makefile =================================================================== --- trunk/src/emu-i386/simx86/Makefile 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/Makefile 2006-10-23 22:19:55 UTC (rev 1628) @@ -12,7 +12,8 @@ EM86FLG=-Dlinux -DDOSEMU -fgcse -fforce-addr CFILES = trees.c interp.c cpu-emu.c modrm-gen.c codegen-x86.c fp87-x86.c \ - modrm-sim.c protmode.c sigsegv.c cpatch.c memory.c tables.c + codegen-sim.c fp87-sim.c modrm-sim.c protmode.c sigsegv.c cpatch.c \ + memory.c tables.c CFLAGS +=-I$(EM86DIR) $(EM86FLG) CFLAGS +=-DNOJUMPS Modified: trunk/src/emu-i386/simx86/codegen-arch.h =================================================================== --- trunk/src/emu-i386/simx86/codegen-arch.h 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/codegen-arch.h 2006-10-23 22:19:55 UTC (rev 1628) @@ -4,8 +4,7 @@ * for details see file COPYING in the DOSEMU distribution */ -#ifdef HOST_ARCH_SIM #include "codegen-sim.h" -#else +#ifdef HOST_ARCH_X86 #include "codegen-x86.h" #endif Modified: trunk/src/emu-i386/simx86/codegen-sim.c =================================================================== --- trunk/src/emu-i386/simx86/codegen-sim.c 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/codegen-sim.c 2006-10-23 22:19:55 UTC (rev 1628) @@ -67,6 +67,13 @@ #undef DEBUG_MORE +void (*Gen)(int op, int mode, ...); +void (*AddrGen)(int op, int mode, ...); +unsigned char *(*CloseAndExec)(unsigned char *PC, TNode *G, int mode, int ln); +static void Gen_sim(int op, int mode, ...); +static void AddrGen_sim(int op, int mode, ...); +static unsigned char *CloseAndExec_sim(unsigned char *PC, TNode *G, int mode, int ln); + unsigned long e_vga_base, e_vga_end; int TrapVgaOn = 0; @@ -285,6 +292,15 @@ void InitGen(void) { +#ifdef HOST_ARCH_X86 + if (!config.cpusim) { + InitGen_x86(); + return; + } +#endif + Gen = Gen_sim; + AddrGen = AddrGen_sim; + CloseAndExec = CloseAndExec_sim; RFL.S1 = RFL.S2 = RFL.RES.d = 0; RFL.valid = V_INVALID; InitTrees(); @@ -294,7 +310,7 @@ * address generator unit * careful - do not use eax, and NEVER change any flag! */ -void AddrGen(int op, int mode, ...) +static void AddrGen_sim(int op, int mode, ...) { va_list ap; #ifdef PROFILE @@ -438,7 +454,7 @@ } -void Gen(int op, int mode, ...) +static void Gen_sim(int op, int mode, ...) { int rcod=0; va_list ap; @@ -2541,7 +2557,7 @@ ///////////////////////////////////////////////////////////////////////////// -unsigned char *CloseAndExec(unsigned char *PC, TNode *G, int mode, int ln) +static unsigned char *CloseAndExec_sim(unsigned char *PC, TNode *G, int mode, int ln) { if (debug_level('e')>1) { if (TheCPU.sigalrm_pending>0) e_printf("** SIGALRM is pending\n"); Modified: trunk/src/emu-i386/simx86/codegen-x86.c =================================================================== --- trunk/src/emu-i386/simx86/codegen-x86.c 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/codegen-x86.c 2006-10-23 22:19:55 UTC (rev 1628) @@ -104,12 +104,13 @@ #include <string.h> #include "emu86.h" -#ifdef HOST_ARCH_SIM -#include "codegen-sim.c" -#else - +#ifdef HOST_ARCH_X86 #include "codegen-x86.h" +static void Gen_x86(int op, int mode, ...); +static void AddrGen_x86(int op, int mode, ...); +static unsigned char *CloseAndExec_x86(unsigned char *PC, TNode *G, int mode, int ln); + /* Buffer and pointers to store generated code */ unsigned char *CodePtr = NULL; @@ -117,20 +118,12 @@ unsigned char *BaseGenBuf = NULL; int GenBufSize = 0; -unsigned long e_vga_base, e_vga_end; - -int TrapVgaOn = 0; -int UseLinker = USE_LINKER; - hitimer_u TimeStartExec, TimeEndExec; ///////////////////////////////////////////////////////////////////////////// #define Offs_From_Arg() (char)(va_arg(ap,int)) -/* WARNING - these are signed char offsets, NOT pointers! */ -char OVERR_DS=Ofs_XDS, OVERR_SS=Ofs_XSS; - /* This code is appended at the end of every instruction sequence. It * passes back the IP of the next instruction after the sequence. * (the one where we switch back to interpreted code). @@ -172,8 +165,12 @@ ///////////////////////////////////////////////////////////////////////////// -void InitGen(void) +void InitGen_x86(void) { + Gen = Gen_x86; + AddrGen = AddrGen_x86; + CloseAndExec = CloseAndExec_x86; + UseLinker = USE_LINKER; GenCodeBuf = BaseGenBuf = NULL; GenBufSize = 0; InitGenCodeBuf(); @@ -2157,7 +2154,7 @@ * address generator unit * careful - do not use eax, and NEVER change any flag! */ -void AddrGen(int op, int mode, ...) +static void AddrGen_x86(int op, int mode, ...) { va_list ap; IMeta *I; @@ -2253,7 +2250,7 @@ } -void Gen(int op, int mode, ...) +static void Gen_x86(int op, int mode, ...) { int rcod=0; va_list ap; @@ -2909,7 +2906,7 @@ * */ -unsigned char *CloseAndExec(unsigned char *PC, TNode *G, int mode, int ln) +static unsigned char *CloseAndExec_x86(unsigned char *PC, TNode *G, int mode, int ln) { static unsigned long flg, ecpu; static long mem_ref; Modified: trunk/src/emu-i386/simx86/codegen.h =================================================================== --- trunk/src/emu-i386/simx86/codegen.h 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/codegen.h 2006-10-23 22:19:55 UTC (rev 1628) @@ -246,13 +246,16 @@ ///////////////////////////////////////////////////////////////////////////// // +#ifdef HOST_ARCH_X86 +void InitGen_x86(void); +#endif void InitGen(void); int NewIMeta(unsigned char *newa, int mode, int *rc); -void Gen(int op, int mode, ...); -void AddrGen(int op, int mode, ...); -int Fp87_op(int exop, int reg); +extern void (*Gen)(int op, int mode, ...); +extern void (*AddrGen)(int op, int mode, ...); +extern int (*Fp87_op)(int exop, int reg); void NodeUnlinker(TNode *G); -unsigned char *CloseAndExec(unsigned char *PC, TNode *G, int mode, int ln); +extern unsigned char *(*CloseAndExec)(unsigned char *PC, TNode *G, int mode, int ln); void EndGen(void); // extern char InterOps[]; Modified: trunk/src/emu-i386/simx86/cpatch.c =================================================================== --- trunk/src/emu-i386/simx86/cpatch.c 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/cpatch.c 2006-10-23 22:19:55 UTC (rev 1628) @@ -54,7 +54,7 @@ return e_mprotect(addr,0); } -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 static int m_mprotect(caddr_t addr) { @@ -70,7 +70,8 @@ { if (debug_level('e')>3) e_printf("\tM_MUNPROT %08lx:%08lx [%08lx]\n", (long)addr,eip,*((long *)(eip-5))); -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 + if (!CONFIG_CPUSIM) { /* verify that data, not code, has been hit */ if (!e_querymark(addr)) return e_check_munprotect(addr); @@ -79,6 +80,7 @@ e_printf("CODE %08lx hit in DATA %08lx patch\n",(long)addr,eip); /* if (UnCpatch((void *)(eip-5))) leavedos(0); */ InvalidateSingleNode((long)addr, eip); + } #endif return e_check_munprotect(addr); } @@ -90,9 +92,11 @@ if (debug_level('e')>3) e_printf("\tR_MUNPROT %08lx:%08lx %s\n", (long)addr,(long)addr+len,(flags&EFLAGS_DF?"back":"fwd")); -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 + if (!CONFIG_CPUSIM) { InvalidateNodePage((long)addr,len,0,NULL); e_resetpagemarks(addr,len); + } #endif e_munprotect(addr,len); return 0; @@ -456,7 +460,7 @@ return 0; } -#endif //HOST_ARCH_SIM +#endif //HOST_ARCH_X86 /* ======================================================================= */ Modified: trunk/src/emu-i386/simx86/cpu-emu.c =================================================================== --- trunk/src/emu-i386/simx86/cpu-emu.c 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/cpu-emu.c 2006-10-23 22:19:55 UTC (rev 1628) @@ -74,11 +74,7 @@ hitimer_t sigEMUtime = 0; static hitimer_t lastEMUsig = 0; static unsigned long sigEMUdelta = 0; -#ifdef HOST_ARCH_SIM -int eTimeCorrect = 0; // full backtime stretch -#else -int eTimeCorrect = 1; // 1/2 backtime stretch -#endif +int eTimeCorrect; /* This needs to be merged someday with 'mode' */ volatile int CEmuStat = 0; @@ -748,6 +744,11 @@ void init_emu_cpu (void) { + eTimeCorrect = 0; // full backtime stretch +#ifdef HOST_ARCH_X86 + if (!CONFIG_CPUSIM) + eTimeCorrect = 1; // 1/2 backtime stretch +#endif if (config.cpuemu == 3) vm86only = 1; memset(&TheCPU, 0, sizeof(SynCPU)); @@ -1103,9 +1104,9 @@ /* ------ OUTER LOOP: exit for code >=0 and return to dosemu code */ do { Reg2Cpu(mode); -#ifdef HOST_ARCH_SIM - RFL.valid = V_INVALID; -#endif + if (CONFIG_CPUSIM) { + RFL.valid = V_INVALID; + } /* ---- INNER LOOP: exit with error or code>0 (vm86 fault) ---- */ do { /* enter VM86 mode */ @@ -1125,9 +1126,8 @@ } while (xval==0); /* ---- INNER LOOP -- exit for exception ---------------------- */ -#ifdef HOST_ARCH_SIM - FlagSync_All(); -#endif + if (CONFIG_CPUSIM) + FlagSync_All(); Cpu2Reg(); if (debug_level('e')>1) e_printf("---------------------\n\t EMU86: EXCP %#x\n", xval-1); @@ -1224,9 +1224,8 @@ do { TheCPU.err = 0; mode = Scp2CpuD (scp); -#ifdef HOST_ARCH_SIM - RFL.valid = V_INVALID; -#endif + if (CONFIG_CPUSIM) + RFL.valid = V_INVALID; if (TheCPU.err) { error("DPM86: segment error %d\n", TheCPU.err); leavedos(0); @@ -1251,9 +1250,8 @@ } while (xval==0); /* ---- INNER LOOP -- exit for exception ---------------------- */ -#ifdef HOST_ARCH_SIM - FlagSync_All(); -#endif + if (CONFIG_CPUSIM) + FlagSync_All(); if (debug_level('e')>1) e_printf("DPM86: EXCP %#x eflags=%08lx\n", xval-1, REG(eflags)); Modified: trunk/src/emu-i386/simx86/emu86.h =================================================================== --- trunk/src/emu-i386/simx86/emu86.h 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/emu86.h 2006-10-23 22:19:55 UTC (rev 1628) @@ -680,6 +680,9 @@ void CollectStat(void); // ///////////////////////////////////////////////////////////////////////////// +#ifdef HOST_ARCH_X86 +void init_emu_npu_x86(void); +#endif void init_emu_npu(void); extern unsigned long e_vga_base, e_vga_end; Modified: trunk/src/emu-i386/simx86/fp87-sim.c =================================================================== --- trunk/src/emu-i386/simx86/fp87-sim.c 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/fp87-sim.c 2006-10-23 22:19:55 UTC (rev 1628) @@ -38,6 +38,9 @@ #include "codegen-sim.h" #include <math.h> +int (*Fp87_op)(int exop, int reg); +static int Fp87_op_sim(int exop, int reg); + static double WFR0, WFR1; static unsigned short WFRS; @@ -77,6 +80,13 @@ void init_emu_npu (void) { int i; +#ifdef HOST_ARCH_X86 + if (!config.cpusim) { + init_emu_npu_x86(); + return; + } +#endif + Fp87_op = Fp87_op_sim; TheCPU.fpregs = _fparea; for (i=0; i<8; i++) TheCPU.fpregs[i] = 0.0; TheCPU.fpus = 0; @@ -104,7 +114,7 @@ } -int Fp87_op(int exop, int reg) +static int Fp87_op_sim(int exop, int reg) { // 42 DA 11000nnn FCMOVB st(0),st(n) // 43 DB 11000nnn FCMOVNB st(0),st(n) Modified: trunk/src/emu-i386/simx86/fp87-x86.c =================================================================== --- trunk/src/emu-i386/simx86/fp87-x86.c 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/fp87-x86.c 2006-10-23 22:19:55 UTC (rev 1628) @@ -35,13 +35,13 @@ #include <stddef.h> #include "emu86.h" -#ifdef HOST_ARCH_SIM -#include "fp87-sim.c" -#else +#ifdef HOST_ARCH_X86 #include "codegen.h" #include <math.h> +static int Fp87_op_x86(int exop, int reg); + /* * Tags are not completely implemented, and also all the stuff is in * 64-bit, not 80-bit, precision, so no wonder if you get errors in FP @@ -130,9 +130,11 @@ double *FPRSTT; -void init_emu_npu (void) +void init_emu_npu_x86 (void) { int i; + Fp87_op = Fp87_op_x86; + /* align 64-byte FP regs on a 256-byte boundary */ TheCPU.fpregs = (double *)(((long)_fparea+0x100)&~0xff); e_printf("FPU: register area %08lx\n",(long)TheCPU.fpregs); @@ -149,7 +151,7 @@ __asm__ __volatile__ ("fninit"); } -int Fp87_op(int exop, int reg) +static int Fp87_op_x86(int exop, int reg) { unsigned char rcod; register unsigned char *Cp = CodePtr; Modified: trunk/src/emu-i386/simx86/interp.c =================================================================== --- trunk/src/emu-i386/simx86/interp.c 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/interp.c 2006-10-23 22:19:55 UTC (rev 1628) @@ -80,17 +80,11 @@ * from P0, abort the current instruction and resume the parsing * loop at P2. */ -#ifdef HOST_ARCH_SIM -#define CODE_FLUSH() { unsigned char *P2 = CloseAndExec(P0, NULL, mode, __LINE__);\ - if (TheCPU.err) return P2;\ - } NewNode=0 -#else -#define CODE_FLUSH() if (CurrIMeta>0) {\ +#define CODE_FLUSH() if (CONFIG_CPUSIM || CurrIMeta>0) {\ unsigned char *P2 = CloseAndExec(P0, NULL, mode, __LINE__);\ if (TheCPU.err) return P2;\ - if (P2 != P0) { PC=P2; continue; }\ + if (!CONFIG_CPUSIM && P2 != P0) { PC=P2; continue; }\ } NewNode=0 -#endif #define UNPREFIX(m) ((m)&~(DATA16|ADDR16))|(basemode&(DATA16|ADDR16)) @@ -191,9 +185,9 @@ /* jump address for not taken branch, usually next instruction */ j_nt = d_nt + LONG_CS; -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 #if !defined(SINGLESTEP)&&!defined(SINGLEBLOCK) - if (!UseLinker) + if (!UseLinker || CONFIG_CPUSIM) #endif #endif goto jgnolink; @@ -259,9 +253,10 @@ dbug_printf("!Forever loop!\n"); leavedos(0xebfe); } -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 #ifdef NOJUMPS - if ((((long)P2 ^ j_t) & PAGE_MASK)==0) { // same page + if (!CONFIG_CPUSIM && + (((long)P2 ^ j_t) & PAGE_MASK)==0) { // same page e_printf("** JMP: ignored\n"); TheCPU.mode |= SKIPOP; goto takejmp; @@ -305,14 +300,10 @@ /* evaluate cond at RUNTIME after exec'ing */ switch(cond) { case 0x00: -#ifdef HOST_ARCH_SIM - FlagSync_O(); -#endif + if (CONFIG_CPUSIM) FlagSync_O(); taken = IS_OF_SET; break; case 0x01: -#ifdef HOST_ARCH_SIM - FlagSync_O(); -#endif + if (CONFIG_CPUSIM) FlagSync_O(); taken = !IS_OF_SET; break; case 0x02: taken = IS_CF_SET; break; case 0x03: taken = !IS_CF_SET; break; @@ -324,35 +315,23 @@ case 0x09: taken = !IS_SF_SET; break; case 0x0a: e_printf("!!! JPset\n"); -#ifdef HOST_ARCH_SIM - FlagSync_AP(); -#endif + if (CONFIG_CPUSIM) FlagSync_AP(); taken = IS_PF_SET; break; case 0x0b: e_printf("!!! JPclr\n"); -#ifdef HOST_ARCH_SIM - FlagSync_AP(); -#endif + if (CONFIG_CPUSIM) FlagSync_AP(); taken = !IS_PF_SET; break; case 0x0c: -#ifdef HOST_ARCH_SIM - FlagSync_O(); -#endif + if (CONFIG_CPUSIM) FlagSync_O(); taken = IS_SF_SET ^ IS_OF_SET; break; case 0x0d: -#ifdef HOST_ARCH_SIM - FlagSync_O(); -#endif + if (CONFIG_CPUSIM) FlagSync_O(); taken = !(IS_SF_SET ^ IS_OF_SET); break; case 0x0e: -#ifdef HOST_ARCH_SIM - FlagSync_O(); -#endif + if (CONFIG_CPUSIM) FlagSync_O(); taken = (IS_SF_SET ^ IS_OF_SET) || IS_ZF_SET; break; case 0x0f: -#ifdef HOST_ARCH_SIM - FlagSync_O(); -#endif + if (CONFIG_CPUSIM) FlagSync_O(); taken = !(IS_SF_SET ^ IS_OF_SET) && !IS_ZF_SET; break; case 0x10: taken = 1; break; case 0x11: { @@ -385,7 +364,7 @@ return NULL; } if (debug_level('e')>2) e_printf("** Jump taken to %08lx\n",(long)j_t); -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 takejmp: #endif TheCPU.eip = d_t; @@ -405,7 +384,7 @@ unsigned char opc; unsigned int temp; register int mode; -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 TNode *G; #endif @@ -420,7 +399,8 @@ TheCPU.mode = mode = basemode; if (!NewNode) { -#if !defined(SINGLESTEP)&&!defined(SINGLEBLOCK)&&!defined(HOST_ARCH_SIM) +#if !defined(SINGLESTEP)&&!defined(SINGLEBLOCK)&&defined(HOST_ARCH_X86) + if (!CONFIG_CPUSIM) { /* for a sequence to be found, it must begin with * an allowable opcode. Look into table. * NOTE - this while can loop forever and stop @@ -448,6 +428,7 @@ /* if all fails, stop infinite loops here */ temp--; } + } #endif if (CEmuStat & (CeS_TRAP|CeS_DRTRAP|CeS_SIGPEND|CeS_LOCK|CeS_RPIC|CeS_STI)) { #ifdef PROFILE @@ -673,10 +654,9 @@ /*9c*/ case PUSHF: { if (V86MODE() && (IOPL<3)) { -#ifdef HOST_ARCH_SIM - FlagSync_All(); -#else - CODE_FLUSH(); + if (CONFIG_CPUSIM) FlagSync_All(); +#ifdef HOST_ARCH_X86 + else CODE_FLUSH(); #endif /* virtual-8086 monitor */ temp = EFLAGS & 0xdff; @@ -1536,9 +1516,7 @@ if (debug_level('e')>1) e_printf("Popped flags %08x->{r=%08x v=%08x}\n",temp,EFLAGS,get_vFLAGS(EFLAGS)); } -#ifdef HOST_ARCH_SIM - RFL.valid = V_INVALID; -#endif + if (CONFIG_CPUSIM) RFL.valid = V_INVALID; } break; /*9d*/ case POPF: { @@ -1606,9 +1584,7 @@ if (debug_level('e')>1) e_printf("Popped flags %08x->{r=%08x v=%08x}\n",temp,EFLAGS,_EFLAGS); } -#ifdef HOST_ARCH_SIM - RFL.valid = V_INVALID; -#endif + if (CONFIG_CPUSIM) RFL.valid = V_INVALID; if (opc==POPF) PC++; } break; @@ -2283,9 +2259,7 @@ if (tmp < 0) goto illegal_op; EFLAGS &= ~EFLAGS_ZF; if (tmp) EFLAGS |= EFLAGS_ZF; -#ifdef HOST_ARCH_SIM - RFL.valid = V_INVALID; -#endif + if (CONFIG_CPUSIM) RFL.valid = V_INVALID; } break; case 5: { /* VERW */ @@ -2298,9 +2272,7 @@ if (tmp < 0) goto illegal_op; EFLAGS &= ~EFLAGS_ZF; if (tmp) EFLAGS |= EFLAGS_ZF; -#ifdef HOST_ARCH_SIM - RFL.valid = V_INVALID; -#endif + if (CONFIG_CPUSIM) RFL.valid = V_INVALID; } break; case 6: /* JMP indirect to IA64 code */ @@ -2344,9 +2316,7 @@ sv = GetDWord(TheCPU.mem_ref); if (!e_larlsl(mode, sv)) { EFLAGS &= ~EFLAGS_ZF; -#ifdef HOST_ARCH_SIM - RFL.valid = V_INVALID; -#endif + if (CONFIG_CPUSIM) RFL.valid = V_INVALID; } else { if (opc2==0x02) { /* LAR */ @@ -2359,9 +2329,7 @@ tmp = GetSelectorByteLimit(sv); } EFLAGS |= EFLAGS_ZF; -#ifdef HOST_ARCH_SIM - RFL.valid = V_INVALID; -#endif + if (CONFIG_CPUSIM) RFL.valid = V_INVALID; SetCPU_WL(mode, REG1, tmp); } } break; @@ -2740,8 +2708,8 @@ int rc=0; if (!(TheCPU.mode&SKIPOP)) (void)NewIMeta(P0, TheCPU.mode, &rc); -#ifndef HOST_ARCH_SIM - if (rc < 0) { // metadata table full +#ifdef HOST_ARCH_X86 + if (!CONFIG_CPUSIM && rc < 0) { // metadata table full if (debug_level('e')>2) e_printf("============ Tab full:cannot close sequence\n"); leavedos(0x9000); @@ -2778,7 +2746,7 @@ not_implemented: dbug_printf("!!! Unimplemented %02x %02x %02x\n",opc,PC[1],PC[2]); TheCPU.err = -2; return PC; -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 bad_return: dbug_printf("!!! Bad code return\n"); TheCPU.err = -3; return PC; Modified: trunk/src/emu-i386/simx86/sigsegv.c =================================================================== --- trunk/src/emu-i386/simx86/sigsegv.c 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/sigsegv.c 2006-10-23 22:19:55 UTC (rev 1628) @@ -432,10 +432,8 @@ } } -#ifdef HOST_ARCH_SIM - } - return 0; -#else +#ifdef HOST_ARCH_X86 + if (!CONFIG_CPUSIM) { /* bit 0 = 1 page protect * bit 1 = 1 writing @@ -498,8 +496,11 @@ /* now go back and perform the faulting op */ return 1; } + } +#endif } - else if (_trapno==0x00) { +#ifdef HOST_ARCH_X86__ + else if (!CONFIG_CPUSIM && _trapno==0x00) { if (InCompiledCode) { static char SpecialTailCode[] = // flags are already back { 0x9c,0xb8,0,0,0,0,0x5a,0xc3,0xf4 }; @@ -509,7 +510,9 @@ return 1; // restore CPU and jump to our tail code } } - return TryMemRef && _trapno != 0x0d; + return !CONFIG_CPUSIM && TryMemRef && _trapno != 0x0d; +#else + return 0; #endif verybad: Modified: trunk/src/emu-i386/simx86/trees.c =================================================================== --- trunk/src/emu-i386/simx86/trees.c 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/emu-i386/simx86/trees.c 2006-10-23 22:19:55 UTC (rev 1628) @@ -121,7 +121,7 @@ __memcpy(d,s,l); } -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 static TNode *avltr_probe (const long key, int *found) { @@ -522,13 +522,14 @@ } } -#endif // HOST_ARCH_SIM +#endif // HOST_ARCH_X86 ///////////////////////////////////////////////////////////////////////////// static void avltr_reinit(void) { -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 + if (!CONFIG_CPUSIM) { int i; TNode *G; @@ -548,6 +549,7 @@ if (InstrMeta==NULL) leavedos(993); memset(&InstrMeta, 0, sizeof(IMeta)); + } #endif g_printf("avltr_reinit\n"); CurrIMeta = -1; @@ -559,12 +561,16 @@ void avltr_destroy(void) { -#ifndef HOST_ARCH_SIM - avltr_tree *tree = &CollectTree; +#ifdef HOST_ARCH_X86 + avltr_tree *tree; #ifdef PROFILE hitimer_t t0; #endif + if (CONFIG_CPUSIM) + return; + + tree = &CollectTree; e_printf("--------------------------------------------------------------\n"); e_printf("Destroy AVLtree with %d nodes\n",ninodes); e_printf("--------------------------------------------------------------\n"); @@ -623,7 +629,7 @@ ///////////////////////////////////////////////////////////////////////////// -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 #ifdef DEBUG_LINKER void CheckLinks (void) @@ -832,9 +838,9 @@ } #endif -#endif // HOST_ARCH_SIM +#endif // HOST_ARCH_X86 -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 static int TraverseAndClean(void) { @@ -898,8 +904,13 @@ */ TNode *Move2Tree(void) { + if (CONFIG_CPUSIM) { + CurrIMeta = -1; + return NULL; + } +#ifdef HOST_ARCH_X86 + { TNode *nG = NULL; -#ifndef HOST_ARCH_SIM IMeta *I0; #ifdef PROFILE hitimer_t t0 = GETTSC(); @@ -1013,16 +1024,19 @@ #ifdef PROFILE AddTime += (GETTSC() - t0); #endif -#else // HOST_ARCH_SIM - CurrIMeta = -1; -#endif // HOST_ARCH_SIM return nG; + } +#endif // HOST_ARCH_X86 } TNode *FindTree(long key) { -#ifndef HOST_ARCH_SIM + if (CONFIG_CPUSIM) + return NULL; + +#ifdef HOST_ARCH_X86 + { TNode *I; static int tccount=0; #ifdef PROFILE @@ -1103,8 +1117,9 @@ #ifdef PROFILE NodesNotFound++; #endif -#endif // HOST_ARCH_SIM return NULL; + } +#endif // HOST_ARCH_X86 } @@ -1122,7 +1137,7 @@ * same 4k page. * */ -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 static void BreakNode(TNode *G, long eip, long addr) { @@ -1159,7 +1174,9 @@ int FindCodeNode (long addr) { int found = 0; -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 + if (!CONFIG_CPUSIM) + { register TNode *G = &CollectTree.root; #ifdef PROFILE hitimer_t t0; @@ -1189,6 +1206,7 @@ #ifdef PROFILE SearchTime += (GETTSC() - t0); #endif + } #endif return found; } @@ -1197,7 +1215,8 @@ int InvalidateSingleNode (long addr, long eip) { int nnh = 0; -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 + if (!CONFIG_CPUSIM) { TNode *G = &CollectTree.root; #ifdef PROFILE hitimer_t t0; @@ -1252,7 +1271,8 @@ #ifdef PROFILE CleanupTime += (GETTSC() - t0); #endif -#endif // HOST_ARCH_SIM + } +#endif // HOST_ARCH_X86 return nnh; } @@ -1260,7 +1280,8 @@ int InvalidateNodePage (long addr, int len, long eip, int *codehit) { int nnh = 0; -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 + if (!CONFIG_CPUSIM) { register TNode *G = &CollectTree.root; long al, ah; #ifdef PROFILE @@ -1319,7 +1340,8 @@ #ifdef PROFILE CleanupTime += (GETTSC() - t0); #endif -#endif // HOST_ARCH_SIM + } +#endif // HOST_ARCH_X86 return nnh; } @@ -1341,7 +1363,12 @@ static void CleanIMeta(void) { -#ifndef HOST_ARCH_SIM + if (CONFIG_CPUSIM) { + CurrIMeta = -1; + return; + } +#ifdef HOST_ARCH_X86 + { #ifdef PROFILE hitimer_t t0 = GETTSC(); #endif @@ -1351,9 +1378,8 @@ #ifdef PROFILE CleanupTime += (GETTSC() - t0); #endif -#else // HOST_ARCH_SIM - CurrIMeta = -1; -#endif // HOST_ARCH_SIM + } +#endif // HOST_ARCH_X86 } ///////////////////////////////////////////////////////////////////////////// @@ -1361,7 +1387,8 @@ int NewIMeta(unsigned char *npc, int mode, int *rc) { -#ifndef HOST_ARCH_SIM +#ifdef HOST_ARCH_X86 + if (!CONFIG_CPUSIM) { #ifdef PROFILE hitimer_t t0 = GETTSC(); #endif @@ -1406,13 +1433,13 @@ AddTime += (GETTSC() - t0); #endif return -1; -#else // HOST_ARCH_SIM + } +#endif // HOST_ARCH_X86 if (CurrIMeta==0) { // no open code sequences if (debug_level('e')>2) e_printf("============ Opening sequence at %08lx\n",(long)npc); } CurrIMeta++; InstrMeta[CurrIMeta].ngen=0; return CurrIMeta; -#endif // HOST_ARCH_SIM } Modified: trunk/src/include/cpu-emu.h =================================================================== --- trunk/src/include/cpu-emu.h 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/include/cpu-emu.h 2006-10-23 22:19:55 UTC (rev 1628) @@ -54,8 +54,11 @@ #define CPUEMU_DIRECT_IO #endif -#ifdef __x86_64__ -#define HOST_ARCH_SIM +#ifdef __i386__ +#define HOST_ARCH_X86 +#define CONFIG_CPUSIM config.cpusim +#else +#define CONFIG_CPUSIM 1 #endif /* ----------------------------------------------------------------------- */ Modified: trunk/src/include/emu.h =================================================================== --- trunk/src/include/emu.h 2006-10-22 16:19:56 UTC (rev 1627) +++ trunk/src/include/emu.h 2006-10-23 22:19:55 UTC (rev 1628) @@ -163,6 +163,7 @@ #ifdef X86_EMULATOR boolean cpuemu; + boolean cpusim; #endif int CPUSpeedInMhz; /* for video */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |