[Bug] WoW Classic (_anniversary_) on Winlator + FEX: NoExec instruction in entry block then C0000005 exception storm
Summary
On Android (Winlator + Wine arm64ec + FEX DLL backend), launching WoW Classic starts loading normally, then fails with:
NoExec instruction in entry block: 1921612
- first AV at
native_pc=7FFFFE0528 guest_rip=1921612
- repeated
C0000005 loop (1921612 / 192054F)
This looks like an executable mapped region not being tracked as executable by FEX code-region tracking.
Environment
- Host app package:
com.winlator.llm
- Winlator repo commit:
a226467
- FEX subrepo commit used to build DLLs:
1268a3910
- Wine:
proton-10-arm64ec
HODLL=libwow64fex.dll
- GPU stack: Turnip
26.0.0, WRAPPER_VK_VERSION=1.3.335, GALLIUM_DRIVER=zink
- WoW path:
D:\wow\World of Warcraft\_anniversary_\WowClassic.exe
Relevant env (trimmed):
FEX_AV_TRACE=1
FEX_SILENTLOG=0
FEX_SMC_CHECKS=mtrack
FEX_VOLATILEMETADATA=1
FEX_DISABLEL2CACHE=0
FEX_DYNAMICL1CACHE=0
FEX_TRACE_MEM_EVENTS=1
FEX_TRACE_SYSCALL_MEM=1
Repro
- Launch Winlator container.
- Start WoW Classic (
_anniversary_) in x86 path under FEX.
- Observe immediate failure/hang/exit.
Expected
WoW continues startup (at least past loader stage) without entering AV loop.
Actual
WowClassic.exe and WowClassic_loader.dll load successfully, then execution enters NoExec + AV loop.
Key log excerpts
From wine.log:
-
Module load succeeds:
Load module WowClassic.exe ...
Load module WowClassic_loader.dll ...
-
NoExec on unknown executable address:
exec.query addr=1921612 -> base=0 size=0 writable=0 thread_arg=1
exec.query.mem: addr=1921612 base=1921000 end=1A20000 size=FF000 state=1000 protect=20 alloc_protect=20 type=40000
NoExec instruction in entry block: 1921612
-
First AV:
Exception: Code: C0000005 Address: 7FFFFE0528
first_av native_pc=7FFFFE0528 guest_rip=1921612 fault=0
first_av.guest_rip: 1921612 (unknown module)
-
Exception storm:
- repeated:
Exception: Code: C0000005 Address: 7FFFFE0528
Exception: Code: C0000005 Address: 192054F
Reconstructing context ... Passing through exception
-
Important detail:
- failing address is in mapped executable memory (
type=0x40000, protect=0x20)
- but
exec.query still returns empty tracked range (base=0 size=0)
Additional observation
Extra tracing around map/unmap was added locally.
This run shows many NotifyUnmapViewOfSection traces (tracker=1 thread_state=1), but no matching NtMapViewOfSection-style registration logs for the failing region.
Questions for FEX maintainers
- In WOW64/ARM64EC flow, should
MEM_MAPPED + PAGE_EXECUTE_READ regions always be registered into executable code tracking?
- Is this a known gap in
NtMapViewOfSection(Ex) (or another map path) in the Windows frontend?
- Which exact registration path is expected to cover this region?
- Any known regressions around
NoExec instruction in entry block with unknown-module addresses on Windows backend?
Artifacts
I will attach full artifacts in follow-up comments:
[Bug] WoW Classic (
_anniversary_) on Winlator + FEX:NoExec instruction in entry blockthenC0000005exception stormSummary
On Android (Winlator + Wine arm64ec + FEX DLL backend), launching WoW Classic starts loading normally, then fails with:
NoExec instruction in entry block: 1921612native_pc=7FFFFE0528 guest_rip=1921612C0000005loop (1921612/192054F)This looks like an executable mapped region not being tracked as executable by FEX code-region tracking.
Environment
com.winlator.llma2264671268a3910proton-10-arm64ecHODLL=libwow64fex.dll26.0.0,WRAPPER_VK_VERSION=1.3.335,GALLIUM_DRIVER=zinkD:\wow\World of Warcraft\_anniversary_\WowClassic.exeRelevant env (trimmed):
FEX_AV_TRACE=1FEX_SILENTLOG=0FEX_SMC_CHECKS=mtrackFEX_VOLATILEMETADATA=1FEX_DISABLEL2CACHE=0FEX_DYNAMICL1CACHE=0FEX_TRACE_MEM_EVENTS=1FEX_TRACE_SYSCALL_MEM=1Repro
_anniversary_) in x86 path under FEX.Expected
WoW continues startup (at least past loader stage) without entering AV loop.
Actual
WowClassic.exeandWowClassic_loader.dllload successfully, then execution enters NoExec + AV loop.Key log excerpts
From
wine.log:Module load succeeds:
Load module WowClassic.exe ...Load module WowClassic_loader.dll ...NoExec on unknown executable address:
exec.query addr=1921612 -> base=0 size=0 writable=0 thread_arg=1exec.query.mem: addr=1921612 base=1921000 end=1A20000 size=FF000 state=1000 protect=20 alloc_protect=20 type=40000NoExec instruction in entry block: 1921612First AV:
Exception: Code: C0000005 Address: 7FFFFE0528first_av native_pc=7FFFFE0528 guest_rip=1921612 fault=0first_av.guest_rip: 1921612 (unknown module)Exception storm:
Exception: Code: C0000005 Address: 7FFFFE0528Exception: Code: C0000005 Address: 192054FReconstructing context ... Passing through exceptionImportant detail:
type=0x40000,protect=0x20)exec.querystill returns empty tracked range (base=0 size=0)Additional observation
Extra tracing around map/unmap was added locally.
This run shows many
NotifyUnmapViewOfSectiontraces (tracker=1 thread_state=1), but no matchingNtMapViewOfSection-style registration logs for the failing region.Questions for FEX maintainers
MEM_MAPPED + PAGE_EXECUTE_READregions always be registered into executable code tracking?NtMapViewOfSection(Ex)(or another map path) in the Windows frontend?NoExec instruction in entry blockwith unknown-module addresses on Windows backend?Artifacts
I will attach full artifacts in follow-up comments:
wine.loglogcatissue-5328-logs.tar.gz