android_kernel_lge_bullhead/arch/sparc/lib
David S. Miller 683d1a7fb3 sparc64: Fix userspace FPU register corruptions.
[ Upstream commit 44922150d87cef616fd183220d43d8fde4d41390 ]

If we have a series of events from userpsace, with %fprs=FPRS_FEF,
like follows:

ETRAP
	ETRAP
		VIS_ENTRY(fprs=0x4)
		VIS_EXIT
		RTRAP (kernel FPU restore with fpu_saved=0x4)
	RTRAP

We will not restore the user registers that were clobbered by the FPU
using kernel code in the inner-most trap.

Traps allocate FPU save slots in the thread struct, and FPU using
sequences save the "dirty" FPU registers only.

This works at the initial trap level because all of the registers
get recorded into the top-level FPU save area, and we'll return
to userspace with the FPU disabled so that any FPU use by the user
will take an FPU disabled trap wherein we'll load the registers
back up properly.

But this is not how trap returns from kernel to kernel operate.

The simplest fix for this bug is to always save all FPU register state
for anything other than the top-most FPU save area.

Getting rid of the optimized inner-slot FPU saving code ends up
making VISEntryHalf degenerate into plain VISEntry.

Longer term we need to do something smarter to reinstate the partial
save optimizations.  Perhaps the fundament error is having trap entry
and exit allocate FPU save slots and restore register state.  Instead,
the VISEntry et al. calls should be doing that work.

This bug is about two decades old.

