Skip to content

Commit fa39e01

Browse files
committed
simx86: fix crash when FPU ins modifies code
BreakNode wasn't working correctly if the invalidation happened from the sigsegv handler instead of via Cpatch(). Make sure InvalidateNodeRange gets the correct JITted code pointer (via pjit) and if the node is broken, force an exit. Fixes dosemu2#2708
1 parent 7f78603 commit fa39e01

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ int e_emu_fault(sigcontext_t *scp, int in_vm86)
320320
int e_handle_pagefault(dosaddr_t addr, unsigned err, sigcontext_t *scp)
321321
{
322322
int v;
323-
unsigned char *p;
323+
unsigned char *p, *pjit;
324324
int in_dosemu;
325325

326326
/* err:
@@ -366,12 +366,14 @@ int e_handle_pagefault(dosaddr_t addr, unsigned err, sigcontext_t *scp)
366366
if (debug_level('e')) PageFaults++;
367367
#endif
368368
in_dosemu = !(InCompiledCode || in_vm86 || DPMIValidSelector(_scp_cs));
369+
p = (unsigned char *) _scp_rip;
370+
pjit = InCompiledCode ? GetGenCodeBuf(p) : NULL;
369371
if (in_vm86)
370372
p = SEG_ADR((unsigned char *), cs, ip);
371373
else if (DPMIValidSelector(_scp_cs))
372374
p = (unsigned char *)EMU_BASE32(GetSegmentBase(_scp_cs) + _scp_rip);
373-
else
374-
p = GetGenCodeBuf((unsigned char *) _scp_rip);
375+
else if (InCompiledCode)
376+
p = pjit;
375377
if (debug_level('e')>1 || in_dosemu) {
376378
v = *((int *)p);
377379
__asm__("bswap %0" : "=r" (v) : "0" (v));
@@ -404,7 +406,9 @@ int e_handle_pagefault(dosaddr_t addr, unsigned err, sigcontext_t *scp)
404406
/* We HAVE to invalidate all the code in the page
405407
* if the page is going to be unprotected */
406408
addr &= _PAGE_MASK;
407-
return InvalidateNodeRange(addr, PAGE_SIZE, p);
409+
int ret = InvalidateNodeRange(addr, PAGE_SIZE, pjit);
410+
if (TheCPU.err == EXCP_BREAKNODE) e_return_from_jit(scp, 1);
411+
return ret;
408412
}
409413

410414
int e_handle_fault(sigcontext_t *scp)

0 commit comments

Comments
 (0)