Kernel/x86: Properly restore rflags in the syscall handler #24888
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The sysret instruction restores the rflags value from the r11 register. Before, we expected that the value in RegisterState::r11 is still the rflags value saved by syscall and therefore didn't copy RegisterState::rflags to r11 before the sysret.
But signal handlers and ptrace can change the value in RegisterState::r11 while we are handling a syscall, so we shouldn't assume that it still contains the saved rflags.
While handling a syscall the contents of RegisterState::rflags may also have been updated by e.g. ptrace in which case we should restore the updated rflags, not the original state on syscall entry.