Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support inline self modifying code #4165

Merged
merged 6 commits into from
Dec 12, 2024
Merged

Conversation

bylaws
Copy link
Collaborator

@bylaws bylaws commented Nov 18, 2024

When an SMC trap happens: reconstruct the context before the SMC write then compile the write as a single instruction block to reduce it to regular SMC. SMC where the writing instruction is the instruction being patched will hit the signal handler at most twice: the 1st will trigger the write to be compiled as a single instuction block, the 2nd will detect inline SMC of a single instruction block and then just take the usual invalidate+reprotect+continue step, avoiding a potential infinite loop of recompilation.

Ontop of TF support

@neobrain
Copy link
Member

Ontop of TF support

For reference, this is referring to #4161.

@bylaws bylaws force-pushed the denuvo branch 3 times, most recently from a4f686b to 8901dba Compare December 10, 2024 15:29
@bylaws bylaws marked this pull request as ready for review December 10, 2024 22:44
@Sonicadvance1
Copy link
Member

Needs a rebase.

Frontends need to detect this in order to handle SMC within the current
block (inline SMC) differently to regular SMC which can just reprotect
and continue.
guest instruction

Single instruction blocks need to be treated specially when inline SMC
is detected, the frontend only needs to reprotect RWX and invalidate
caches then continue execution as side effects from the SMC shouldn't be
seen until the instruction executes.
When an SMC trap happens: reconstruct the context before the SMC write
then compile the write as a single instruction block to reduce it to
regular SMC. SMC where the writing instruction is the instruction being
patched will hit the signal handler at most twice: the 1st will trigger
the write to be compiled as a single instuction block, the 2nd will
detect inline SMC of a single instruction block and then just take the
usual invalidate+reprotect+continue step, avoiding a potential infinite
loop of recompilation.
This is used to notify the JIT of e.g. memory writes by a debugger.
@Sonicadvance1 Sonicadvance1 merged commit 656477e into FEX-Emu:main Dec 12, 2024
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants