[PATCH] winebuild: Clear RFLAGS before entering syscall.

Rémi Bernon rbernon at codeweavers.com
Wed Jun 2 15:10:32 CDT 2021


On 6/2/21 10:00 PM, Rémi Bernon wrote:
> On 6/2/21 5:45 PM, Rémi Bernon wrote:
>> On 6/2/21 5:35 PM, Jacek Caban wrote:
>>> Hi Rémi,
>>>
>>> On 6/1/21 10:43 AM, Rémi Bernon wrote:
>>>> We pushed the flags, but kept them set. Far Cry sets NT flags, which
>>>> causes later iretd instruction to raise a GP fault exception.
>>>>
>>>> This fixes a regression from e341d1f695311725752c287057f6c6ab60fdf2a3.
>>>
>>>
>>> iret is responsible for a fair chunk of syscall dispatcher overhead. 
>>> I plan to submit patches optimizing syscall dispatcher to not do iret 
>>> in the usual code path and use signal_restore_full_cpu_context if 
>>> context was modified during the syscall. I don't have 32-bit version 
>>> implemented yet, but the idea would be the same. I think those 
>>> optimization should fix the regression without adjusting flags on 
>>> each syscall. signal_restore_full_cpu_context would still have the 
>>> same problem, but maybe then we could do flags adjustment only there? 
>>> Or are there other reasons to do the adjustment (in which case I 
>>> would need to take that into account in my patches as well)?
>>>
>>>
>>> Thanks,
>>>
>>> Jacek
>>>
>>
>> I don't know for sure but if some other code inside the syscall does 
>> iretd with the NT flag still being set, it may cause a crash again.
>>
>> This was actually an issue a long time ago as [1] suggest, and it's 
>> been fixed in the Linux kernel [2]. As the Linux kernel now clears the 
>> flags on syscall entry it doesn't seem completely crazy to clear it on 
>> NT syscall entry (although probably not useful if you intend to 
>> replace the iretd).
>>
>> [1] https://bugs.winehq.org/show_bug.cgi?id=33275
>> [2] https://lkml.org/lkml/2014/10/27/825
> 
> Also FWIW, on my desktop (with a simple NtQPC benchmark, with perf 
> sampling) I don't see any overhead caused by iret, most of the syscall 
> overhead comes from xsavec64 / xrstor64. It may be hardware dependent.

Nevermind, I can see it (although FPU state still is much bigger).
-- 
Rémi Bernon <rbernon at codeweavers.com>



More information about the wine-devel mailing list