On Wed, Aug 12, 2015 at 11:55 AM, Stas Sergeev <stsp@xxxxxxx> wrote::)
12.08.2015 21:25, Andy Lutomirski ÐÐÑÐÑ:I apologize on behalf of the upstream kernel in 2007. :-/ I wasn't
Like this?Going back in time? Ask the kernel to fix the issue.What else it could do? :(So the problem is that dosemu was actually hacking around the old
https://github.com/stsp/dosemu2/commit/7898ac60d5e569964127d6cc48f592caecd20b81
buggy behavior and thus relying on it. Grr.
http://www.x86-64.org/pipermail/discuss/2007-May/009913.html
And this:
http://www.x86-64.org/pipermail/discuss/2007-May/009923.html
really involved at that point.
Unlikely.I agree. So does x32.But the delivery can be easily checked with "if (ss & 4)".I still don't see how sigreturn matters here. It's signal *delivery*Let me see if I can come up with a clean kernel fix.The check for proper sigreturn would be good.
that's the problem.
What remains is just a sigreturn instead of iret.
I'm thinking of having signal delivery zap ss only if the old ss looksI am not sure how good is this.
bogus instead of zapping it unconditionally. IOW, instead of setting
regs->ss = __USER_DS unconditionally, we'd do larl on the old regs->ss
and keep it if it's DPL 3 RW data (exp-down or otherwise) and present.
Yes, may help for a backward-compatibility.
But OTOH the 32bit kernel saves _all_ registers, including
ss, which is IMHO the right thing to do in general.
Are you planning on merging your patches into upstream DOSEMU?
The crash - see the gcc ticket in the prev e-mail.We might need to do that.I'll have to check the precise rules in both the SDM and APM. TheWell, this is a "very basic" idea, so to say.
idea is that we don't want IRET to fail during signal delivery, which
can happen due to a bad sigreturn or a race against modify_ldt.
The fact that segregs are not restored, have much more
consequences, and since now you already broke things,
I wonder if something can be finally fixed for good...
What alternatives do we have? Can we do something
really brave, introduce a new sigaction flag perhaps, that
will just restore all segregs for new apps, and none - for
old apps? I mean the above gcc bugzilla ticket in particular -
very annoying one...
Here's a nasty case:
void sighandler(...) {
switch_userspace_thread();
}
Suppose that switch_userspace_thread() changes fs. Now what? On
current kernels, it stays switched. If we change this, it won't stayThere can be the following cases:
switched. Even ignoring old ABI, it's not really clear to me what the
right thing to do is.