On Wed, Sep 2, 2015 at 2:01 PM, Stas Sergeev <stsp@xxxxxxx> wrote:Yes.
02.09.2015 22:06, Andy Lutomirski ÐÐÑÐÑ:So you're modifying sigcontext such that it returns to a C function
On Wed, Sep 2, 2015 at 11:23 AM, Stas Sergeev <stsp@xxxxxxx> wrote:dosemu needs 2 return pathes:
02.09.2015 21:17, Andy Lutomirski ÐÐÑÐÑ:What's the exact siglongjmp usage you have in mind? Signal context
On Wed, Sep 2, 2015 at 10:46 AM, Stas Sergeev <stsp@xxxxxxx> wrote:Could you please clarify?
02.09.2015 17:21, Andy Lutomirski ÐÐÑÐÑ:This seems like it would be relying unpleasantly heavily on libc
I am not saying siglongjmp() will be affected.What's the issue here? I don't understand.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.
- No new SA flag
- May improve debugability in some unknown scenario where people
do not want to just use the new flag to get their things improved
Cons:
- Does not allow to cleanly use siglongjmp(), as then there is a risk
to jump to 64bit code with bad SS
On musl, (sig)longjmp just restores rsp, rbx, rbp, and r12-r15, so it
won't be affected. AFAIK all implementations of siglongjmp are likely
to call sigprocmask or similar, and that will clobber SS. I'm not
aware of an implementation of siglongjmp that uses sigreturn.
Quite the opposite: it won't, which is bad. :)
If you have always correct SS, you can use siglongjmp(). If you have
broken SS at times, siglongjmp() will be an asking for troubles, as
it exactly does not restore SS.
dosemu could do a good use of siglongjmp() to get back to 64bit code
from its sighandler.
internals.
If kernel always passes the right SS to the sighandler, then what's
the problem?
isn't normally involved AFAIK.
1. to DOS code
2. to 64bit code (dosemu is not all in a sighandler, right?)
How it is currently achieved:
dosemu1:
1. sigreturn() + iret (to DOS)
2. modify sigcontext -> sigreturn() (to 64bit asm helper)
dosemu2:
1. sigreturn() + iret (to DOS)
2. modify sigcontext -> sigreturn() -> longjmp() (to 64bit C-coded)
that calls longjmp?
1 - not.How dosemu2 is supposed to do this:This should work fine on any kernel, right?
1. sigreturn() (to DOS)
2. siglongjmp() (to 64bit C-coded)
The main problem will beIts fine if you always save SS to sigcontext.
that you presumably need to remember the old context so you can go
back to DOS, I assume. So SS needs to be there somewhere.
This case is covered if we do both things together: useFor backwards compat, we either need the default behavior to be... add the SA_hyz flag.For 64-bit delivery, ignoring backwards compatibility, deliveringI am much more bothered with delivering the right SS than withThat could work. The result is quite similar to explicitly settingSurely, but how about then having the heuristics you suggest,Is the new SA flag such a big deal here to even bother?Not really, but given that the new behavior seems clearly better
behaved than the old, it would be nice to be able to have the good
behavior, or at least most of it, be the default.
only if the new SA_hyz is not set? And when it is set, have a
properly defined and predictable behaviour. Then it seems like
we'll get all the possible wishes covered.
UC_STRICT_RESTORE_SS.
restoring it on sigreturn().
signals with ss = __USER_DS would be the right solution, I think: it's
trivial and it works. Because of backwards compatibility, we need to
I don't understand why do you constantly ignore that part as
if it was never spelled. Lets discuss the proposal as a whole, rather
than with the random bits thrown away. The flag is exactly for
backward compatibility, so why do you present it as a problem
without the context of the new flag?
unchanged, or we need the default behavior to be something that works
with existing dosemu. For existing dosemu, the only interesting cases
(I think) are signal delivery from *valid* 16-bit context, in which
case we need to preserve SS so that the signal handler can read it out
with mov ..., %ss, and sigreturn to 64-bit mode for the IRET
trampoline. For sigreturn, IIUC old dosemu will replace the saved CS
with a 64-bit code segment selector and won't touch the saved SS
because it doesn't know about the saved SS. Those dosemu versions
don't care what SS actually contains after sigreturn, because they're
immediately going to change it again using IRET. So we just need to
make sure we return without faulting.
New dosemu2 would like to sigreturn directly back to 16-bit mode, so
it needs the kernel to honor the saved ss value and restore it,
possibly changed by dosemu.
We obviously can't require old dosemu to set an SA flag to keep
working. But, if we can get away with it, I think it's somewhat
preferable not to require new DOSEMU to set an SA flag either.
This has one major benefit at least: if new dosemu loads some random
library that installs some async signal handler (SIGALRM for example),
everything will work with regard to CS and SS.