linux/arch/powerpc/kernel
Michael Neuling 5a51c55493 powerpc/tm: Avoid possible userspace r1 corruption on reclaim
[ Upstream commit 96dc89d526 ]

Current we store the userspace r1 to PACATMSCRATCH before finally
saving it to the thread struct.

In theory an exception could be taken here (like a machine check or
SLB miss) that could write PACATMSCRATCH and hence corrupt the
userspace r1. The SLB fault currently doesn't touch PACATMSCRATCH, but
others do.

We've never actually seen this happen but it's theoretically
possible. Either way, the code is fragile as it is.

This patch saves r1 to the kernel stack (which can't fault) before we
turn MSR[RI] back on. PACATMSCRATCH is still used but only with
MSR[RI] off. We then copy r1 from the kernel stack to the thread
struct once we have MSR[RI] back on.

Suggested-by: Breno Leitao <leitao@debian.org>
Signed-off-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2018-10-20 09:52:38 +02:00
..
vdso32 powerpc/vdso: Avoid link stack corruption in __get_datapage() 2015-10-01 16:52:02 +10:00
vdso64 powerpc/vdso64: Use double word compare on pointers 2016-10-28 03:01:28 -04:00
.gitignore
align.c powerpc: Fix DAR reporting when alignment handler faults 2017-09-27 11:00:14 +02:00
asm-offsets.c powerpc/64s: Add support for RFI flush of L1-D cache 2018-02-16 20:09:35 +01:00
audit.c
btext.c
cacheinfo.c powerpc: Fix missing L2 cache size in /sys/devices/system/cpu 2015-04-11 20:49:28 +10:00
cacheinfo.h
compat_audit.c
cpu_setup_6xx.S
cpu_setup_44x.S
cpu_setup_fsl_booke.S powerpc/booke: Restrict SPE exception handlers to e200/e500 cores 2014-09-22 10:11:31 +02:00
cpu_setup_pa6t.S
cpu_setup_power.S powerpc/64s: Clear PCR on boot 2018-06-06 16:46:20 +02:00
cpu_setup_ppc970.S
cputable.c powerpc/tm: Abort syscalls in active transactions 2015-06-19 17:10:28 +10:00
crash_dump.c powerpc: Remove superfluous bootmem includes 2014-11-10 09:59:26 +11:00
crash.c powerpc/book3e/kdump: Enable crash_kexec_wait_realmode 2015-10-27 18:13:27 -05:00
dbell.c powerpc/powernv: Fixes for hypervisor doorbell handling 2015-03-20 14:51:53 +11:00
dma-iommu.c powerpc/iommu: Support "hybrid" iommu/direct DMA ops for coherent_mask < dma_mask 2015-07-13 10:10:55 +10:00
dma-swiotlb.c powerpc/iommu: Support "hybrid" iommu/direct DMA ops for coherent_mask < dma_mask 2015-07-13 10:10:55 +10:00
dma.c powerpc/dma: dma_set_coherent_mask() should not be GPL only 2015-10-28 14:20:50 +09:00
eeh_cache.c powerpc/eeh: fix start/end/flags type in struct pci_io_addr_range{} 2015-05-13 14:00:07 +10:00
eeh_dev.c powerpc/eeh: Create eeh_dev from pci_dn instead of device_node 2015-03-24 13:15:51 +11:00
eeh_driver.c powerpc/eeh: Avoid use after free in eeh_handle_special_event() 2017-06-14 13:16:25 +02:00
eeh_event.c
eeh_pe.c powerpc/eeh: Fix enabling bridge MMIO windows 2018-04-24 09:32:11 +02:00
eeh_sysfs.c powerpc/eeh: Fix PE state format 2014-11-27 09:32:58 +11:00
eeh.c powerpc/eeh: Enable IO path on permanent error 2017-07-05 14:37:18 +02:00
entry_32.S powerpc/kernel: Change the do_syscall_trace_enter() API 2015-07-29 11:56:11 +10:00
entry_64.S powerpc/mm/hash: Add missing isync prior to kernel stack SLB switch 2018-07-03 11:21:28 +02:00
epapr_hcalls.S
epapr_paravirt.c
exceptions-64e.S powerpc/64e: Fix hang when debugging programs with relocated kernel 2017-05-25 14:30:15 +02:00
exceptions-64s.S powerpc/64s: Add support for RFI flush of L1-D cache 2018-02-16 20:09:35 +01:00
fadump.c powerpc/fadump: Return error when fadump registration fails 2018-10-13 09:11:33 +02:00
firmware.c
fpu.S
fsl_booke_entry_mapping.S powerpc/fsl: Force coherent memory on e500mc derivatives 2015-08-07 23:00:01 -05:00
ftrace.c powerpc updates for 3.19 2014-12-11 17:48:14 -08:00
head_8xx.S powerpc/8xx: fix invalid register expression in head_8xx.S 2018-08-06 16:24:34 +02:00
head_32.S
head_40x.S
head_44x.S powerpc/ppc476: Disable BTAC 2014-08-13 15:13:42 +10:00
head_64.S powerpc/book3e: support CONFIG_RELOCATABLE 2015-10-27 18:13:27 -05:00
head_booke.h
head_fsl_booke.S powerpc/booke: Revert SPE/AltiVec common defines for interrupt numbers 2014-09-22 10:11:31 +02:00
hw_breakpoint.c powerpc/ptrace: Fix enforcement of DAWR constraints 2018-07-03 11:21:29 +02:00
ibmebus.c powerpc/ibmebus: Fix device reference leaks in sysfs interface 2017-01-19 20:17:22 +01:00
idle_6xx.S
idle_book3e.S
idle_e500.S powerpc/e500mc: Remove dead L2 flushing code in idle_e500.S 2015-06-02 21:37:19 -05:00
idle_power4.S
idle_power7.S powerpc: Convert cmp to cmpd in idle enter sequence 2017-01-09 08:07:52 +01:00
idle.c
io-workarounds.c powerpc/mm: Differentiate between hugetlb and THP during page walk 2015-10-12 15:30:09 +11:00
io.c
iomap.c
iommu.c powerpc/iommu/powernv: Release replaced TCE 2015-06-11 15:16:49 +10:00
irq.c powerpc, irq: Use access helper irq_data_get_affinity_mask() 2015-09-15 17:06:28 +02:00
isa-bridge.c
jump_label.c jump_label: Rename JUMP_LABEL_{EN,DIS}ABLE to JUMP_LABEL_{JMP,NOP} 2015-08-03 11:34:12 +02:00
kgdb.c powerpc: Replace __get_cpu_var uses 2014-11-03 12:12:32 +11:00
kprobes.c powerpc/kprobes: Pause function_graph tracing during jprobes handling 2017-06-29 12:48:51 +02:00
kvm_emul.S
kvm.c powerpc: Remove redundant breaks 2015-08-06 15:10:20 +10:00
l2cr_6xx.S
legacy_serial.c powerpc: make of_device_ids const 2014-09-25 23:14:46 +10:00
machine_kexec_32.c
machine_kexec_64.c powerpc/book3e-64: Enable kexec 2015-10-27 18:13:30 -05:00
machine_kexec.c powerpc/kdump: Handle crashkernel memory reservation failure 2018-10-10 08:52:04 +02:00
Makefile powerpc/ftrace: add powerpc timebase as a trace clock source 2015-08-06 16:36:23 +10:00
mce_power.c powerpc/book3s: Fix flush_tlb cpu_spec hook to take a generic argument. 2015-03-17 07:52:48 +11:00
mce.c powerpc/book3s/mce: Move add_taint() later in virtual mode 2017-05-25 14:30:14 +02:00
misc_32.S powerpc: Fix build warning on 32-bit PPC 2017-01-15 13:41:36 +01:00
misc_64.S powerpc: Simplify module TOC handling 2018-02-16 20:09:34 +01:00
misc.S powerpc: Rename __get_SP() to current_stack_pointer() 2014-10-15 11:23:20 +11:00
module_32.c powerpc: Use pr_fmt in module loader code 2014-10-02 17:33:54 +10:00
module_64.c powerpc: Simplify module TOC handling 2018-02-16 20:09:34 +01:00
module.c
msi.c powerpc: Remove MSI-related PCI controller ops from ppc_md 2015-06-02 11:47:45 +10:00
nvram_64.c powerpc/nvram: Fix an incorrect partition merge 2016-10-31 04:14:01 -06:00
of_platform.c powerpc/eeh: Do probe on pci_dn 2015-03-24 13:15:52 +11:00
paca.c powerpc/book3e-64: Don't limit paca to 256 MiB 2015-10-27 18:13:28 -05:00
pci_32.c powerpc/32: Add a missing include header 2018-08-06 16:24:34 +02:00
pci_64.c powerpc updates for 3.19 2014-12-11 17:48:14 -08:00
pci_dn.c powerpc/powernv: Shift VF resource with an offset 2015-03-31 13:02:38 +11:00
pci_of_scan.c libnvdimm for 4.3: 2015-09-08 14:35:59 -07:00
pci-common.c powerpc/pci: export pcibios_free_controller() 2015-10-15 20:31:57 +11:00
pci-hotplug.c powerpc/pci: Add release_device() hook to phb ops 2015-06-03 13:27:15 +10:00
pmc.c
ppc_ksyms_32.c powerpc: Separate ppc32 symbol exports into ppc_ksyms_32.c 2014-09-25 23:14:40 +10:00
ppc_ksyms.c powerpc: Rename __get_SP() to current_stack_pointer() 2014-10-15 11:23:20 +11:00
ppc_save_regs.S
ppc32.h
proc_powerpc.c
process.c powerpc: Fix VSX enabling/flushing to also test MSR_FP and MSR_VEC 2018-02-16 20:09:34 +01:00
prom_init_check.sh powerpc: Simplify symbol check in prom_init_check.sh 2014-09-25 23:14:46 +10:00
prom_init.c powerpc: Add missing error check to prom_find_boot_cpu() 2017-02-09 08:02:45 +01:00
prom_parse.c
prom.c powerpc: Update TM user feature bits in scan_features() 2016-05-04 14:48:44 -07:00
ptrace.c powerpc/ptrace: Fix setting 512B aligned breakpoints with PTRACE_SET_DEBUGREG 2018-07-03 11:21:28 +02:00
ptrace32.c
reloc_32.S
reloc_64.S
rtas_flash.c
rtas_pci.c powerpc: move find_and_init_phbs() to pSeries specific code 2015-04-11 20:49:09 +10:00
rtas-proc.c powerpc: LLVM complains about forward declaration of struct rtas_sensors 2014-11-10 09:59:32 +11:00
rtas-rtc.c
rtas.c powerpc/rtas: Validate rtas.entry before calling enter_rtas() 2015-10-22 11:03:25 +11:00
rtasd.c powerpc: Make a bunch of things static 2014-09-25 23:14:41 +10:00
setup_32.c powerpc32: memset: only use dcbz once cache is enabled 2015-09-17 10:36:53 +10:00
setup_64.c powerpc/64s: Fix RFI flush dependency on HARDLOCKUP_DETECTOR 2018-02-28 10:17:21 +01:00
setup-common.c powerpc: Don't preempt_disable() in show_cpuinfo() 2018-05-26 08:48:53 +02:00
signal_32.c powerpc/tm: Block signal return setting invalid MSR state 2015-11-23 20:06:31 +11:00
signal_64.c powerpc/tm: Block signal return setting invalid MSR state 2015-11-23 20:06:31 +11:00
signal.c powerpc/signal: Properly handle return value from uprobe_deny_signal() 2017-11-30 08:37:24 +00:00
signal.h
smp-tbsync.c
smp.c powerpc/smp: Wait until secondaries are active & online 2015-03-04 13:19:33 +11:00
stacktrace.c powerpc: Rename __get_SP() to current_stack_pointer() 2014-10-15 11:23:20 +11:00
suspend.c nosave: consolidate __nosave_{begin,end} in <asm/sections.h> 2014-10-09 22:26:04 -04:00
swsusp_32.S
swsusp_64.c
swsusp_asm64.S
swsusp_booke.S
swsusp.c
sys_ppc32.c
syscalls.c powerpc: Add a proper syscall for switching endianness 2015-03-28 22:03:40 +11:00
sysfs.c powerpc/dscr: Add some in-code documentation 2015-06-07 19:29:15 +10:00
systbl_chk.c powerpc: Add a proper syscall for switching endianness 2015-03-28 22:03:40 +11:00
systbl_chk.sh
systbl.S powerpc: Add a proper syscall for switching endianness 2015-03-28 22:03:40 +11:00
tau_6xx.c
time.c powerpc/[booke|4xx]: Don't clobber TCR[WP] when setting TCR[DIE] 2018-04-13 19:50:14 +02:00
tm.S powerpc/tm: Avoid possible userspace r1 corruption on reclaim 2018-10-20 09:52:38 +02:00
trace_clock.c powerpc/ftrace: add powerpc timebase as a trace clock source 2015-08-06 16:36:23 +10:00
traps.c powerpc/book3s/mce: Move add_taint() later in virtual mode 2017-05-25 14:30:14 +02:00
udbg_16550.c powerpc: Fix bad NULL pointer check in udbg_uart_getc_poll() 2014-11-12 13:47:20 +11:00
udbg.c powerpc: Remove the celleb support 2015-04-07 17:15:13 +10:00
uprobes.c
vdso.c powerpc/vdso: Disable building the 32-bit VDSO on little endian 2015-05-11 20:01:02 +10:00
vecemu.c
vector.S powerpc: Change vrX register defines to vX to match gcc and glibc 2015-03-16 18:32:11 +11:00
vio.c powerpc: use for_each_sg() 2015-06-24 17:49:38 -07:00
vmlinux.lds.S powerpc/64s: Add support for RFI flush of L1-D cache 2018-02-16 20:09:35 +01:00