s390/nmi: add missing __pa/__va address conversion of extended save area
authorHeiko Carstens <hca@linux.ibm.com>
Thu, 25 Nov 2021 18:59:16 +0000 (19:59 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 6 Dec 2021 13:42:26 +0000 (14:42 +0100)
Add missing __pa/__va address conversion of machine check extended
save area designation, which is an absolute address.

Note: this currently doesn't fix a real bug, since virtual addresses
are indentical to physical ones.

Reported-by: Vineeth Vijayan <vneethv@linux.ibm.com>
Tested-by: Vineeth Vijayan <vneethv@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/kernel/machine_kexec.c
arch/s390/kernel/nmi.c
arch/s390/kernel/smp.c

index 0505e55..a16467b 100644 (file)
@@ -86,7 +86,7 @@ static noinline void __machine_kdump(void *image)
                        continue;
        }
        /* Store status of the boot CPU */
-       mcesa = (struct mcesa *)(S390_lowcore.mcesad & MCESA_ORIGIN_MASK);
+       mcesa = __va(S390_lowcore.mcesad & MCESA_ORIGIN_MASK);
        if (MACHINE_HAS_VX)
                save_vx_regs((__vector128 *) mcesa->vector_save_area);
        if (MACHINE_HAS_GS) {
index 20f8e18..3f18c14 100644 (file)
@@ -68,7 +68,7 @@ void __init nmi_alloc_boot_cpu(struct lowcore *lc)
 {
        if (!nmi_needs_mcesa())
                return;
-       lc->mcesad = (unsigned long) &boot_mcesa;
+       lc->mcesad = __pa(&boot_mcesa);
        if (MACHINE_HAS_GS)
                lc->mcesad |= ilog2(MCESA_MAX_SIZE);
 }
@@ -94,7 +94,7 @@ static int __init nmi_init(void)
        __ctl_store(cr0, 0, 0);
        __ctl_clear_bit(0, 28); /* disable lowcore protection */
        /* Replace boot_mcesa on the boot CPU */
-       S390_lowcore.mcesad = origin | mcesa_origin_lc;
+       S390_lowcore.mcesad = __pa(origin) | mcesa_origin_lc;
        __ctl_load(cr0, 0, 0);
        return 0;
 }
@@ -111,7 +111,7 @@ int nmi_alloc_per_cpu(struct lowcore *lc)
                return -ENOMEM;
        /* The pointer is stored with mcesa_bits ORed in */
        kmemleak_not_leak((void *) origin);
-       lc->mcesad = origin | mcesa_origin_lc;
+       lc->mcesad = __pa(origin) | mcesa_origin_lc;
        return 0;
 }
 
@@ -119,7 +119,7 @@ void nmi_free_per_cpu(struct lowcore *lc)
 {
        if (!nmi_needs_mcesa())
                return;
-       kmem_cache_free(mcesa_cache, (void *)(lc->mcesad & MCESA_ORIGIN_MASK));
+       kmem_cache_free(mcesa_cache, __va(lc->mcesad & MCESA_ORIGIN_MASK));
 }
 
 static notrace void s390_handle_damage(void)
@@ -246,7 +246,7 @@ static int notrace s390_validate_registers(union mci mci, int umode)
                        : "Q" (S390_lowcore.fpt_creg_save_area));
        }
 
-       mcesa = (struct mcesa *)(S390_lowcore.mcesad & MCESA_ORIGIN_MASK);
+       mcesa = __va(S390_lowcore.mcesad & MCESA_ORIGIN_MASK);
        if (!MACHINE_HAS_VX) {
                /* Validate floating point registers */
                asm volatile(
index 78a8ea6..2e280e8 100644 (file)
@@ -622,7 +622,7 @@ int smp_store_status(int cpu)
                return -EIO;
        if (!MACHINE_HAS_VX && !MACHINE_HAS_GS)
                return 0;
-       pa = __pa(lc->mcesad & MCESA_ORIGIN_MASK);
+       pa = lc->mcesad & MCESA_ORIGIN_MASK;
        if (MACHINE_HAS_GS)
                pa |= lc->mcesad & MCESA_LC_MASK;
        if (__pcpu_sigp_relax(pcpu->address, SIGP_STORE_ADDITIONAL_STATUS,