Reported-by: James Y Knight <jyknight@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-08-16 20:51:38 -07:00
..
COPYING.LIB
GENbzero.S sparc64: Kill .fixup section bloat. 2009-02-08 22:00:55 -08:00
GENcopy_from_user.S sparc64: Fix probe_kernel_{read,write}(). 2009-02-08 22:32:31 -08:00
GENcopy_to_user.S sparc64: Fix probe_kernel_{read,write}(). 2009-02-08 22:32:31 -08:00
GENmemcpy.S sparc,sparc64: unify lib/ 2008-12-04 09:17:19 -08:00
GENpage.S sparc,sparc64: unify lib/ 2008-12-04 09:17:19 -08:00
GENpatch.S sparc,sparc64: unify lib/ 2008-12-04 09:17:19 -08:00
Makefile Kconfig: consolidate CONFIG_DEBUG_STRICT_USER_COPY_CHECKS 2013-04-30 17:04:09 -07:00
NG2copy_from_user.S sparc64: Fix probe_kernel_{read,write}(). 2009-02-08 22:32:31 -08:00
NG2copy_to_user.S sparc64: Fix probe_kernel_{read,write}(). 2009-02-08 22:32:31 -08:00
NG2memcpy.S sparc64: Add membar to Niagara2 memcpy code. 2014-08-14 09:24:16 +08:00
NG2patch.S sparc,sparc64: unify lib/ 2008-12-04 09:17:19 -08:00
NG4clear_page.S sparc64: Niagara-4 bzero/memset, plus use MRU stores in page copy. 2012-10-05 13:45:26 -07:00
NG4copy_from_user.S sparc64: Fix comment type in NG4 copy from user. 2012-09-27 14:26:41 -07:00
NG4copy_page.S sparc64: Niagara-4 bzero/memset, plus use MRU stores in page copy. 2012-10-05 13:45:26 -07:00
NG4copy_to_user.S sparc64: Add SPARC-T4 optimized memcpy. 2012-09-27 00:35:11 -07:00
NG4memcpy.S sparc64: Fix userspace FPU register corruptions. 2015-08-16 20:51:38 -07:00
NG4memset.S sparc64: Niagara-4 bzero/memset, plus use MRU stores in page copy. 2012-10-05 13:45:26 -07:00
NG4patch.S sparc64: Niagara-4 bzero/memset, plus use MRU stores in page copy. 2012-10-05 13:45:26 -07:00
NGbzero.S sparc64: Kill .fixup section bloat. 2009-02-08 22:00:55 -08:00
NGcopy_from_user.S sparc64: Fix probe_kernel_{read,write}(). 2009-02-08 22:32:31 -08:00
NGcopy_to_user.S sparc64: Fix probe_kernel_{read,write}(). 2009-02-08 22:32:31 -08:00
NGmemcpy.S sparc,sparc64: unify lib/ 2008-12-04 09:17:19 -08:00
NGpage.S sparc64: Add SPARC-T4 optimized memcpy. 2012-09-27 00:35:11 -07:00
NGpatch.S sparc,sparc64: unify lib/ 2008-12-04 09:17:19 -08:00
PeeCeeI.c sparc64: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:20 -08:00
U1copy_from_user.S sparc64: Fix probe_kernel_{read,write}(). 2009-02-08 22:32:31 -08:00
U1copy_to_user.S sparc64: Fix probe_kernel_{read,write}(). 2009-02-08 22:32:31 -08:00
U1memcpy.S sparc64: Consistently use fsrc2 rather than fmovd in optimized asm. 2012-06-27 01:25:23 -07:00
U3copy_from_user.S sparc64: Kill .fixup section bloat. 2009-02-08 22:00:55 -08:00
U3copy_to_user.S sparc64: Fix probe_kernel_{read,write}(). 2009-02-08 22:32:31 -08:00
U3memcpy.S sparc,sparc64: unify lib/ 2008-12-04 09:17:19 -08:00
U3patch.S sparc,sparc64: unify lib/ 2008-12-04 09:17:19 -08:00
VISsave.S sparc64: Fix userspace FPU register corruptions. 2015-08-16 20:51:38 -07:00
ashldi3.S sparc: Convert some assembler over to linakge.h's ENTRY/ENDPROC 2012-05-11 20:33:22 -07:00
ashrdi3.S sparc: Convert some assembler over to linakge.h's ENTRY/ENDPROC 2012-05-11 20:33:22 -07:00
atomic32.c sparc32: Implement xchg and atomic_xchg using ATOMIC_HASH locks 2014-11-21 09:22:52 -08:00
atomic_64.S sparc: Support atomic64_dec_if_positive properly. 2012-11-09 19:37:59 -08:00
bitext.c sparc/srmmu: clear trailing edge of bitmap properly 2013-03-31 19:29:12 -04:00
bitops.S sparc: Convert some assembler over to linakge.h's ENTRY/ENDPROC 2012-05-11 20:33:22 -07:00
blockops.S sparc: Convert some assembler over to linakge.h's ENTRY/ENDPROC 2012-05-11 20:33:22 -07:00
bzero.S sparc: Convert some assembler over to linakge.h's ENTRY/ENDPROC 2012-05-11 20:33:22 -07:00
checksum_32.S sparc32: Fixed unaligned memory copying in function __csum_partial_copy_sparc_generic 2011-05-11 21:35:04 -07:00
checksum_64.S sparc,sparc64: unify lib/ 2008-12-04 09:17:19 -08:00
clear_page.S sparc,sparc64: unify lib/ 2008-12-04 09:17:19 -08:00
cmpdi2.c [SPARC32]: Add __cmpdi2() libcall implementation ala. MIPS. 2007-08-26 18:49:09 -07:00
copy_in_user.S sparc64: Fix probe_kernel_{read,write}(). 2009-02-08 22:32:31 -08:00
copy_page.S sparc64: Consistently use fsrc2 rather than fmovd in optimized asm. 2012-06-27 01:25:23 -07:00
copy_user.S [SPARC]: Don't zero out tail during copy_from_user_inatomic(). 2006-09-29 16:12:41 -07:00
csum_copy.S sparc,sparc64: unify lib/ 2008-12-04 09:17:19 -08:00
csum_copy_from_user.S sparc64: Fix section attribute warnings. 2009-05-29 16:12:02 -07:00
csum_copy_to_user.S sparc64: Fix section attribute warnings. 2009-05-29 16:12:02 -07:00
divdi3.S sparc32: Kill off software 32-bit multiply/divide routines. 2012-05-15 11:23:47 -07:00
ffs.S sparc: Use popc when possible for ffs/__ffs/ffz. 2011-08-02 21:28:53 -07:00
hweight.S sparc: Use popc if possible for hweight routines. 2011-08-02 21:28:50 -07:00
iomap.c sparc: switch to GENERIC_PCI_IOMAP 2011-12-04 15:59:49 +02:00
ipcsum.S sparc: Convert some assembler over to linakge.h's ENTRY/ENDPROC 2012-05-11 20:33:22 -07:00
ksyms.c sparc64: Fix userspace FPU register corruptions. 2015-08-16 20:51:38 -07:00
libgcc.h [SPARC32]: Add __cmpdi2() libcall implementation ala. MIPS. 2007-08-26 18:49:09 -07:00
locks.S sparc: remove CVS keywords 2008-05-20 00:33:44 -07:00
lshrdi3.S sparc: Convert some assembler over to linakge.h's ENTRY/ENDPROC 2012-05-11 20:33:22 -07:00
mcount.S sparc64: Allocate sufficient stack space in ftrace stubs. 2010-04-13 18:59:02 -07:00
memcmp.S sparc: Commonize memcmp assembler. 2008-12-09 04:09:07 -08:00
memcpy.S sparc32: Correct the return value of memcpy. 2011-10-20 15:17:23 -07:00
memmove.S sparc64: Fix several bugs in memmove(). 2015-03-26 15:00:55 +01:00
memscan_32.S sparc: prepare lib/ for unification 2008-12-04 09:17:18 -08:00
memscan_64.S sparc,sparc64: unify lib/ 2008-12-04 09:17:19 -08:00
memset.S sparc: Stop trying to be so fancy and use __builtin_{memcpy,memset}() 2009-12-10 23:32:10 -08:00
muldi3.S sparc32: Kill off software 32-bit multiply/divide routines. 2012-05-15 11:23:47 -07:00
strlen.S sparc: Unify strlen assembler. 2008-12-09 01:07:09 -08:00
strncmp_32.S sparc: Convert some assembler over to linakge.h's ENTRY/ENDPROC 2012-05-11 20:33:22 -07:00
strncmp_64.S sparc: Convert some assembler over to linakge.h's ENTRY/ENDPROC 2012-05-11 20:33:22 -07:00
ucmpdi2.c sparc32: add ucmpdi2 2012-05-19 15:23:57 -07:00
udivdi3.S sparc32: Kill off software 32-bit multiply/divide routines. 2012-05-15 11:23:47 -07:00
user_fixup.c sparc64: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:20 -08:00
xor.S sparc: Convert some assembler over to linakge.h's ENTRY/ENDPROC 2012-05-11 20:33:22 -07:00