qemu/linux-user
Peter Maydell 246ff44295 linux-user/sparc: Correct sparc64_get/set_context() FPU handling
The handling of the FPU state in sparc64_get_context() and
sparc64_set_context() is not the same as what the kernel actually
does: we unconditionally read and write the FP registers and the
FSR, GSR and FPRS, but the kernel logic is more complicated:
 * in get_context the kernel has code for saving FPU registers,
   but it is hidden inside an "if (fenab) condition and the
   fenab flag is always set to 0 (inside an "#if 1" which has
   been in the kernel for over 15 years). So the effect is that
   the FPU state part is always written as zeroes.
 * in set_context the kernel looks at the fenab field in the
   structure from the guest, and only restores the state if
   it is set; it also looks at the structure's FPRS to see
   whether either the upper or lower or both halves of the
   register file have valid data.

Bring our implementations into line with the kernel:
 * in get_context:
    - clear the entire target_ucontext at the top of the
      function (as the kernel does)
    - then don't write the FPU state, so those fields remain zero
    - this fixes Coverity issue CID 1432305 by deleting the code
      it was complaining about
 * in set_context:
    - check the fenab and the fpsr to decide which parts of
      the FPU data to restore, if any
    - instead of setting the FPU registers by doing two
      32-bit loads and filling in the .upper and .lower parts
      of the CPU_Double union separately, just do a 64-bit
      load of the whole register at once. This fixes Coverity
      issue CID 1432303 because we now access the dregs[] part
      of the mcfpu_fregs union rather than the sregs[] part
      (which is not large enough to actually cover the whole of
      the data, so we were accessing off the end of sregs[])

We change both functions in a single commit to avoid potentially
breaking bisection.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20201106152738.26026-2-peter.maydell@linaro.org>
[lv: fix FPRS_DU loop s/31/32/]
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
2020-12-18 11:23:29 +01:00
..
aarch64 linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
alpha linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
arm linux-user/arm: Deliver SIGTRAP for UDF patterns used as breakpoints 2020-11-23 11:04:51 +00:00
cris linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
generic linux-user: Add generic 'termbits.h' for some archs 2020-08-27 12:29:50 +02:00
host linux-user/: fix some comment spelling errors 2020-09-17 20:39:22 +02:00
hppa linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
i386 linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
m68k linux-user: Correct definition of stack_t 2020-11-11 10:59:39 +01:00
microblaze linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
mips linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
mips64 linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
nios2 linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
openrisc linux-user: update syscall_nr.h to Linux 5.9-rc7 2020-10-26 11:39:23 +01:00
ppc linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
riscv linux-user: update syscall_nr.h to Linux 5.9-rc7 2020-10-26 11:39:23 +01:00
s390x linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
sh4 linux-user: Correct definition of stack_t 2020-11-11 10:59:39 +01:00
sparc linux-user/sparc: Correct sparc64_get/set_context() FPU handling 2020-12-18 11:23:29 +01:00
sparc64 linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
tilegx linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
x86_64 linux user: Fix Lesser GPL version number 2020-11-15 16:41:26 +01:00
xtensa linux-user: update syscall.tbl to Linux 5.9-rc7 2020-10-26 11:39:23 +01:00
cpu_loop-common.h cpu: Replace ENV_GET_CPU with env_cpu 2019-06-10 07:03:34 -07:00
elfload.c linux-user: Add support for MIPS Loongson 2F/3A 2020-12-17 10:34:59 +01:00
errno_defs.h Supply missing header guards 2019-06-12 13:20:21 +02:00
exit.c build: move TARGET_GPROF to config-host.mak 2020-02-12 16:29:27 +01:00
fd-trans.c linux-user,netlink: add IFLA_BRPORT_MRP_RING_OPEN, IFLA_BRPORT_MRP_IN_OPEN 2020-11-17 15:22:52 +01:00
fd-trans.h linux-user: move TargetFdTrans functions to their own file 2018-09-25 22:36:47 +02:00
flat.h linux-user/: fix some comment spelling errors 2020-09-17 20:39:22 +02:00
flatload.c linux-user/: fix some comment spelling errors 2020-09-17 20:39:22 +02:00
ioctls.h linux-user: Add most IFTUN ioctls 2020-12-18 11:23:10 +01:00
linux_loop.h linux-user: Add loop control ioctls 2016-07-19 15:22:33 +03:00
linuxload.c avoid TABs in files that only contain a few 2019-01-11 15:46:56 +01:00
main.c plugin: propagate errors 2020-12-15 12:51:56 -05:00
meson.build meson: linux-user 2020-08-21 06:30:38 -04:00
mmap.c linux-user/mmap.c: check range of mremap result in target address space 2020-12-17 10:34:27 +01:00
qemu.h linux-user/elfload: Parse NT_GNU_PROPERTY_TYPE_0 notes 2020-10-27 10:44:02 +00:00
safe-syscall.S linux-user: Provide safe_syscall for fixing races between signals and syscalls 2016-05-27 14:49:51 +03:00
signal-common.h linux-user: Make sigaltstack stacks per-thread 2019-07-26 19:24:33 +02:00
signal.c qemu/atomic.h: rename atomic_ to qatomic_ 2020-09-23 16:07:44 +01:00
socket.h Supply missing header guards 2019-06-12 13:20:21 +02:00
strace.c linux-user: remove GNUC check 2020-12-15 12:53:14 -05:00
strace.list linux-user: Add strace support for printing arguments of some clock and time functions 2020-08-27 12:29:50 +02:00
syscall.c linux-user: Add most IFTUN ioctls 2020-12-18 11:23:10 +01:00
syscall_defs.h linux-user: Add most IFTUN ioctls 2020-12-18 11:23:10 +01:00
syscall_types.h linux-user: Add support for btrfs ioctls used to scrub a filesystem 2020-09-03 01:09:35 +02:00
target_flat.h Supply missing header guards 2019-06-12 13:20:21 +02:00
trace-events linux-user: fix use of SIGRTMIN 2020-02-12 18:56:41 +01:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
uaccess.c avoid TABs in files that only contain a few 2019-01-11 15:46:56 +01:00
uname.c cpu: Replace ENV_GET_CPU with env_cpu 2019-06-10 07:03:34 -07:00
uname.h Clean up decorations and whitespace around header guards 2016-07-12 16:20:46 +02:00
vm86.c linux-user: Use `qemu_log' for non-strace logging 2020-02-19 11:17:40 +01:00