linux/arch/sparc/include/asm
David S. Miller 44922150d8 sparc64: Fix userspace FPU register corruptions.
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>
2015-08-06 19:13:25 -07:00
..
agp.h
apb.h
asm-offsets.h
asm.h
asmmacro.h
atomic.h
atomic_32.h sparc32: Implement xchg and atomic_xchg using ATOMIC_HASH locks 2014-11-07 12:51:44 -08:00
atomic_64.h locking,arch: Use ACCESS_ONCE() instead of cast to volatile in atomic_read() 2014-10-03 06:06:23 +02:00
auxio.h sparc32: fix sparse warnings in auxio_32.c 2014-04-29 01:12:26 -04:00
auxio_32.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
auxio_64.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
backoff.h
barrier.h
barrier_32.h arch: Clean up asm/barrier.h implementations using asm-generic/barrier.h 2014-01-12 10:37:15 +01:00
barrier_64.h locking/arch: Rename set_mb() to smp_store_mb() 2015-05-19 08:32:00 +02:00
bbc.h
bitext.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
bitops.h
bitops_32.h Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next 2014-06-19 07:50:07 -10:00
bitops_64.h Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next 2014-06-19 07:50:07 -10:00
btext.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
bug.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
bugs.h
cache.h
cacheflush.h
cacheflush_32.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
cacheflush_64.h mm/debug_pagealloc: fix build failure on ppc and some other archs 2015-02-05 13:35:30 -08:00
cachetlb_32.h
chafsr.h
checksum.h
checksum_32.h Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next 2014-06-19 07:50:07 -10:00
checksum_64.h Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next 2014-06-19 07:50:07 -10:00
chmctrl.h
clock.h
cmpxchg.h
cmpxchg_32.h arch: Remove __ARCH_HAVE_CMPXCHG 2015-05-13 10:55:42 +02:00
cmpxchg_64.h arch: Remove __ARCH_HAVE_CMPXCHG 2015-05-13 10:55:42 +02:00
compat.h
compat_signal.h
contregs.h
cpu_type.h
cpudata.h sparc: fix sparse warnings in cpu.c 2014-04-29 01:12:25 -04:00
cpudata_32.h sparc: Replace __get_cpu_var uses 2014-08-26 13:45:55 -04:00
cpudata_64.h sparc64: Setup sysfs to mark LDOM sockets, cores and threads correctly 2015-04-22 15:42:56 -04:00
current.h
dcr.h
dcu.h
delay.h
delay_32.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
delay_64.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
device.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
dma-mapping.h sparc: Add NOP dma_cache_sync() implementation. 2014-11-26 13:36:41 -08:00
dma.h
ebus_dma.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
ecc.h
eeprom.h
elf.h
elf_32.h
elf_64.h
estate.h
fb.h
fbio.h
fhc.h
floppy.h
floppy_32.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
floppy_64.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
fpumacro.h
ftrace.h sparc64: fix sparse warning in ftrace.c 2014-05-18 19:01:35 -07:00
futex.h
futex_32.h
futex_64.h
gpio.h
hardirq.h
hardirq_32.h hardirq: Make hardirq bits generic 2013-11-13 20:21:46 +01:00
hardirq_64.h hardirq: Make hardirq bits generic 2013-11-13 20:21:46 +01:00
head.h
head_32.h
head_64.h
hibernate.h
highmem.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
hugetlb.h mm/hugetlb: remove arch_prepare/release_hugepage from arch headers 2015-06-25 17:00:35 -07:00
hvtramp.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
hw_irq.h
hypervisor.h sparc: perf: Add support M7 processor 2015-03-19 18:54:49 -07:00
ide.h
idprom.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
intr_queue.h
io-unit.h sparc32: fix sparse warning in io-unit.c 2014-05-18 19:01:26 -07:00
io.h sparc: io: remove duplicate relaxed accessors on sparc32 2014-11-19 10:19:45 +01:00
io_32.h arch/*/io.h: Add ioremap_wt() to all architectures 2015-06-07 15:28:57 +02:00
io_64.h arch/*/io.h: Add ioremap_wt() to all architectures 2015-06-07 15:28:57 +02:00
ioctls.h
iommu.h
iommu_32.h sparc32: fix sparse warning in iommu.c 2014-05-18 19:01:26 -07:00
iommu_64.h sparc: Make sparc64 use scalable lib/iommu-common.c functions 2015-04-18 12:32:59 -07:00
irq.h
irq_32.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
irq_64.h sparc64: sparse irq 2014-10-05 16:53:40 -07:00
irqflags.h
irqflags_32.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
irqflags_64.h
jump_label.h jump_label: Allow asm/jump_label.h to be included in assembly 2015-04-09 09:40:23 +02:00
Kbuild mm: clean up per architecture MM hook header files 2015-07-17 16:39:53 -07:00
kdebug.h
kdebug_32.h
kdebug_64.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
kgdb.h sparc64: fix sparse warning in kgdb_64.c 2014-05-18 19:01:34 -07:00
kmap_types.h
kprobes.h sparc64: fix sparse warning in kprobes.c 2014-05-18 19:01:34 -07:00
ldc.h sparc/ldc: create separate ldc_unbind from ldc_free 2014-12-11 18:52:45 -08:00
leon.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
leon_amba.h
leon_pci.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
lsu.h
machines.h
mbus.h
mc146818rtc.h sparc32: fix sparse warnings in time_32.c 2014-05-18 19:01:27 -07:00
mc146818rtc_32.h
mc146818rtc_64.h
mdesc.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
memctrl.h
mman.h
mmu.h
mmu_32.h
mmu_64.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
mmu_context.h
mmu_context_32.h
mmu_context_64.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
mmzone.h
msi.h
mxcc.h
nmi.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
ns87303.h
obio.h
openprom.h
oplib.h
oplib_32.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
oplib_64.h sparc64: Fix register corruption in top-most kernel stack frame during boot. 2014-10-24 09:52:49 -07:00
page.h sparc: move page_to_phys to page.h 2014-05-02 01:30:20 -04:00
page_32.h
page_64.h sparc64: Adjust vmalloc region size based upon available virtual address bits. 2014-10-05 16:53:40 -07:00
parport.h sparc: include: asm: drop owner assignment from platform_drivers 2014-10-20 16:20:14 +02:00
pbm.h
pci.h
pci_32.h PCI: Remove unused pci_dma_burst_advice() 2015-06-08 07:56:43 -05:00
pci_64.h PCI: Remove unused pci_dma_burst_advice() 2015-06-08 07:56:43 -05:00
pcic.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
pcr.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
percpu.h
percpu_32.h
percpu_64.h
perf_event.h
pgalloc.h
pgalloc_32.h sparc32: fix sparse warnings in ioport.c 2014-04-29 01:12:25 -04:00
pgalloc_64.h sparc64: Switch to 4-level page tables. 2014-10-05 16:53:38 -07:00
pgtable.h
pgtable_32.h mm: make FIRST_USER_ADDRESS unsigned long on all archs 2015-02-11 17:06:03 -08:00
pgtable_64.h mm: clarify that the function operates on hugepage pte 2015-06-24 17:49:44 -07:00
pgtsrmmu.h sparc: drop pte_file()-related helpers 2015-02-10 14:30:33 -08:00
pil.h
processor.h
processor_32.h arch, locking: Ciao arch_mutex_cpu_relax() 2014-07-17 12:32:47 +02:00
processor_64.h arch, locking: Ciao arch_mutex_cpu_relax() 2014-07-17 12:32:47 +02:00
prom.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
psr.h
ptrace.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
ross.h
rwsem.h
sbi.h
scratchpad.h
seccomp.h sparc: switch to using asm-generic for seccomp.h 2015-04-17 09:04:10 -04:00
sections.h
setup.h sparc64: Fix register corruption in top-most kernel stack frame during boot. 2014-10-24 09:52:49 -07:00
sfafsr.h
sfp-machine.h
sfp-machine_32.h sparc32: remove cast from output constraints in math asm statements 2014-05-18 19:01:28 -07:00
sfp-machine_64.h
shmparam.h
shmparam_32.h
shmparam_64.h
sigcontext.h
siginfo.h
signal.h
smp.h
smp_32.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
smp_64.h sparc64: fix sparse warnings in smp_64.c 2014-05-18 19:01:31 -07:00
sparsemem.h sparc64: Fix inconsistent max-physical-address defines. 2013-11-12 15:22:34 -08:00
spinlock.h
spinlock_32.h
spinlock_64.h
spinlock_types.h
spitfire.h sparc64: correctly recognise M6 and M7 cpu type 2014-09-09 15:24:10 -07:00
stacktrace.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
starfire.h arch: sparc: kernel: starfire.c: Remove unused function 2015-03-01 21:33:58 -08:00
string.h
string_32.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
string_64.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
sunbpp.h
swift.h
switch_to.h
switch_to_32.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
switch_to_64.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
syscall.h sparc: implement is_32bit_task 2014-09-23 16:21:27 -04:00
syscalls.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
termbits.h
termios.h
thread_info.h
thread_info_32.h sparc: Fix execution domain removal 2015-04-12 21:03:31 +02:00
thread_info_64.h sparc: Remove signal translation and exec_domain 2015-04-12 21:03:21 +02:00
timer.h
timer_32.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
timer_64.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
timex.h
timex_32.h
timex_64.h
tlb.h
tlb_32.h
tlb_64.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
tlbflush.h
tlbflush_32.h
tlbflush_64.h sparc64: Guard against flushing openfirmware mappings. 2014-08-04 20:16:00 -07:00
topology.h
topology_32.h
topology_64.h Merge branch 'linus' into sched/core, to resolve conflict 2015-06-02 08:05:42 +02:00
trap_block.h sparc: Resolve conflict between sparc v9 and M7 on usage of bit 9 of TTE 2015-05-31 22:15:01 -07:00
traps.h
tsb.h sparc64: Fix physical memory management regressions with large max_phys_bits. 2014-10-05 16:53:39 -07:00
tsunami.h
ttable.h
turbosparc.h
uaccess.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00
uaccess_32.h sparc32: nocheck uaccess coding style tweaks 2015-01-13 15:24:14 +02:00
uaccess_64.h sparc64: perf: Add sanity checking on addresses in user stack 2015-06-25 06:01:02 -07:00
unaligned.h
unistd.h sys_sgetmask/sys_ssetmask: add CONFIG_SGETMASK_SYSCALL 2014-06-04 16:54:14 -07:00
upa.h
user.h
vaddrs.h
vga.h
viking.h
vio.h vio: create routines for inc,dec vio dring indexes 2014-12-11 18:52:45 -08:00
visasm.h sparc64: Fix userspace FPU register corruptions. 2015-08-06 19:13:25 -07:00
winmacro.h
xor.h
xor_32.h
xor_64.h sparc: drop use of extern for prototypes in arch/sparc/include/asm 2014-05-18 19:01:29 -07:00