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)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 9 Feb 2022 21:56:03 +0000 (22:56 +0100)
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>
arch/s390/kernel/asm-offsets.c
arch/s390/kernel/crash_dump.c
arch/s390/kernel/os_info.c

index 8e00bb22866235b80cf22e6cd675bc903f67f316..a496b08ea5d14c65cc5555ea8b8ffd25a900fcf2 100644 (file)
@@ -131,6 +131,8 @@ int main(void)
        OFFSET(__LC_LAST_BREAK, lowcore, last_break);
        /* 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 af82021216423206bc47aa940d9c80deac4c4e13..a62bee83a88bb14860d57a97880b4f041e663b74 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 fa2be71b2c6bb4b8ede97636ce7c31954ee0087c..a2b08d3f53ec8309b87b915a35302072f75add67 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;