Skip to content

Commit 2752b18

Browse files
author
Mamatha Inamdar
committed
powerpc/pseries: Fix scv instruction crash with kexec
JIRA: https://issues.redhat.com/browse/RHEL-14159 commit 21a741e Author: Nicholas Piggin <npiggin@gmail.com> Date: Tue Jun 25 23:40:47 2024 +1000 powerpc/pseries: Fix scv instruction crash with kexec kexec on pseries disables AIL (reloc_on_exc), required for scv instruction support, before other CPUs have been shut down. This means they can execute scv instructions after AIL is disabled, which causes an interrupt at an unexpected entry location that crashes the kernel. Change the kexec sequence to disable AIL after other CPUs have been brought down. As a refresher, the real-mode scv interrupt vector is 0x17000, and the fixed-location head code probably couldn't easily deal with implementing such high addresses so it was just decided not to support that interrupt at all. Fixes: 7fa95f9 ("powerpc/64s: system call support for scv/rfscv instructions") Cc: stable@vger.kernel.org # v5.9+ Reported-by: Sourabh Jain <sourabhjain@linux.ibm.com> Closes: https://lore.kernel.org/3b4b2943-49ad-4619-b195-bc416f1d1409@linux.ibm.com Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Tested-by: Gautam Menghani <gautam@linux.ibm.com> Tested-by: Sourabh Jain <sourabhjain@linux.ibm.com> Link: https://msgid.link/20240625134047.298759-1-npiggin@gmail.com Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Mamatha Inamdar <minamdar@redhat.com>
1 parent ae82397 commit 2752b18

File tree

4 files changed

+11
-10
lines changed

4 files changed

+11
-10
lines changed

arch/powerpc/kexec/core_64.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <asm/paca.h>
2727
#include <asm/mmu.h>
2828
#include <asm/sections.h> /* _end */
29+
#include <asm/setup.h>
2930
#include <asm/smp.h>
3031
#include <asm/hw_breakpoint.h>
3132
#include <asm/asm-prototypes.h>
@@ -315,6 +316,16 @@ void default_machine_kexec(struct kimage *image)
315316
if (!kdump_in_progress())
316317
kexec_prepare_cpus();
317318

319+
#ifdef CONFIG_PPC_PSERIES
320+
/* This must be done after other CPUs have shut down, otherwise they
321+
* could execute the 'scv' instruction, which is not supported with
322+
* reloc disabled (see configure_exceptions()).
323+
*/
324+
325+
if (firmware_has_feature(FW_FEATURE_SET_MODE))
326+
pseries_disable_reloc_on_exc();
327+
#endif
328+
318329
printk("kexec: Starting switchover sequence.\n");
319330

320331
/* switch to a staticly allocated stack. Based on irq stack code.

arch/powerpc/platforms/pseries/kexec.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,3 @@ void pseries_kexec_cpu_down(int crash_shutdown, int secondary)
6161
} else
6262
xics_kexec_teardown_cpu(secondary);
6363
}
64-
65-
void pseries_machine_kexec(struct kimage *image)
66-
{
67-
if (firmware_has_feature(FW_FEATURE_SET_MODE))
68-
pseries_disable_reloc_on_exc();
69-
70-
default_machine_kexec(image);
71-
}

arch/powerpc/platforms/pseries/pseries.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ static inline void smp_init_pseries(void) { }
3737
#endif
3838

3939
extern void pseries_kexec_cpu_down(int crash_shutdown, int secondary);
40-
void pseries_machine_kexec(struct kimage *image);
4140

4241
extern void pSeries_final_fixup(void);
4342

arch/powerpc/platforms/pseries/setup.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1093,7 +1093,6 @@ define_machine(pseries) {
10931093
.machine_check_early = pseries_machine_check_realmode,
10941094
.machine_check_exception = pSeries_machine_check_exception,
10951095
#ifdef CONFIG_KEXEC_CORE
1096-
.machine_kexec = pseries_machine_kexec,
10971096
.kexec_cpu_down = pseries_kexec_cpu_down,
10981097
#endif
10991098
#ifdef CONFIG_MEMORY_HOTPLUG

0 commit comments

Comments
 (0)