linux/arch/powerpc/kernel
Michael Ellerman be5c5e843c powerpc/64: Fix HMI exception on LE with CONFIG_RELOCATABLE=y
Prior to commit 2337d20728 ("powerpc/64: CONFIG_RELOCATABLE support for hmi
interrupts"), the branch from hmi_exception_early() to hmi_exception_realmode()
was just a bl hmi_exception_realmode, which the linker would turn into a bl to
the local entry point of hmi_exception_realmode. This was broken when
CONFIG_RELOCATABLE=y because hmi_exception_realmode() is not in the low part of
the kernel text that is copied down to 0x0.

But in fixing that, we added a new bug on little endian kernels. Because the
branch is now a bctrl when CONFIG_RELOCATABLE=y, we branch to the global entry
point of hmi_exception_realmode(). The global entry point must be called with
r12 containing the address of hmi_exception_realmode(), because it uses that
value to calculate the TOC value (r2).

This may manifest as a checkstop, because we take a junk value from r12 which
came from HSRR1, add a small constant to it and then use that as the TOC
pointer. The HSRR1 value will have 0x9 as the top nibble, which puts it above
RAM and somewhere in MMIO space.

Fix it by changing the BRANCH_LINK_TO_FAR() macro to always use r12 to load the
label we're branching to. This means r12 will be setup correctly on LE, fixing
this bug, and r12 is also volatile across function calls on BE so it's a good
choice anyway.

Fixes: 2337d20728 ("powerpc/64: CONFIG_RELOCATABLE support for hmi interrupts")
Reported-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Acked-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2017-04-18 20:19:52 +10:00
..
vdso32 powerpc/vdso: Fix build rules to rebuild vdsos correctly 2016-08-10 23:04:12 +10:00
vdso64 powerpc/vdso64: Use double word compare on pointers 2016-09-29 15:17:57 +10:00
.gitignore
align.c powerpc: Don't try to fix up misaligned load-with-reservation instructions 2017-04-04 23:16:57 +10:00
asm-offsets.c powerpc updates for 4.11 part 2 2017-03-01 10:10:16 -08:00
audit.c
btext.c powerpc/mm: Use a helper for finding pte bits mapping I/O area 2016-05-01 18:32:32 +10:00
cacheinfo.c
cacheinfo.h
compat_audit.c
cpu_setup_6xx.S powerpc: Various typo fixes 2016-06-14 13:58:26 +10:00
cpu_setup_44x.S
cpu_setup_fsl_booke.S
cpu_setup_pa6t.S
cpu_setup_power.S powerpc/mm/hash: Always clear UPRT and Host Radix bits when setting up CPU 2017-02-23 08:26:15 +11:00
cpu_setup_ppc970.S
cputable.c powerpc/64s: POWER9 machine check handler 2017-03-10 16:32:08 +11:00
crash_dump.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
crash.c powerpc/crash: Rearrange loop condition to avoid out of bounds array access 2016-07-14 20:26:22 +10:00
dbell.c
dma-iommu.c dma-mapping: use unsigned long for dma_attrs 2016-08-04 08:50:07 -04:00
dma-swiotlb.c treewide: Constify most dma_map_ops structures 2017-01-24 12:23:35 -05:00
dma.c treewide: Move dma_ops from struct dev_archdata into struct device 2017-01-24 12:23:35 -05:00
eeh_cache.c powerpc/eeh: Fix pr_debug()s in eeh_cache.c 2016-07-08 22:09:50 +10:00
eeh_dev.c powerpc/pci: Delay populating pdn 2016-06-21 15:30:56 +10:00
eeh_driver.c powerpc/eeh: Fix wrong flag passed to eeh_unfreeze_pe() 2017-01-24 21:22:51 +11:00
eeh_event.c powerpc/pci: Always print PHB and PE numbers as hexadecimal 2016-11-22 11:57:07 +11:00
eeh_pe.c powerpc/pci: Always print PHB and PE numbers as hexadecimal 2016-11-22 11:57:07 +11:00
eeh_sysfs.c
eeh.c powerpc/eeh: Enable IO path on permanent error 2017-01-18 15:11:19 +11:00
entry_32.S powerpc updates for 4.11 part 2 2017-03-01 10:10:16 -08:00
entry_64.S powerpc/kprobe: Fix oops when kprobed on 'stdu' instruction 2017-04-18 20:19:21 +10:00
epapr_hcalls.S ppc: move exports to definitions 2016-08-07 23:50:09 -04:00
epapr_paravirt.c
exceptions-64e.S powerpc/64e: Don't branch to dot symbols 2016-11-28 22:32:30 +11:00
exceptions-64s.S powerpc/64: Fix HMI exception on LE with CONFIG_RELOCATABLE=y 2017-04-18 20:19:52 +10:00
fadump.c powerpc/fadump: Fix the race in crash_fadump(). 2017-01-30 16:35:16 +11:00
firmware.c
fpu.S Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild 2016-10-14 14:26:58 -07:00
fsl_booke_entry_mapping.S
ftrace.c powerpc/ftrace: Fix the comments for ftrace_modify_code 2016-12-03 22:10:15 +11:00
head_8xx.S powerpc/8xx: Perf events on PPC 8xx 2017-01-26 17:49:34 -06:00
head_32.S powerpc/32: Remove FIX_SRR1 2017-01-26 17:49:32 -06:00
head_40x.S ppc: move exports to definitions 2016-08-07 23:50:09 -04:00
head_44x.S ppc: move exports to definitions 2016-08-07 23:50:09 -04:00
head_64.S powerpc: Change places using CONFIG_KEXEC to use CONFIG_KEXEC_CORE instead. 2016-11-30 23:15:11 +11:00
head_booke.h
head_fsl_booke.S ppc: move exports to definitions 2016-08-07 23:50:09 -04:00
hw_breakpoint.c Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/scottwood/linux into next 2017-02-18 21:37:14 +11:00
idle_6xx.S
idle_book3e.S
idle_book3s.S powerpc/64s: Fix idle wakeup potential to clobber registers 2017-03-20 20:35:12 +11:00
idle_e500.S
idle_power4.S
idle.c
ima_kexec.c powerpc: ima: send the kexec buffer to the next kernel 2016-12-20 09:48:44 -08:00
io-workarounds.c sched/headers: Prepare to remove the <linux/mm_types.h> dependency from <linux/sched.h> 2017-03-02 08:42:37 +01:00
io.c
iomap.c powerpc: Move isa bridge definitions to separate include 2017-01-31 13:54:17 +11:00
iommu.c powerpc: implement the DMA_ATTR_NO_WARN attribute 2016-10-11 15:06:32 -07:00
irq.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
isa-bridge.c powerpc: Add support for non-PCI ISA bridges 2017-01-31 13:54:17 +11:00
jump_label.c
kexec_elf_64.c powerpc: ima: send the kexec buffer to the next kernel 2016-12-20 09:48:44 -08:00
kgdb.c
kprobes.c powerpc/kprobes: Remove kprobe_exceptions_notify() 2017-02-10 14:43:15 +11:00
kvm_emul.S
kvm.c
l2cr_6xx.S
legacy_serial.c powerpc/powernv: Add support for direct mapped LPC on POWER9 2017-01-31 13:54:18 +11:00
machine_kexec_32.c
machine_kexec_64.c powerpc: Add purgatory for kexec_file_load() implementation. 2016-11-30 23:15:26 +11:00
machine_kexec_file_64.c powerpc: ima: send the kexec buffer to the next kernel 2016-12-20 09:48:44 -08:00
machine_kexec.c powerpc: Update of_remove_property() call sites to remove null checking 2016-05-11 21:54:04 +10:00
Makefile powerpc updates for 4.11 part 1. 2017-02-22 10:30:38 -08:00
mce_power.c powerpc/64s: POWER9 machine check handler 2017-03-10 16:32:08 +11:00
mce.c powerpc/64s: POWER9 machine check handler 2017-03-10 16:32:08 +11:00
misc_32.S powerpc: Fix build warning on 32-bit PPC 2016-12-25 16:12:20 -08:00
misc_64.S powerpc/64: Fix flush_(d|i)cache_range() called from modules 2017-04-05 21:40:21 +10:00
misc.S ppc: move exports to definitions 2016-08-07 23:50:09 -04:00
module_32.c
module_64.c modversions: treat symbol CRCs as 32 bit quantities 2017-02-03 08:28:25 -08:00
module.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
msi.c
nvram_64.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
of_platform.c powerpc/of_platform: Use builtin_platform_driver 2016-11-25 14:07:51 +11:00
optprobes_head.S powerpc/optprobes: Fix TOC handling in optprobes trampoline 2017-02-23 08:23:30 +11:00
optprobes.c powerpc/kprobes: Optimize kprobe in kretprobe_trampoline() 2017-02-10 13:28:05 +11:00
paca.c sched/headers: Prepare to move 'init_task' and 'init_thread_union' from <linux/sched.h> to <linux/sched/task.h> 2017-03-02 08:42:38 +01:00
pci_32.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
pci_64.c powerpc fixes for 4.7 #5 2016-07-15 14:57:47 +10:00
pci_dn.c powerpc/pci: Fix build with PCI_IOV=y and EEH=n 2016-07-07 16:33:27 +10:00
pci_of_scan.c powerpc: Remove all usages of NO_IRQ 2016-09-20 20:57:12 +10:00
pci-common.c powerpc updates for 4.11 part 2 2017-03-01 10:10:16 -08:00
pci-hotplug.c powerpc/pci: Don't scan empty slot 2016-05-11 21:54:26 +10:00
pmc.c
ppc32.h
ppc_save_regs.S
proc_powerpc.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
process.c sched/headers: Prepare for new header dependencies before moving code to <linux/sched/task_stack.h> 2017-03-02 08:42:36 +01:00
prom_init_check.sh
prom_init.c powerpc: Update to new option-vector-5 format for CAS 2017-03-06 21:44:09 +11:00
prom_parse.c
prom.c powerpc: Change places using CONFIG_KEXEC to use CONFIG_KEXEC_CORE instead. 2016-11-30 23:15:11 +11:00
ptrace32.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
ptrace.c powerpc/ptrace: Preserve previous TM fprs/vsrs on short regset write 2017-01-20 14:55:19 +11:00
reloc_32.S
reloc_64.S
rtas_flash.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
rtas_pci.c
rtas-proc.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
rtas-rtc.c
rtas.c powerpc/kernel: Fix unbalanced refcount on RTAS device node 2017-01-25 13:34:21 +11:00
rtasd.c powerpc/pseries: Update affinity for memory and cpus specified in a PRRN event 2017-02-02 20:36:38 +11:00
setup_32.c powerpc: Move {d,i,u}cache_bsize definitions to a common place 2017-02-06 19:46:04 +11:00
setup_64.c powerpc: Disable HFSCR[TM] if TM is not supported 2017-03-28 19:52:37 +11:00
setup-common.c powerpc: Move {d,i,u}cache_bsize definitions to a common place 2017-02-06 19:46:04 +11:00
setup.h powerpc: Merge 32-bit and 64-bit setup_arch() 2016-07-21 19:17:46 +10:00
signal_32.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
signal_64.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
signal.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
signal.h powerpc: tm: Rename transct_(*) to ck(\1)_state 2016-10-04 20:33:16 +11:00
smp-tbsync.c
smp.c sched/headers: Move task->mm handling methods to <linux/sched/mm.h> 2017-03-03 01:43:28 +01:00
stacktrace.c sched/headers: Prepare for new header dependencies before moving code to <linux/sched/debug.h> 2017-03-02 08:42:34 +01:00
suspend.c
swsusp_32.S
swsusp_64.c sched/headers: Prepare for new header dependencies before moving code to <linux/sched/nmi.h> 2017-03-02 08:42:30 +01:00
swsusp_asm64.S
swsusp_booke.S
swsusp.c powerpc/mm: Abstraction for switch_mmu_context() 2016-05-01 18:33:04 +10:00
sys_ppc32.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
syscalls.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
sysfs.c powerpc/sysfs: Convert to hotplug state machine 2016-11-22 23:34:42 +01:00
systbl_chk.c
systbl_chk.sh
systbl.S
tau_6xx.c
time.c sched/headers: Prepare to move cputime functionality from <linux/sched.h> into <linux/sched/cputime.h> 2017-03-02 08:42:39 +01:00
tm.S powerpc: tm: Rename transct_(*) to ck(\1)_state 2016-10-04 20:33:16 +11:00
trace_clock.c
traps.c sched/headers: Prepare for new header dependencies before moving code to <linux/sched/debug.h> 2017-03-02 08:42:34 +01:00
udbg_16550.c
udbg.c
uprobes.c
vdso.c powerpc/64: Clean up ppc64_caches using a struct per cache 2017-02-06 19:46:04 +11:00
vecemu.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
vector.S Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild 2016-10-14 14:26:58 -07:00
vmlinux.lds.S powerpc/64: Fix placement of .text to be immediately following .head.text 2016-12-01 22:26:31 +11:00