linux/arch/powerpc/kernel
Michael Ellerman 78ee994637 powerpc/64s: Make rfi_flush_fallback a little more robust
Because rfi_flush_fallback runs immediately before the return to
userspace it currently runs with the user r1 (stack pointer). This
means if we oops in there we will report a bad kernel stack pointer in
the exception entry path, eg:

  Bad kernel stack pointer 7ffff7150e40 at c0000000000023b4
  Oops: Bad kernel stack pointer, sig: 6 [#1]
  LE SMP NR_CPUS=32 NUMA PowerNV
  Modules linked in:
  CPU: 0 PID: 1246 Comm: klogd Not tainted 4.18.0-rc2-gcc-7.3.1-00175-g0443f8a69ba3 #7
  NIP:  c0000000000023b4 LR: 0000000010053e00 CTR: 0000000000000040
  REGS: c0000000fffe7d40 TRAP: 4100   Not tainted  (4.18.0-rc2-gcc-7.3.1-00175-g0443f8a69ba3)
  MSR:  9000000002803031 <SF,HV,VEC,VSX,FP,ME,IR,DR,LE>  CR: 44000442  XER: 20000000
  CFAR: c00000000000bac8 IRQMASK: c0000000f1e66a80
  GPR00: 0000000002000000 00007ffff7150e40 00007fff93a99900 0000000000000020
  ...
  NIP [c0000000000023b4] rfi_flush_fallback+0x34/0x80
  LR [0000000010053e00] 0x10053e00

Although the NIP tells us where we were, and the TRAP number tells us
what happened, it would still be nicer if we could report the actual
exception rather than barfing about the stack pointer.

We an do that fairly simply by loading the kernel stack pointer on
entry and restoring the user value before returning. That way we see a
regular oops such as:

  Unrecoverable exception 4100 at c00000000000239c
  Oops: Unrecoverable exception, sig: 6 [#1]
  LE SMP NR_CPUS=32 NUMA PowerNV
  Modules linked in:
  CPU: 0 PID: 1251 Comm: klogd Not tainted 4.18.0-rc3-gcc-7.3.1-00097-g4ebfcac65acd-dirty #40
  NIP:  c00000000000239c LR: 0000000010053e00 CTR: 0000000000000040
  REGS: c0000000f1e17bb0 TRAP: 4100   Not tainted  (4.18.0-rc3-gcc-7.3.1-00097-g4ebfcac65acd-dirty)
  MSR:  9000000002803031 <SF,HV,VEC,VSX,FP,ME,IR,DR,LE>  CR: 44000442  XER: 20000000
  CFAR: c00000000000bac8 IRQMASK: 0
  ...
  NIP [c00000000000239c] rfi_flush_fallback+0x3c/0x80
  LR [0000000010053e00] 0x10053e00
  Call Trace:
  [c0000000f1e17e30] [c00000000000b9e4] system_call+0x5c/0x70 (unreliable)

Note this shouldn't make the kernel stack pointer vulnerable to a
meltdown attack, because it should be flushed from the cache before we
return to userspace. The user r1 value will be in the cache, because
we load it in the return path, but that is harmless.

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
2018-08-08 00:32:27 +10:00
..
trace powerpc/kbuild: move -mprofile-kernel check to Kconfig 2018-06-11 09:16:29 +09:00
vdso32 powerpc/kbuild: Remove CROSS32 defines from top level powerpc Makefile 2018-06-01 23:08:06 +10:00
vdso64 powerpc/vdso64: Add support for CLOCK_{REALTIME/MONOTONIC}_COARSE 2017-12-04 15:01:09 +11:00
.gitignore
align.c powerpc/sstep: Introduce GETTYPE macro 2018-06-03 21:19:40 +10:00
asm-offsets.c powerpc/64s: Remove POWER9 DD1 support 2018-07-16 11:37:21 +10:00
audit.c
btext.c powerpc: Make function btext_initialize static 2018-05-25 12:04:44 +10:00
cacheinfo.c
cacheinfo.h
compat_audit.c
cpu_setup_6xx.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
cpu_setup_44x.S
cpu_setup_fsl_booke.S powerpc: Free up CPU feature bits on 64-bit machines 2018-03-24 00:38:51 +11:00
cpu_setup_pa6t.S
cpu_setup_power.S powerpc/64s: Clear PCR on boot 2018-05-18 16:05:15 +10:00
cpu_setup_ppc970.S
cputable.c Merge branch 'topic/ppc-kvm' into next 2018-07-19 14:37:57 +10:00
crash_dump.c
crash.c powerpc: remove kdump.h from page.h 2018-07-30 22:47:53 +10:00
dbell.c
dma-iommu.c powerpc: rename dma_direct_ to dma_nommu_ 2018-01-10 16:41:14 +01:00
dma-swiotlb.c swiotlb: rename swiotlb_free to swiotlb_exit 2018-01-15 09:35:39 +01:00
dma.c powerpc updates for 4.18 2018-06-07 10:23:33 -07:00
dt_cpu_ftrs.c Merge branch 'topic/ppc-kvm' into next 2018-07-19 14:37:57 +10:00
eeh_cache.c powerpc/eeh: Fix misleading comment in __eeh_addr_cache_get_device() 2018-03-27 23:44:58 +11:00
eeh_dev.c
eeh_driver.c powerpc/eeh: Refactor report functions 2018-06-03 20:43:41 +10:00
eeh_event.c powerpc/eeh: Manage EEH_PE_RECOVERING inside eeh_handle_normal_event() 2018-03-27 23:44:58 +11:00
eeh_pe.c powerpc/eeh: Introduce eeh_for_each_pe() 2018-06-03 20:43:39 +10:00
eeh_sysfs.c powerpc/eeh: Add EEH notify resume sysfs 2018-01-27 20:02:52 +11:00
eeh.c powerpc/eeh: Avoid misleading message "EEH: no capable adapters found" 2018-07-02 23:54:26 +10:00
entry_32.S powerpc/fsl: Sanitize the syscall table for NXP PowerPC 32 bit platforms 2018-08-08 00:32:24 +10:00
entry_64.S powerpc/64s: Add support for software count cache flush 2018-08-08 00:32:26 +10:00
epapr_hcalls.S
epapr_paravirt.c
exceptions-64e.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
exceptions-64s.S powerpc/64s: Make rfi_flush_fallback a little more robust 2018-08-08 00:32:27 +10:00
fadump.c powerpc/fadump: Unregister fadump on kexec down path. 2018-05-03 23:19:30 +10:00
firmware.c
fpu.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
fsl_booke_entry_mapping.S
head_8xx.S powerpc: remove superflous inclusions of asm/fixmap.h 2018-07-30 22:48:18 +10:00
head_32.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
head_40x.S powerpc/405: move PPC405_ERR77 in asm-405.h 2018-07-30 22:48:13 +10:00
head_44x.S
head_64.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
head_booke.h
head_fsl_booke.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
hw_breakpoint.c powerpc/ptrace: Fix enforcement of DAWR constraints 2018-05-21 14:47:44 +10:00
idle_6xx.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
idle_book3e.S powerpc/64s: make PACA_IRQ_HARD_DIS track MSR[EE] closely 2018-07-24 22:03:14 +10:00
idle_book3s.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
idle_e500.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
idle_power4.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
idle.c
ima_kexec.c
io-workarounds.c
io.c
iomap.c powerpc: iomap.c: introduce io{read|write}64_{lo_hi|hi_lo} 2018-04-05 14:59:26 +10:00
iommu.c
irq.c powerpc/64: Disable irq restore warning for now 2018-08-07 21:49:24 +10:00
isa-bridge.c
jump_label.c
kexec_elf_64.c kernel/kexec_file.c: allow archs to set purgatory load address 2018-04-13 17:10:28 -07:00
kgdb.c
kprobes-ftrace.c powerpc/kprobes: Do not disable interrupts for optprobes and kprobes_on_ftrace 2017-11-12 23:51:41 +11:00
kprobes.c powerpc/kprobes: Fix call trace due to incorrect preempt count 2018-03-31 00:10:33 +11:00
kvm_emul.S powerpc: move ASM_CONST and stringify_in_c() into asm-const.h 2018-07-30 22:48:16 +10:00
kvm.c powerpc/kvm: Prefer fault_in_pages_readable function 2018-05-17 14:12:40 +10:00
l2cr_6xx.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
legacy_serial.c
machine_kexec_32.c
machine_kexec_64.c powerpc/64/kexec: fix race in kexec when XIVE is shutdown 2018-05-10 23:25:08 +10:00
machine_kexec_file_64.c kexec_file,x86,powerpc: factor out kexec_file_ops functions 2018-04-13 17:10:27 -07:00
machine_kexec.c powerpc: remove kdump.h from page.h 2018-07-30 22:47:53 +10:00
Makefile powerpc/64: Add CONFIG_PPC_BARRIER_NOSPEC 2018-08-08 00:32:23 +10:00
mce_power.c powerpc/64s: Report SLB multi-hit rather than parity error 2018-07-12 21:08:10 +10:00
mce.c powerpc updates for 4.16 2018-02-02 10:01:04 -08:00
misc_32.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
misc_64.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
misc.S powerpc/misc: merge reloc_offset() and add_reloc_offset() 2018-06-04 00:39:17 +10:00
module_32.c powerpc/sparse: Fix plain integer as NULL pointer warning 2018-05-25 12:04:38 +10:00
module_64.c powerpc/kbuild: move -mprofile-kernel check to Kconfig 2018-06-11 09:16:29 +09:00
module.c powerpc/64: Add CONFIG_PPC_BARRIER_NOSPEC 2018-08-08 00:32:23 +10:00
module.lds powerpc/modules: Fix alignment of .toc section in kernel modules 2017-12-11 13:03:35 +11:00
msi.c
nvram_64.c powerpc/64: Fix strncpy() related build failures with GCC 8.1 2018-06-03 20:40:24 +10:00
of_platform.c
optprobes_head.S powerpc/64: Rename soft_enabled to irq_soft_mask 2018-01-19 22:37:01 +11:00
optprobes.c powerpc/kprobes: Do not disable interrupts for optprobes and kprobes_on_ftrace 2017-11-12 23:51:41 +11:00
paca.c Merge branch 'topic/paca' into next 2018-03-31 09:09:36 +11:00
pci_32.c powerpc: Remove -Wattribute-alias pragmas 2018-06-25 23:21:13 +09:00
pci_64.c powerpc: Remove -Wattribute-alias pragmas 2018-06-25 23:21:13 +09:00
pci_dn.c powerpc/pci: Separate SR-IOV Calls 2017-12-11 13:03:35 +11:00
pci_of_scan.c pci-v4.16-changes 2018-02-06 09:59:40 -08:00
pci-common.c powerpc/pci: Remove legacy debug code 2018-07-02 23:54:28 +10:00
pci-hotplug.c powerpc/pci: Unroll two pass loop when scanning bridges 2017-12-18 23:05:52 -06:00
pmc.c
ppc32.h
ppc_save_regs.S powerpc: move ASM_CONST and stringify_in_c() into asm-const.h 2018-07-30 22:48:16 +10:00
proc_powerpc.c powerpc: Use octal numbers for file permissions 2018-01-22 05:48:33 +11:00
process.c powerpc: declare set_breakpoint() static 2018-07-30 22:48:18 +10:00
prom_init_check.sh powerpc/mm/radix: Update command line parsing for disable_radix 2018-04-04 16:59:50 +10:00
prom_init.c powerpc: clean the inclusion of stringify.h 2018-07-30 22:48:17 +10:00
prom_parse.c
prom.c powerpc: clean the inclusion of stringify.h 2018-07-30 22:48:17 +10:00
ptrace32.c
ptrace.c powerpc/ptrace: Use copy_{from, to}_user() rather than open-coding 2018-06-03 20:43:41 +10:00
reloc_32.S
reloc_64.S
rtas_flash.c powerpc: Use octal numbers for file permissions 2018-01-22 05:48:33 +11:00
rtas_pci.c
rtas-proc.c powerpc updates for 4.18 2018-06-07 10:23:33 -07:00
rtas-rtc.c powerpc: use time64_t in read_persistent_clock 2018-06-03 20:43:33 +10:00
rtas.c powerpc: Remove -Wattribute-alias pragmas 2018-06-25 23:21:13 +09:00
rtasd.c treewide: Use array_size() in vmalloc() 2018-06-12 16:19:22 -07:00
security.c powerpc/64s: Add support for software count cache flush 2018-08-08 00:32:26 +10:00
setup_32.c powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
setup_64.c powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
setup-common.c powerpc/64: Call setup_barrier_nospec() from setup_arch() 2018-08-08 00:32:23 +10:00
setup.h powerpc/tau: Synchronize function prototypes and body 2018-05-25 12:04:43 +10:00
signal_32.c powerpc: Remove -Wattribute-alias pragmas 2018-06-25 23:21:13 +09:00
signal_64.c powerpc: Remove -Wattribute-alias pragmas 2018-06-25 23:21:13 +09:00
signal.c rseq: Avoid infinite recursion when delivering SIGSEGV 2018-06-22 19:04:22 +02:00
signal.h powerpc/syscalls: signal_{32, 64} - switch to SYSCALL_DEFINE 2018-05-10 23:25:13 +10:00
smp-tbsync.c
smp.c powerpc: NMI IPI make NMI IPIs fully sychronous 2018-07-24 22:03:14 +10:00
stacktrace.c powerpc/64s: Fix build failures with CONFIG_NMI_IPI=n 2018-06-19 23:03:50 +10:00
suspend.c
swsusp_32.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
swsusp_64.c
swsusp_asm64.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
swsusp_booke.S
swsusp.c
sys_ppc32.c powerpc/syscalls: kill ppc32_select() 2018-05-10 23:25:15 +10:00
syscalls.c powerpc: Remove -Wattribute-alias pragmas 2018-06-25 23:21:13 +09:00
sysfs.c Merge branch 'topic/paca' into next 2018-03-31 09:09:36 +11:00
systbl_chk.c powerpc/syscalls: Add COMPAT_SPU_NEW() macro 2018-05-10 23:25:14 +10:00
systbl_chk.sh powerpc: Make it clearer that systbl check errors are errors 2018-05-10 23:25:16 +10:00
systbl.S powerpc/syscalls: Add COMPAT_SPU_NEW() macro 2018-05-10 23:25:14 +10:00
tau_6xx.c powerpc/tau: Make some function static 2018-05-25 12:04:44 +10:00
time.c powerpc/time: inline arch_vtime_task_switch() 2018-06-04 00:39:20 +10:00
tm.S powerpc: clean inclusions of asm/feature-fixups.h 2018-07-30 22:48:17 +10:00
traps.c signal/powerpc: Replace TRAP_FIXME with TRAP_UNK 2018-04-25 10:40:58 -05:00
udbg_16550.c
udbg.c
uprobes.c
vdso.c powerpc: remove unneeded inclusions of cpu_has_feature.h 2018-07-30 22:47:54 +10:00
vecemu.c powerpc: Add a missing include header 2018-05-25 12:04:46 +10:00
vector.S powerpc: move ASM_CONST and stringify_in_c() into asm-const.h 2018-07-30 22:48:16 +10:00
vmlinux.lds.S powerpc/64: Add CONFIG_PPC_BARRIER_NOSPEC 2018-08-08 00:32:23 +10:00
watchdog.c powerpc: NMI IPI make NMI IPIs fully sychronous 2018-07-24 22:03:14 +10:00