aboutsummaryrefslogtreecommitdiffstats
path: root/arch/parisc
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2021-01-26 20:16:21 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-02-03 23:28:37 +0100
commit6141f82fd5ee0959a3e81ceb37c8af8816cfa31c (patch)
tree9fcabd1cb2b6da8465df1750ebab80134a2f77cb /arch/parisc
parentd56e3b6a6b148161805773f52f3921861317542f (diff)
downloadkernel_replicant_linux-6141f82fd5ee0959a3e81ceb37c8af8816cfa31c.tar.gz
kernel_replicant_linux-6141f82fd5ee0959a3e81ceb37c8af8816cfa31c.tar.bz2
kernel_replicant_linux-6141f82fd5ee0959a3e81ceb37c8af8816cfa31c.zip
parisc: Enable -mlong-calls gcc option by default when !CONFIG_MODULES
commit 00e35f2b0e8acb88d4e1aa96ff0490e3bfe46580 upstream. When building a kernel without module support, the CONFIG_MLONGCALL option needs to be enabled in order to reach symbols which are outside of a 22-bit branch. This patch changes the autodetection in the Kconfig script to always enable CONFIG_MLONGCALL when modules are disabled and uses a far call to preempt_schedule_irq() in intr_do_preempt() to reach the symbol in all cases. Signed-off-by: Helge Deller <deller@gmx.de> Reported-by: kernel test robot <lkp@intel.com> Cc: stable@vger.kernel.org # v5.6+ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/parisc')
-rw-r--r--arch/parisc/Kconfig5
-rw-r--r--arch/parisc/kernel/entry.S13
2 files changed, 12 insertions, 6 deletions
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig
index b234e8154cbd..04dc17d52ac2 100644
--- a/arch/parisc/Kconfig
+++ b/arch/parisc/Kconfig
@@ -202,9 +202,8 @@ config PREFETCH
depends on PA8X00 || PA7200
config MLONGCALLS
- bool "Enable the -mlong-calls compiler option for big kernels"
- default y if !MODULES || UBSAN || FTRACE
- default n
+ def_bool y if !MODULES || UBSAN || FTRACE
+ bool "Enable the -mlong-calls compiler option for big kernels" if MODULES && !UBSAN && !FTRACE
depends on PA8X00
help
If you configure the kernel to include many drivers built-in instead
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S
index f6f28e41bb5e..5d8123eb38ec 100644
--- a/arch/parisc/kernel/entry.S
+++ b/arch/parisc/kernel/entry.S
@@ -997,10 +997,17 @@ intr_do_preempt:
bb,<,n %r20, 31 - PSW_SM_I, intr_restore
nop
+ /* ssm PSW_SM_I done later in intr_restore */
+#ifdef CONFIG_MLONGCALLS
+ ldil L%intr_restore, %r2
+ load32 preempt_schedule_irq, %r1
+ bv %r0(%r1)
+ ldo R%intr_restore(%r2), %r2
+#else
+ ldil L%intr_restore, %r1
BL preempt_schedule_irq, %r2
- nop
-
- b,n intr_restore /* ssm PSW_SM_I done by intr_restore */
+ ldo R%intr_restore(%r1), %r2
+#endif
#endif /* CONFIG_PREEMPTION */
/*