-
Notifications
You must be signed in to change notification settings - Fork 231
Description
Summary
When running the SPEC CPU2017 benchmark 620.omnetpp_s (OMNeT++ 4.0) on an ARM64 host using FEX (x86_64 user-mode), OMNeT++ fails to load most .ned files from a directory, and then reports that the main network largeNet is missing. The same x86_64 binary and configuration run correctly under qemu-x86_64 on the same ARM64 machine.
This looks like a bug in how FEX implements directory enumeration (readdir/getdents-style syscalls) for x86_64 user-mode.
Environment
- Host architecture: ARM64
- Host OS: Ubuntu 24.04 (noble) arm64 (in a container)
- FEX: [main branch, commit hash: bf9ab7f], Rootfs download by FEXRootFSFetcher
- SPEC CPU version: SPEC CPU2017
- Benchmark: 620.omnetpp_s (omnetpp_s_base.x64_static-m64)
- OMNeT++ version: 4.0 (as shipped by SPEC2017)
- QEMU:
qemu-userpackage (qemu-x86_64)
SPEC run directory (inside container / host FS):
/host/SPEC2017/620.omnetpp_s/run/run_base_refspeed_x64_static-m64.0000
NED directory:
/host/SPEC2017/620.omnetpp_s/run/run_base_refspeed_x64_static-m64.0000/ned
ned/ contains 13 .ned files (no Cli.ned originally):
- EtherAppCli.ned
- EtherAppSrv.ned
- EtherBus.ned
- EtherEncap.ned
- EtherHost.ned
- EtherHub.ned
- EtherLLC.ned
- EtherMAC.ned
- EtherSwitch.ned
- LargeNet.ned
- MACRelayUnit.ned
- MACRelayUnitNP.ned
- MACRelayUnitPP.ned
Both on the host and inside FEX /bin/bash, ls shows the same 13 files.
Reproduction
From the SPEC run directory:
cd /host/SPEC2017/620.omnetpp_s/run/run_base_refspeed_x64_static-m64.00001. Run with qemu-x86_64 (works)
qemu-x86_64 ../../exe/omnetpp_s_base.x64_static-m64 -f ./omnetpp.ini -c General -r 0Output (abridged):
Loading NED files from a SPEC directory 14Setting up network 'largeNet'...- Simulation runs normally
2. Run with FEX (fails)
FEX ../../exe/omnetpp_s_base.x64_static-m64 -f ./omnetpp.ini -c General -r 0Without any manual changes, OMNeT++ prints:
<!> Error: Error loading NED sources from `/host/SPEC2017/620.omnetpp_s/run/run_base_refspeed_x64_static-m64.0000/ned': cannot stat file 'Cli.ned': No such file or directory.
Note: there is no Cli.ned in the ned/ directory; SPEC’s reference x86_64 run on a native x86_64 machine also works fine without such a file.
If I manually create an empty Cli.ned:
cd ned
touch Cli.ned
cd ..and re-run under FEX:
FEX ../../exe/omnetpp_s_base.x64_static-m64 -f ./omnetpp.ini -c General -r 0I get a bit further:
OMNeT++ Discrete Event Simulation (C) 1992-2008 Andras Varga, OpenSim Ltd.
Version: 4.0, build: 090310-10709, edition: Academic Public License -- NOT FOR COMMERCIAL USE
Setting up Cmdenv...
Loading NED files from a SPEC directory 2
Preparing for running configuration General, run #0...
Scenario: $repetition=0
Assigned runID=speccpu-runid
<!> Error: Network `largeNet' not found, check .ini and .ned files.
End.
Key difference:
- Under qemu-x86_64, OMNeT++ reports:
Loading NED files from a SPEC directory 14 - Under FEX, OMNeT++ reports:
Loading NED files from a SPEC directory 2, and then fails withNetwork 'largeNet' not found
The only difference between the runs is the x86_64 emulator (qemu vs FEX); same working directory, same omnetpp.ini, same binary.
File system visibility check
On host / container:
cd /host/SPEC2017/620.omnetpp_s/run/run_base_refspeed_x64_static-m64.0000
ls -l ned/ | wc -l
ls -l ned/Output shows 13 .ned files as listed above.
Inside FEX /bin/bash:
FEX /bin/bash
cd /host/SPEC2017/620.omnetpp_s/run/run_base_refspeed_x64_static-m64.0000
ls -l ned/ | wc -l
ls -l ned/Output is identical: same 13 .ned files with same sizes and permissions. So the host FS is mapped correctly into FEX (at least for shell utilities).
strace comparison (qemu-x86_64 vs FEX)
I captured strace logs for both qemu-x86_64 and FEX runs.
qemu-x86_64
Command:
strace -f -o qemu.log \
qemu-x86_64 ../../exe/omnetpp_s_base.x64_static-m64 -f ./omnetpp.ini -c General -r 0From qemu.log, OMNeT++ clearly enumerates and opens many .ned files in ned/:
newfstatat(AT_FDCWD, "EtherAppCli.ned", {st_mode=S_IFREG|0775, st_size=1678, ...}, 0) = 0
readlinkat(AT_FDCWD, "/host/SPEC2017/620.omnetpp_s/run/run_base_refspeed_x64_static-m64.0000/ned/EtherAppCli.ned", 0xffffed9884f0, 1023) = -1 EINVAL (Invalid argument)
faccessat(AT_FDCWD, "/usr/gnemul/qemu-x86_64/host/SPEC2017/620.omnetpp_s/run/run_base_refspeed_x64_static-m64.0000/ned/EtherAppCli.ned", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/host/SPEC2017/620.omnetpp_s/run/run_base_refspeed_x64_static-m64.0000/ned/EtherAppCli.ned", O_RDONLY) = 4
newfstatat(AT_FDCWD, "EtherAppSrv.ned", {st_mode=S_IFREG|0775, st_size=1137, ...}, 0) = 0
openat(AT_FDCWD, "/host/SPEC2017/620.omnetpp_s/run/run_base_refspeed_x64_static-m64.0000/ned/EtherAppSrv.ned", O_RDONLY) = 4
newfstatat(AT_FDCWD, "EtherBus.ned", {st_mode=S_IFREG|0775, st_size=1843, ...}, 0) = 0
...
(newfstatat/openat for many other .ned files, including LargeNet.ned, MACRelayUnit*.ned, etc.)
So under qemu-x86_64 the x86_64 process successfully enumerates and opens all .ned files in the directory.
FEX
Command:
strace -f -o fex.log \
FEX ../../exe/omnetpp_s_base.x64_static-m64 -f ./omnetpp.ini -c General -r 0From fex.log (without my manually created empty Cli.ned):
openat2(5, "host/SPEC2017/620.omnetpp_s/run/run_base_refspeed_x64_static-m64.0000/ned/package.ned", {flags=O_RDONLY, resolve=RESOLVE_IN_ROOT}, 24) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/host/SPEC2017/620.omnetpp_s/run/run_base_refspeed_x64_static-m64.0000/ned/package.ned", O_RDONLY) = -1 ENOENT (No such file or directory)
newfstatat(AT_FDCWD, "Cli.ned", 0xfffffc18a080, 0) = -1 ENOENT (No such file or directory)
Notably:
- There are no
newfstatat/openatcalls for the existing.nedfiles such asEtherAppCli.ned,LargeNet.ned, etc. - Only
package.nedandCli.nedare ever attempted. - This is consistent with OMNeT++ reporting
Loading NED files from a SPEC directory 2under FEX vs14under qemu.
So although a normal shell inside FEX can ls all files in ned/, the x86_64 process under FEX apparently does not see / enumerate those entries when scanning for NED files.
This strongly suggests an issue in FEX’s implementation of directory enumeration syscalls (getdents, getdents64, or related) or path resolution for the emulated x86_64 process.
Workarounds
I found two workarounds:
-
Manually creating an empty
Cli.ned
This bypasses the initialcannot stat file 'Cli.ned'error but still fails later withNetwork 'largeNet' not found, because most.nedfiles are not being loaded. -
Explicitly specifying all
.nedfiles inomnetpp.ini
If I list all.nedfiles explicitly vianed-files = ned/EtherAppCli.ned ned/EtherAppSrv.ned ...inomnetpp.ini, OMNeT++ can open them directly (without relying on directory enumeration), and the simulation can run further under FEX.
In contrast, qemu-x86_64 works out of the box, without any changes to the SPEC-supplied configuration, which matches behavior on a native x86_64 host.
Expected behavior
- The x86_64 process running under FEX should see the same directory entries as under qemu-x86_64 / native x86_64.
- OMNeT++ should be able to enumerate and open all
.nedfiles underned/, resulting inLoading NED files from a SPEC directory 14, and the networklargeNetshould be found and the simulation should run normally.
Actual behavior
-
Under FEX, OMNeT++ only sees 2 NED sources (vs 14 under qemu).
-
It attempts to access
package.nedandCli.nedbut never attempts tostat/openreal existing NED files likeEtherAppCli.ned,LargeNet.ned, etc. -
As a result, it fails with:
<!> Error: Network `largeNet' not found, check .ini and .ned files.
Request
Could you please:
- Confirm whether this is a known issue with x86_64 user-mode directory enumeration in FEX?
- Suggest a proper fix or workaround (other than manually listing all
.nedfiles)? - If helpful, I can provide the full
qemu.logandfex.logfiles or further reduced repros.
Thanks!