On Wed, Aug 19, 2015 at 9:30 AM, Stas Sergeev <stsp@xxxxxxx> wrote:But this is not a new proposal, see here:
19.08.2015 18:46, Andy Lutomirski ÐÐÑÐÑ:Let me throw out one more possibility, just for completeness:
On Wed, Aug 19, 2015 at 2:35 AM, Stas Sergeev <stsp@xxxxxxx> wrote:Either that, or employ the lar heuristic for the "not set" case
Hmm, interesting. Maybe that would work for everything. How's thisIncidentally, I tried implementing the sigaction flag approach. IHow about the SA_hyz flag that does the following:
think it's no good. When we return from a signal, there's no concept
of sigaction -- it's just sigreturn. Sigreturn can't look up the
sigaction flags -- what if the signal handler calls sigaction itself.
- Saves SS into sigcontext
- Forces SS to USER_DS on signal delivery
- Sets the uc_flags flag for sigreturn() to take care of the rest.
You'll have both the control on every bit of action, and a simple
detection logic: if SA_hyz didn't set the uc flag - it didn't work.
You can even employ your lar heuristic here for the case when the
aforementioned SA_hyz is not set. But please, please not when it is
set! In fact, I wonder if you had in mind exactly that: using the
lar heuristic only if the SA_hyz is not set. If so - I misunderstood.
Just please don't add it when it is set.
to make it concrete?
Add a sigaction flag SA_RESTORE_SS.
On signal delivery, always save SS into sigcontext->ss. if
SA_RESTORE_SS is set, then unconditionally switch HW SS to __USER_DS
and set UC_RESTORE_SS. If SA_RESTORE_SS is clear, then leave HW SS
alone (i.e. preserve the old behavior).
(I think its not needed).
On signal return, if UC_RESTORE_SS is set, then restoreAgreed.
sigcontext->ss. If not, then set SS to __USER_DS (as old kernels
did).
This should change nothing at all (except the initial value of
sigcontext->ss / __pad0) on old kernels.
We don't add any SA_xyz flags. On signal delivery, we use the LAR
heuristic. We always fill in sigcontext->ss, and we set a new
UC_SIGCONTEXT_SS flag to indicate that we support the new behavior.
On sigreturn, we honor the sigcontext's ss, *unless* CS is 64 bit and
SS is invalid. In the latter case, we replace the saved ss with
__USER_DS.
This should work for old DOSEMU. It's a bit gross, but it has thePros:
nice benefit that everyone (even things that aren't DOSEMU) gain the
ability to catch signals thrown from bogus SS contexts, which probably
improves debugability. It's also nice to not have the SA flag.