Skip to content

Commit 52845e7

Browse files
authored
Merge pull request dosemu2#2704 from bartoldeman/simx86-delete-nodes-asap
simx86: delete nodes as soon as possible
2 parents 8e48765 + bf9352e commit 52845e7

File tree

7 files changed

+80
-106
lines changed

7 files changed

+80
-106
lines changed

src/base/emu-i386/simx86/codegen-sim.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2618,7 +2618,8 @@ static unsigned int Gen_sim(IGen *IG, unsigned int *pmem_ref)
26182618

26192619
case JMP_TAILCODE: { // retaddr
26202620
P0 = (unsigned int)IG->p0;
2621-
TheCPU.key = P0;
2621+
if (!(mode & MPATCH))
2622+
TheCPU.key = P0;
26222623
if (debug_level('e')>2) {
26232624
dbug_printf("** Tail code: return from %08x\n",P0);
26242625
} }
@@ -2784,7 +2785,7 @@ static unsigned Exec_sim(void *SeqStart)
27842785
P0 = Gen_sim(SeqStart, &TheCPU.mem_ref);
27852786
currentIG = NULL;
27862787
EFLAGS = (EFLAGS & ~EFLAGS_CC) | FlagSync_All();
2787-
if (TheCPU.err) TheCPU.key = P0;
2788+
if (TheCPU.err && TheCPU.err != EXCP_BREAKNODE) TheCPU.key = P0;
27882789

27892790
return P0;
27902791
}

src/base/emu-i386/simx86/codegen-x86.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1863,10 +1863,15 @@ arith0: {
18631863
}
18641864
break;
18651865

1866-
case JMP_TAILCODE:
1866+
case JMP_TAILCODE: {
18671867
/* copy tail instructions to the end of the code block */
1868+
unsigned char *p = Cp;
18681869
GNX(Cp, TailCode, TAILSIZE);
1869-
*((unsigned int *)(Cp - TAILSIZE + TAILFIX)) = IG->p0;
1870+
/* Keep TheCPU.eip for BreakNode */
1871+
if (mode & MPATCH)
1872+
p[5] = p[6] = p[7] = NOP;
1873+
*((unsigned int *)(p + TAILFIX)) = IG->p0;
1874+
}
18701875
break;
18711876

18721877
case JMP_INDIRECT: { // input: %%{e}ax = %%{e}ip

src/base/emu-i386/simx86/codegen.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,14 @@ static unsigned ExecOne(TNode *G)
587587
#endif
588588
prefetch(CPUOFFS(0));
589589
ePC = Exec(G->addr);
590+
if (TheCPU.err == EXCP_BREAKNODE) {
591+
if (debug_level('e')>2)
592+
e_printf("Delete broken node %08x\n",TheCPU.key);
593+
G = FindTree(TheCPU.key);
594+
assert(G);
595+
RemoveNode(G);
596+
TheCPU.err = 0;
597+
}
590598
#ifdef SKIP_EMU_VBIOS
591599
if ((TheCPU.cs&0xf000)==config.vbios_seg && !TheCPU.err)
592600
TheCPU.err = EXCP_GOBACK;
@@ -686,8 +694,8 @@ unsigned int DoExec(TNode *G)
686694
}
687695

688696
#if defined(SINGLESTEP)
689-
InvalidateNodeRange(key, 1, NULL);
690-
avltr_delete(key);
697+
G = FindTree(key);
698+
if (G) RemoveNode(G);
691699
#endif
692700

693701
return ePC;

src/base/emu-i386/simx86/emu86.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,7 @@ extern int SpecPrejits;
680680
#define EXCP_STISIGNAL 67
681681
#define EXCP_MODESWITCH 68
682682
#define EXCP_EMULEAVE 69
683+
#define EXCP_BREAKNODE 70
683684

684685
#define exit_SIGPEND 0x01 /* signal pending mask */
685686
#define exit_RPIC 0x02 /* pic asks for interruption */

src/base/emu-i386/simx86/interp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ static unsigned int FindExecCode(unsigned int PC)
461461
G = FindTree(PC);
462462
if (G) {
463463
if (!GoodNode(G)) {
464-
InvalidateNodeRange(G->key, G->seqlen, NULL);
464+
RemoveNode(G);
465465
G = NULL;
466466
}
467467
else if (debug_level('e')>2)

0 commit comments

Comments
 (0)