mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-09 06:00:15 +02:00
Seccomp is a relatively complex feature that was added to Linux back in
2005, and was further extended in 2013 to support BPF based protections.
Once seccomp is enabled, you can no longer disable seccomp but
additional protections can be placed on top of existing seccomp filters.
Additionally seccomp filters are inherited in child processes, which
ensures the process tree can't escape from the secure computing
environment through child processes.
The basis of this feature is a shim that lives between userspace and the
kernel at the syscall entrypoint.
In "strict" mode, seccomp only allows read, write, exit, exit_group, and {rt_,}sigreturn to function.
When in "filter" mode, a BPF filter is run on syscall entrypoint and
returns state about if the syscall should be allowed or not. Multiple
filters can be installed in this mode, all of which get executed. The
result that is the most restricted is the action that occurs at the end.
There are some significant limitations in filter mode that must be
adhered to which makes executing this code inside of kernel space a
non-issue and effectively limits how much cpu time is spent in the filters.
Although these filters are free to do basically anything with the
provided data, just can't do any loops.
FEX needs to implement seccomp because there are multiple applications
using the feature, the primary one being Chromium which some games embed
without disabling the sandbox. WINE also uses seccomp for capturing
games that do raw Windows system calls. Apparently Red Dead Redemption
is one of the games that requires this.
While FEX implements seccomp, it is not yet all encompassing, which is
one of the reasons why it isn't enabled by default and requires a config
option.
**seccomp_unotify is not implemented**
This is a relatively new feature for seccomp which lets the seccomp
filter signal an FD for multiple things. Luckily Chromium and WINE don't
use this. This will be tricky to implement under FEX since it
requires ioctl trapping and some other behaviour
**ptrace isn't supported**
One feature of seccomp is that it can raise ptrace events. Since FEX
doesn't support ptrace at all, this isn't handled. Again Chromium and
WINE don't use this.
**kill-thread not quite correct**
This isn't directly related to seccomp but more about how we do thread
shutdown in FEX. This will require some more changes around thread state
tracking before fully supporting this. Chromium and WINE don't use this.
kill-process also falls under this
Features that are supported:
- Strict mode and seccomp-bpf mode supported
- All BFP instructions that seccomp-bpf understands
- Inheriting seccomp through execve
- This means we serialize and deserialize the calling thread's
seccomp filters
- An execve that escapes FEX will also escape seccomp. Not much we
can do about it
- TSync - Allowing post-mortem seccomp insertion which allows threads to
synchronize seccomp filters after the fact
Features that are not supported:
- Different arch qualifiers depending on syscall entrypoint
- Just like our syscall handler, we are hardcoded to the arch that the
application starts with
- user_notif
- ptrace
- Runtime code cache invalidation when seccomp is installed
- Currently we must ensure all syscalls go through the frontend
syscall handler
- Runtime invalidation of code cache with inline syscalls will get
fixed in the future.
This currently isn't enabled by default because of the minor feature
problems that haven't been resolved. Currently the Linux Kernel's test
application works for the features that FEX supports, and WINE's usage
can be handled by FEX. Chromium's sandbox doesn't yet work with this PR,
but it only fails due to features unrelated to seccomp.
Having this open for merging now so we can work to resolve the remaining
issues without this bitrotting.
572 lines
20 KiB
Plaintext
572 lines
20 KiB
Plaintext
{
|
|
"Options": {
|
|
"CPU": {
|
|
"Core": {
|
|
"Type": "uint32",
|
|
"Default": "FEXCore::Config::ConfigCore::CONFIG_IRJIT",
|
|
"TextDefault": "irjit",
|
|
"ShortArg": "c",
|
|
"Choices": [ "irjit", "host" ],
|
|
"ArgumentHandler": "CoreHandler",
|
|
"Desc": [
|
|
"Which CPU core to use",
|
|
"host only exists on x86_64",
|
|
"[irjit, host]"
|
|
]
|
|
},
|
|
"Multiblock": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"ShortArg": "m",
|
|
"Desc": [
|
|
"Controls multiblock code compilation",
|
|
"Can cause long JIT compilation times and stutter"
|
|
]
|
|
},
|
|
"MaxInst": {
|
|
"Type": "int32",
|
|
"Default": "5000",
|
|
"ShortArg": "n",
|
|
"Desc": [
|
|
"Maximum number of instruction to store in a block"
|
|
]
|
|
},
|
|
"CacheObjectCodeCompilation": {
|
|
"Type": "uint32",
|
|
"Default": "FEXCore::Config::ConfigObjectCodeHandler::CONFIG_NONE",
|
|
"TextDefault": "none",
|
|
"Choices": [ "none", "read", "readwrite" ],
|
|
"ArgumentHandler": "CacheObjectCodeHandler",
|
|
"Desc": [
|
|
"Cache JIT object code to drive.",
|
|
"Allows JIT code to be shared between applications"
|
|
]
|
|
},
|
|
"HostFeatures": {
|
|
"Type": "strenum",
|
|
"Default": "FEXCore::Config::HostFeatures::OFF",
|
|
"Enums": {
|
|
"ENABLESVE": "enablesve",
|
|
"DISABLESVE": "disablesve",
|
|
"ENABLEAVX": "enableavx",
|
|
"DISABLEAVX": "disableavx",
|
|
"ENABLEAFP": "enableafp",
|
|
"DISABLEAFP": "disableafp",
|
|
"ENABLELRCPC": "enablelrcpc",
|
|
"DISABLELRCPC": "disablelrcpc",
|
|
"ENABLELRCPC2": "enablelrcpc2",
|
|
"DISABLELRCPC2": "disablelrcpc2",
|
|
"ENABLECSSC": "enablecssc",
|
|
"DISABLECSSC": "disablecssc",
|
|
"ENABLEPMULL128": "enablepmull128",
|
|
"DISABLEPMULL128": "disablepmull128",
|
|
"ENABLERNG": "enablerng",
|
|
"DISABLERNG": "disablerng",
|
|
"ENABLECLZERO": "enableclzero",
|
|
"DISABLECLZERO": "disableclzero",
|
|
"ENABLEATOMICS": "enableatomics",
|
|
"DISABLEATOMICS": "disableatomics",
|
|
"ENABLEFCMA": "enablefcma",
|
|
"DISABLEFCMA": "disablefcma",
|
|
"ENABLEFLAGM": "enableflagm",
|
|
"DISABLEFLAGM": "disableflagm",
|
|
"ENABLEFLAGM2": "enableflagm2",
|
|
"DISABLEFLAGM2": "disableflagm2",
|
|
"ENABLECRYPTO": "enablecrypto",
|
|
"DISABLECRYPTO": "disablecrypto",
|
|
"ENABLERPRES": "enablerpres",
|
|
"DISABLERPRES": "disablerpres",
|
|
"ENABLESVEBITPERM": "enablesvebitperm",
|
|
"DISABLESVEBITPERM": "disablesvebitperm",
|
|
"ENABLEPRESERVEALLABI": "enablepreserveallabi",
|
|
"DISABLEPRESERVEALLABI": "disablepreserveallabi"
|
|
},
|
|
"Desc": [
|
|
"Allows controlling of the CPU features in the JIT.",
|
|
"\toff: Default CPU features queried from CPU features",
|
|
"\t{enable,disable}sve: Will force enable or disable sve even if the host doesn't support it",
|
|
"\t{enable,disable}avx: Will force enable or disable avx even if the host doesn't support it",
|
|
"\t{enable,disable}afp: Will force enable or disable afp even if the host doesn't support it",
|
|
"\t{enable,disable}lrcpc: Will force enable or disable lrcpc even if the host doesn't support it",
|
|
"\t{enable,disable}lrcpc2: Will force enable or disable lrcpc2 even if the host doesn't support it",
|
|
"\t{enable,disable}cssc: Will force enable or disable cssc even if the host doesn't support it",
|
|
"\t{enable,disable}pmull128: Will force enable or disable pmull128 even if the host doesn't support it",
|
|
"\t{enable,disable}rng: Will force enable or disable rng even if the host doesn't support it",
|
|
"\t{enable,disable}clzero: Will force enable or disable clzero even if the host doesn't support it",
|
|
"\t{enable,disable}atomics: Will force enable or disable ARMv8.1 LSE atomics even if the host doesn't support it",
|
|
"\t{enable,disable}fcma: Will force enable or disable fcma even if the host doesn't support it",
|
|
"\t{enable,disable}flagm: Will force enable or disable flagm even if the host doesn't support it",
|
|
"\t{enable,disable}flagm2: Will force enable or disable flagm2 even if the host doesn't support it",
|
|
"\t{enable,disable}crypto: Will force enable or disable crypto extensions even if the host doesn't support it",
|
|
"\t{enable,disable}rpres: Will force enable or disable rpres even if the host doesn't support it",
|
|
"\t{enable,disable}svebitperm: Will force enable or disable svebitperm even if the host doesn't support it",
|
|
"\t{enable,disable}preserveallabi: Will force enable or disable preserve_all abi even if the host doesn't support it"
|
|
]
|
|
},
|
|
"CPUID": {
|
|
"Type": "strenum",
|
|
"Default": "FEXCore::Config::CPUID::OFF",
|
|
"Enums": {
|
|
"ENABLESHA": "enablesha",
|
|
"DISABLESHA": "disablesha"
|
|
},
|
|
"Desc": [
|
|
"Allows controlling of the CPU features are exposed in CPUID.",
|
|
"\toff: Default CPU features queried from CPU features",
|
|
"\t{enable,disable}sha: Will force enable or disable sha even if the host doesn't support it"
|
|
]
|
|
},
|
|
"SmallTSCScale": {
|
|
"Type": "bool",
|
|
"Default": "true",
|
|
"Desc": [
|
|
"Scales the cycle counter on systems that have low frequencies."
|
|
]
|
|
}
|
|
},
|
|
"Emulation": {
|
|
"RootFS": {
|
|
"Type": "str",
|
|
"Default": "",
|
|
"ShortArg": "R",
|
|
"Desc": [
|
|
"Which Root filesystem prefix to use",
|
|
"This can be a filesystem path",
|
|
"\teg: ~/RootFS/Debian_x86_64",
|
|
"Or this can be a name of a rootfs",
|
|
"If the named rootfs exists in the FEX data folder then it will use that one",
|
|
"\teg: $HOME/.fex-emu/RootFS/<RootFS name>/",
|
|
"Or if you have XDG_DATA_HOME the config will search in that directory",
|
|
"\teg: $XDG_DATA_HOME/.fex-emu/RootFS/<RootFS name>/"
|
|
]
|
|
},
|
|
"ThunkHostLibs": {
|
|
"Type": "str",
|
|
"Default": "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/fex-emu/HostThunks/",
|
|
"ShortArg": "t",
|
|
"Desc": [
|
|
"Folder to find the host-side thunking libraries."
|
|
]
|
|
},
|
|
"ThunkGuestLibs": {
|
|
"Type": "str",
|
|
"Default": "@CMAKE_INSTALL_PREFIX@/share/fex-emu/GuestThunks/",
|
|
"ShortArg": "j",
|
|
"Desc": [
|
|
"Folder to find the guest-side thunking libraries."
|
|
]
|
|
},
|
|
"ThunkHostLibs32": {
|
|
"Type": "str",
|
|
"Default": "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/fex-emu/HostThunks_32/",
|
|
"Desc": [
|
|
"Folder to find the 32-bit host-side thunking libraries."
|
|
]
|
|
},
|
|
"ThunkGuestLibs32": {
|
|
"Type": "str",
|
|
"Default": "@CMAKE_INSTALL_PREFIX@/share/fex-emu/GuestThunks_32/",
|
|
"Desc": [
|
|
"Folder to find the 32-bit guest-side thunking libraries."
|
|
]
|
|
},
|
|
"ThunkConfig": {
|
|
"Type": "str",
|
|
"Default": "",
|
|
"ShortArg": "k",
|
|
"Desc": [
|
|
"A json file specifying where to overlay the thunks.",
|
|
"This can be a filesystem path",
|
|
"\teg: ~/MyThunkConfig.json",
|
|
"Or this can be a named of a Thunk config file",
|
|
"If the named config file exists in the FEX data folder folder the it will use that one",
|
|
"\teg: $HOME/.fex-emu/ThunkConfigs/<ThunkConfig name>",
|
|
"Or if you have XDG_DATA_HOME the config will search in that directory",
|
|
"\teg: $XDG_DATA_HOME/.fex-emu/ThunkConfigs/<ThunkConfig name>"
|
|
]
|
|
},
|
|
"Env": {
|
|
"Type": "strarray",
|
|
"Default": "",
|
|
"ShortArg": "E",
|
|
"Desc": [
|
|
"Adds an environment variable to the emulated environment."
|
|
]
|
|
},
|
|
"HostEnv": {
|
|
"Type": "strarray",
|
|
"Default": "",
|
|
"ShortArg": "H",
|
|
"Desc": [
|
|
"Adds an environment variable to the host environment.",
|
|
"This can be useful for setting environment variables that thunks can pick up.",
|
|
"Typically isn't necessary since the guest libc isn't thunked. But is possible."
|
|
]
|
|
},
|
|
"AdditionalArguments": {
|
|
"Type": "strarray",
|
|
"Default": "",
|
|
"Desc": [
|
|
"Allows the user to pass additional arguments to the application"
|
|
]
|
|
}
|
|
},
|
|
"Debug": {
|
|
"SingleStep": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"ShortArg": "S",
|
|
"Desc": [
|
|
"Single stepping configuration."
|
|
]
|
|
},
|
|
"GdbServer": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"ShortArg": "G",
|
|
"Desc": [
|
|
"Enables the GDB server."
|
|
]
|
|
},
|
|
"DumpIR": {
|
|
"Type": "str",
|
|
"Default": "no",
|
|
"Desc": [
|
|
"Folder to dump the IR in to.",
|
|
"[no, stdout, stderr, server, <Folder>]"
|
|
]
|
|
},
|
|
"PassManagerDumpIR": {
|
|
"Type": "strenum",
|
|
"Default": "FEXCore::Config::PassManagerDumpIR::OFF",
|
|
"Enums": {
|
|
"BEFOREOPT": "beforeopt",
|
|
"AFTEROPT": "afteropt",
|
|
"BEFOREPASS": "beforepass",
|
|
"AFTERPASS": "afterpass"
|
|
},
|
|
"Desc": [
|
|
"Allows controlling when FEX dumps its IR.",
|
|
"\toff: IR dumping will be disabled",
|
|
"\tbeforeopt: Dump IR before any optimizations",
|
|
"\tafteropt: Dump IR after all optimizations",
|
|
"\tbeforepass: Dump IR before every optimization pass",
|
|
"\tafterpass: Dump IR after every optimization pass"
|
|
]
|
|
},
|
|
"DumpGPRs": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"ShortArg": "g",
|
|
"Desc": [
|
|
"When the test harness ends, print the GPR state."
|
|
]
|
|
},
|
|
"O0": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"ShortArg": "O0",
|
|
"Desc": [
|
|
"Disables optimizations passes for debugging."
|
|
]
|
|
},
|
|
"GlobalJITNaming": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Uses JITSymbols to name all JIT state as one symbol",
|
|
"Useful for querying how much time is spent inside of the JIT",
|
|
"Profiling tools will show JIT time as FEXJIT"
|
|
]
|
|
},
|
|
"LibraryJITNaming": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Uses JITSymbols to name JIT symbols grouped by library",
|
|
"Useful for querying how much time is spent in each guest library",
|
|
"Can be used to help guide thunk generation"
|
|
]
|
|
},
|
|
"BlockJITNaming": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Uses JITSymbols to name JIT symbols",
|
|
"Useful for determining hot blocks of code",
|
|
"Has some file writing overhead per JIT block"
|
|
]
|
|
},
|
|
"GDBSymbols": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Integrates with GDB using the JIT interface.",
|
|
"Needs the fex jit loader in GDB, which can be loaded via `jit-reader-load libFEXGDBReader.so.`",
|
|
"Also needs x86_64-linux-gnu-objdump in PATH.",
|
|
"Can be very slow."
|
|
]
|
|
},
|
|
"InjectLibSegFault": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Sets the environment variable LD_PRELOAD=libSegFault.so",
|
|
"This allows the user to very easily enable libSegFault without dealing with environment variables",
|
|
"Very useful for applications that have launch scripts that set the variable to nothing at launch",
|
|
"Set this in an application configuration for injecting in to only specific applications.",
|
|
"\tNote: If x86/x86_64 libSegFault.so isn't installed then this option won't work."
|
|
]
|
|
},
|
|
"Disassemble": {
|
|
"Type": "strenum",
|
|
"Default": "FEXCore::Config::Disassemble::OFF",
|
|
"Enums": {
|
|
"DISPATCHER": "dispatcher",
|
|
"BLOCKS": "blocks",
|
|
"STATS": "stats"
|
|
},
|
|
"Desc": [
|
|
"Allows controlling of the vixl disassembler.",
|
|
"\toff: No disassembly will be output",
|
|
"\tdispatcher: Will enable disassembly of the JIT dispatcher loop",
|
|
"\tblocks: Will enable disassembly of the translated instruction code blocks",
|
|
"\tstats: Will print stats when disassembling the code"
|
|
]
|
|
},
|
|
"ForceSVEWidth": {
|
|
"Type": "uint32",
|
|
"Default": "0",
|
|
"Desc": [
|
|
"Allows overriding the SVE width in the vixl simulator.",
|
|
"Useful as a debugging feature."
|
|
]
|
|
},
|
|
"DisableTelemetry": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Disables telemetry at runtime.",
|
|
"Useful for CI instcountCI mostly"
|
|
]
|
|
}
|
|
},
|
|
"Logging": {
|
|
"SilentLog": {
|
|
"Type": "bool",
|
|
"Default": "true",
|
|
"ShortArg": "s",
|
|
"Desc": [
|
|
"Disables logging"
|
|
]
|
|
},
|
|
"OutputLog": {
|
|
"Type": "str",
|
|
"Default": "server",
|
|
"ShortArg": "o",
|
|
"Desc": [
|
|
"File to write FEX output to.",
|
|
"[stdout, stderr, server, <Filename>]"
|
|
]
|
|
},
|
|
"TelemetryDirectory": {
|
|
"Type": "str",
|
|
"Default": "",
|
|
"Desc": [
|
|
"Redirects the telemetry folder that FEX usually writes to.",
|
|
"By default telemetry data is stored in {$FEX_APP_DATA_LOCATION,{$XDG_DATA_HOME,$HOME}/.fex-emu/Telemetry/}"
|
|
]
|
|
}
|
|
},
|
|
"Hacks": {
|
|
"SMCChecks": {
|
|
"Type": "uint8",
|
|
"Default": "FEXCore::Config::CONFIG_SMC_MTRACK",
|
|
"TextDefault": "mtrack",
|
|
"ArgumentHandler": "SMCCheckHandler",
|
|
"Desc": [
|
|
"Checks code for modification before execution.",
|
|
"\tnone: No checks",
|
|
"\tmtrack: Page tracking based invalidation (default)",
|
|
"\tfull: Validate code before every run (slow)"
|
|
]
|
|
},
|
|
"TSOEnabled": {
|
|
"Type": "bool",
|
|
"Default": "true",
|
|
"Desc": [
|
|
"Controls TSO IR ops.",
|
|
"Highly likely to break any multithreaded application if disabled."
|
|
]
|
|
},
|
|
"VectorTSOEnabled": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"When TSO emulation is enabled, controls if vector loadstores should also be atomic."
|
|
]
|
|
},
|
|
"MemcpySetTSOEnabled": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"When TSO emulation is enabled, controls if memcpy and memset should also be atomic.",
|
|
"Only affects REP MOVS and REP STOS instructions"
|
|
]
|
|
},
|
|
"HalfBarrierTSOEnabled": {
|
|
"Type": "bool",
|
|
"Default": "true",
|
|
"Desc": [
|
|
"When TSO emulation is enabled, controls if unaligned loads and stores should be backpatched to half-barrier atomics.",
|
|
"Can be dangerous due to aligned loadstores through the same code now become non-atomic."
|
|
]
|
|
},
|
|
"StrictInProcessSplitLocks": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Strict global lock when handling an unaligned atomic that crosses a 16-byte or cacheline granularity",
|
|
"This is required to ensure a split-lock doesn't tear inside the process"
|
|
]
|
|
},
|
|
"TSOAutoMigration": {
|
|
"Type": "bool",
|
|
"Default": "true",
|
|
"Desc": [
|
|
"Automatically enables TSO when shared memory is used.",
|
|
"Should work without issues in most cases."
|
|
]
|
|
},
|
|
"X87ReducedPrecision": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Emulates X87 floating point using 64-bit precision. This reduces emulation accuracy and may result in rendering bugs."
|
|
]
|
|
},
|
|
"ABILocalFlags": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"When enabled enables an optimization around flags.",
|
|
"Assumes flags are not used across cals.",
|
|
"Hand-written assembly can violate this assumption."
|
|
]
|
|
},
|
|
"ParanoidTSO": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Makes TSO operations even more strict.",
|
|
"Forces vector loadstores to also become atomic."
|
|
]
|
|
},
|
|
"StallProcess": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Forces a process to stall out on initialization",
|
|
"Useful for a process that keeps restarting and doesn't work"
|
|
]
|
|
},
|
|
"HideHypervisorBit": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Hides the hypervisor CPUID bit when set.",
|
|
"Should only be used for applications that have issues with this set."
|
|
]
|
|
},
|
|
"StartupSleep": {
|
|
"Type": "uint32",
|
|
"Default": "0",
|
|
"Desc": [
|
|
"Sleeps the process at startup for a duration of seconds.",
|
|
"Useful if an application crashes too quickly to attach a debugger."
|
|
]
|
|
}
|
|
},
|
|
"Misc": {
|
|
"AOTIRCapture": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Captures IR and generates an AOT IR cache.",
|
|
"Captures both the loaded executable and libraries it loads."
|
|
]
|
|
},
|
|
"AOTIRGenerate": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Scans file for executable code and generates an AOT IR cache.",
|
|
"Does not run the executable."
|
|
]
|
|
},
|
|
"AOTIRLoad": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Loads an AOT IR cache for the loaded executable."
|
|
]
|
|
},
|
|
"ServerSocketPath": {
|
|
"Type": "str",
|
|
"Default": "",
|
|
"Desc": [
|
|
"Override for a FEXServer socket path. Only useful for chroots."
|
|
]
|
|
},
|
|
"NeedsSeccomp": {
|
|
"Type": "bool",
|
|
"Default": "false",
|
|
"Desc": [
|
|
"Disables inline syscalls in order to support seccomp handling"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"UnnamedOptions": {
|
|
"Misc": {
|
|
"IS_INTERPRETER": {
|
|
"Type": "bool",
|
|
"Default": "false"
|
|
},
|
|
"INTERPRETER_INSTALLED": {
|
|
"Type": "bool",
|
|
"Default": "false"
|
|
},
|
|
"APP_FILENAME": {
|
|
"Type": "str",
|
|
"Default": ""
|
|
},
|
|
"APP_CONFIG_NAME": {
|
|
"Type": "str",
|
|
"Default": "",
|
|
"Desc": [
|
|
"This is the application config name that has been loaded.",
|
|
"This differs from APP_FILENAME in two ways",
|
|
"Where APP_FILENAME always points to the executable path that FEX-Emu is executing.",
|
|
"This matches what is used to load the AppLayer configuration name.",
|
|
"When running through a compatibility layer like wine, this will only be the exe name, instead of wine full path."
|
|
]
|
|
},
|
|
"IS64BIT_MODE": {
|
|
"Type": "bool",
|
|
"Default": "false"
|
|
},
|
|
"DISABLE_VIXL_INDIRECT_RUNTIME_CALLS": {
|
|
"Type": "bool",
|
|
"Default": "true",
|
|
"Desc": [
|
|
"This option is used for the InstructionCountCI so it can generate the same codegen between Arm64 hosts and vixl simulator hosts.",
|
|
"Vixl simulator indirect runtime calls are a special hlt instruction with metadata after it. Effectively making a custom call instruction.",
|
|
"With visual simulator calls disabled, the code generation would be the same as on a native Arm64 host, but running the code is broken."
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|