]> git.baikalelectronics.ru Git - kernel.git/commitdiff
s390/dump: fix old lowcore virtual vs physical address confusion
authorAlexander Gordeev <agordeev@linux.ibm.com>
Sat, 29 Jan 2022 07:38:56 +0000 (08:38 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:24:09 +0000 (14:24 +0200)
[ Upstream commit 9621f47e7563189fd01f23afdeb94578a85ee82f ]

Virtual addresses of vmcore_info and os_info members are
wrongly passed to copy_oldmem_kernel(), while the function
expects physical address of the source. Instead, __pa()
macro should have been applied.

Yet, use of __pa() macro could be somehow confusing, since
copy_oldmem_kernel() may treat the source as an offset, not
as a direct physical address (that depens from the oldmem
availability and location).

Fix the virtual vs physical address confusion and make the
way the old lowcore is read consistent across all sources.

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/s390/kernel/asm-offsets.c
arch/s390/kernel/crash_dump.c
arch/s390/kernel/os_info.c

index b57da933858888cb5f77bb31d68de9ab11d86beb..9242d7ad71e792d80054070dc1dbf1ecc4536cf8 100644 (file)
@@ -128,6 +128,8 @@ int main(void)
        OFFSET(__LC_BR_R1, lowcore, br_r1_trampoline);
        /* software defined ABI-relevant lowcore locations 0xe00 - 0xe20 */
        OFFSET(__LC_DUMP_REIPL, lowcore, ipib);
+       OFFSET(__LC_VMCORE_INFO, lowcore, vmcore_info);
+       OFFSET(__LC_OS_INFO, lowcore, os_info);
        /* hardware defined lowcore locations 0x1000 - 0x18ff */
        OFFSET(__LC_MCESAD, lowcore, mcesad);
        OFFSET(__LC_EXT_PARAMS2, lowcore, ext_params2);
index 785d54c9350c4a93f710ac29d82e7525779fe595..9c2597be28dc0857dafd867f394d32ef0ce1d425 100644 (file)
@@ -432,7 +432,7 @@ static void *get_vmcoreinfo_old(unsigned long *size)
        Elf64_Nhdr note;
        void *addr;
 
-       if (copy_oldmem_kernel(&addr, &S390_lowcore.vmcore_info, sizeof(addr)))
+       if (copy_oldmem_kernel(&addr, (void *)__LC_VMCORE_INFO, sizeof(addr)))
                return NULL;
        memset(nt_name, 0, sizeof(nt_name));
        if (copy_oldmem_kernel(&note, addr, sizeof(note)))
index 4bef35b79b938bb4785505e0f55025b34c5b2497..198f9694e439b6d34c64856b4cfb0504c48190fb 100644 (file)
@@ -15,6 +15,7 @@
 #include <asm/checksum.h>
 #include <asm/lowcore.h>
 #include <asm/os_info.h>
+#include <asm/asm-offsets.h>
 
 /*
  * OS info structure has to be page aligned
@@ -123,7 +124,7 @@ static void os_info_old_init(void)
                return;
        if (!oldmem_data.start)
                goto fail;
-       if (copy_oldmem_kernel(&addr, &S390_lowcore.os_info, sizeof(addr)))
+       if (copy_oldmem_kernel(&addr, (void *)__LC_OS_INFO, sizeof(addr)))
                goto fail;
        if (addr == 0 || addr % PAGE_SIZE)
                goto fail;