From: Bodo Stroesser <bstroesser@fujitsu-siemens.com>
To: Jeff Dike <jdike@addtoit.com>
Cc: user-mode-linux-devel@lists.sourceforge.net, Carl <lists@outervoid.net>
Subject: Re: [uml-devel] Memory corruption/errors?
Date: Wed, 22 Dec 2004 23:04:23 +0100 [thread overview]
Message-ID: <41C9EF67.1030407@fujitsu-siemens.com> (raw)
In-Reply-To: <63806.222.152.52.159.1103583370.squirrel@222.152.52.159>
Carl wrote:
> Hi,
>
> Running the piece of code from the URL below is generating errors on
> various UML kernels:
>
> http://downloads.rimuhosting.com/memtest.c
>
> Kernels tested are: 2.4.27, 2.4.27-bs1, 2.6.9-bb4.
>
> Different UML host servers have been tried too, and only UMLs running on
> SMP (dual Xeon) servers seem to have the problem (P4s with HT are fine).
>
> Can anyone else reproduce the errors? Any ideas?
>
> Thanks, Carl
After having found a bug in SKAS-signal-handling, I modified memtest.c to
trigger that bug (attached: memtest2.c). This probably is the same problem,
Carl saw. If so, Carl's problem shouldn't happen in TT-mode.
That's the problem:
In SKAS userspace(), when the kernel is entered, all regs including fpregs
are saved by save_registers() to skas_regs and restored on exit by
restore_registers() from skas_regs.
If an signal handler has to be started, the original fpstate is saved in the
sigcontext and must be restored, when sys_sigreturn is called.
When the kernel is entered for sys_sigreturn on return from the signal handler,
the fpregs again are saved with save_registers(). Thus skas_regs hold the
fpstate from the end of the signal handler.
Now copy_sc_from_user_skas() tries to restore the original state. But the
fpstate from the sigcontext isn't written to skas_regs, but directly to the
fp-registers of the userspace process with set_fpregs().
When exit from kernel is done after that, restore_registers() overwrites
the fp-registers of the userspace-process with the fpstate from skas_regs,
which is the wrong one that comes from the signal handler!
There is another problem in UML-signal-handling, that makes the problem very
hard to reproduce:
Normally, on sighandler-entry, the fpu-registers should be cleared. But UML
doesn't clear the fpu. So, the original values in the fpu-registers stay
alive, if the signal-handler doesn't push to many new values. In most
cases, even if the sighandler uses the fpu, only the compare-result-flags
have changed after return from sighandler. If fp-values have to be compared,
AFAICS an fp-compare-instruction is used, followed immediately by a move
of the compare-result-flags to the ax-register. So, only a sighandler
hitting exactly between those two instructions, will hurt in most cases!
Solution:
I started to do a patch, but stopped, since it will need a big patch to
make this area clean (and I will be offline for about 2 weeks ...):
1) In SKAS, copy_sc_from_user_skas() should build the _fpstate in
sigcontext from skas_regs, not from new values read in by get_fpregs().
The current code even lacks writing i387_fsave_struct.status containing
the magic which flags the _fpstate format.
The "format" of the written _fpstate should depend on
have_fpx_regs. This means, convert_fxsr_to_user_tt() should be
modified and made generally available to help cover the case of
(have_fpx_regs == 1), where skas_regs don't contain fsave, but
fxsave only.
2) When having created a sigcontext, UML should clear the fpregs in
skas_regs resp. tt_regs.sc->_fpstate, to make the sighandler see
a cleared fpu.
3) copy_sc_from_user_skas() should copy the _fpstate from sigcontext
to skas_regs. To handle the different formats of the _fpstate,
convert_fxsr_from_user_tt() should be modified and made available.
copy_sc_from_user_skas() should check sigcontext->_fpstate. If
this is NULL, skas_regs.fp/fpx should be cleared. (SKAS doesn't
write that NULL, but on the host or in TT, the kernel sometimes
writes it. So, I would like to have SKAS tolerate a NULL here
instead of segfaulting).
4) set_fpregs, get_fpregs, set_fpxregs, get_fpxregs currently support
TT-mode only. set_fpxregs and get_fpxregs should return -EIO, if
(!have_fpx_regs). Therefore, the check for availability of
PTRACE_GET_FPXREGS should be done in SKAS and TT, and have_fpx_regs
should be available in both modes.
5) get_fpregs in TT mode simply should copy the first (fp-reg) part of
tt_regs.sc->fpstatus to user without converting. This part of fpstate
always is written correctly by the host kernel. Also set_fpregs has to
copy that part from user. If (have_fpx_regs == 1) the fpx-parts of
fpstatus should be reconstructed from that, to have them available for
the next possible get_fpxregs.
6) get_fpxregs and set_fpxregs in TT for (have_fpx_regs == 1) may work
immediately with the fpx-part of tt_regs.sc->fpstatus, but set_fpxregs
also has to write the fp-part accordingly.
7) get_fpregs, set_fpregs, get_fpxregs and set_fpxregs should support SKAS.
This could be done by simply ripping code or method from i386.
SKAS holds the data needed in skas_regs.fp or skas_regs.fpx
I hope, this helps a bit. Sorry for not having the time to do the patch
by myself.
Bodo
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://productguide.itmanagersjournal.com/
_______________________________________________
User-mode-linux-devel mailing list
User-mode-linux-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
next prev parent reply other threads:[~2004-12-22 22:04 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-12-20 22:56 [uml-devel] Memory corruption/errors? Carl
2004-12-22 12:09 ` Bodo Stroesser
2004-12-22 19:58 ` Peter
2004-12-22 21:33 ` Bodo Stroesser
2004-12-22 23:04 ` Peter
2004-12-22 23:15 ` Bodo Stroesser
2004-12-22 22:04 ` Bodo Stroesser [this message]
2004-12-22 22:07 ` Bodo Stroesser
-- strict thread matches above, loose matches on Subject: below --
2004-12-23 13:26 [Fwd: Re: [uml-devel] Memory corruption/errors?] Bodo Stroesser
2004-12-24 2:32 ` Peter
2005-01-10 4:21 ` [uml-devel] Memory corruption/errors? peter
2005-01-10 10:10 ` Bodo Stroesser
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=41C9EF67.1030407@fujitsu-siemens.com \
--to=bstroesser@fujitsu-siemens.com \
--cc=jdike@addtoit.com \
--cc=lists@outervoid.net \
--cc=user-mode-linux-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox