s390/boot: fix absolute zero lowcore corruption on boot
authorAlexander Gordeev <agordeev@linux.ibm.com>
Sat, 13 Aug 2022 17:45:21 +0000 (19:45 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 7 Sep 2022 12:04:01 +0000 (14:04 +0200)
Crash dump always starts on CPU0. In case CPU0 is offline the
prefix page is not installed and the absolute zero lowcore is
used. However, struct lowcore::mcesad is never assigned and
stays zero. That leads to __machine_kdump() -> save_vx_regs()
call silently stores vector registers to the absolute lowcore
at 0x11b0 offset.

Fixes: a62bc0739253 ("s390/kdump: add support for vector extension")
Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/kernel/nmi.c
arch/s390/kernel/setup.c

index 60ac66aab1635b7578be79b41ac6bd8ae2eded0e..31cb9b00a36bb41bcec1e9090066cb029fa08e9d 100644 (file)
@@ -64,7 +64,7 @@ static inline unsigned long nmi_get_mcesa_size(void)
  * structure. The structure is required for machine check happening
  * early in the boot process.
  */
-static struct mcesa boot_mcesa __initdata __aligned(MCESA_MAX_SIZE);
+static struct mcesa boot_mcesa __aligned(MCESA_MAX_SIZE);
 
 void __init nmi_alloc_mcesa_early(u64 *mcesad)
 {
index ed4fbbbdd1b0787c405d4fe2ebee9042e0f51bac..74adb433c25725f1688c9f48443b18c3d79a7425 100644 (file)
@@ -479,6 +479,7 @@ static void __init setup_lowcore_dat_off(void)
        put_abs_lowcore(restart_data, lc->restart_data);
        put_abs_lowcore(restart_source, lc->restart_source);
        put_abs_lowcore(restart_psw, lc->restart_psw);
+       put_abs_lowcore(mcesad, lc->mcesad);
 
        mcck_stack = (unsigned long)memblock_alloc(THREAD_SIZE, THREAD_SIZE);
        if (!mcck_stack)