On Sat, Mar 24, 2018 at 11:13:40AM -0700, Michael Clark wrote: > This change is a workaround for a bug where mstatus.FS > is not correctly reporting dirty when MTTCG and SMP are > enabled which results in the floating point register file > not being saved during context switches. This a critical > bug for RISC-V in QEMU as it results in floating point > register file corruption when running SMP Linux in the > RISC-V 'virt' machine. > > This workaround will return dirty if mstatus.FS is > switched from off to initial or clean. We have checked > the specification and it is legal for an implementation > to return either off, or dirty, if set to initial or clean. > > This workaround will result in unnecessary floating point > save restore. When mstatus.FS is off, floating point > instruction trap to indicate the process is using the FPU. > The OS can then save floating-point state of the previous > process using the FPU and set mstatus.FS to initial or > clean. With this workaround, mstatus.FS will always return > dirty if set to a non-zero value, indicating floating point > save restore is necessary, versus misreporting mstatus.FS > resulting in floating point register file corruption. > > Cc: Palmer Dabbelt <pal...@sifive.com> > Cc: Sagar Karandikar <sag...@eecs.berkeley.edu> > Cc: Bastian Koppelmann <kbast...@mail.uni-paderborn.de> > Cc: Richard W.M. Jones <rjo...@redhat.com> > Cc: Peter Maydell <peter.mayd...@linaro.org> > Signed-off-by: Michael Clark <m...@sifive.com>
I tested this by running qemu from git with and without this patch, both times compiling and running the “sched.c” test program: http://oirase.annexia.org/tmp/sched.c In my tests it fixes the problem, and therefore: Tested-by: Richard W.M. Jones <rjo...@redhat.com> Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into KVM guests. http://libguestfs.org/virt-v2v