Commit dc306186 authored by Alexander Gordeev's avatar Alexander Gordeev Committed by Vasily Gorbik

s390/dump: fix old lowcore virtual vs physical address confusion

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: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent ba2d394c
...@@ -131,6 +131,8 @@ int main(void) ...@@ -131,6 +131,8 @@ int main(void)
OFFSET(__LC_LAST_BREAK, lowcore, last_break); OFFSET(__LC_LAST_BREAK, lowcore, last_break);
/* software defined ABI-relevant lowcore locations 0xe00 - 0xe20 */ /* software defined ABI-relevant lowcore locations 0xe00 - 0xe20 */
OFFSET(__LC_DUMP_REIPL, lowcore, ipib); 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 */ /* hardware defined lowcore locations 0x1000 - 0x18ff */
OFFSET(__LC_MCESAD, lowcore, mcesad); OFFSET(__LC_MCESAD, lowcore, mcesad);
OFFSET(__LC_EXT_PARAMS2, lowcore, ext_params2); OFFSET(__LC_EXT_PARAMS2, lowcore, ext_params2);
......
...@@ -432,7 +432,7 @@ static void *get_vmcoreinfo_old(unsigned long *size) ...@@ -432,7 +432,7 @@ static void *get_vmcoreinfo_old(unsigned long *size)
Elf64_Nhdr note; Elf64_Nhdr note;
void *addr; 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; return NULL;
memset(nt_name, 0, sizeof(nt_name)); memset(nt_name, 0, sizeof(nt_name));
if (copy_oldmem_kernel(&note, addr, sizeof(note))) if (copy_oldmem_kernel(&note, addr, sizeof(note)))
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <asm/checksum.h> #include <asm/checksum.h>
#include <asm/lowcore.h> #include <asm/lowcore.h>
#include <asm/os_info.h> #include <asm/os_info.h>
#include <asm/asm-offsets.h>
/* /*
* OS info structure has to be page aligned * OS info structure has to be page aligned
...@@ -123,7 +124,7 @@ static void os_info_old_init(void) ...@@ -123,7 +124,7 @@ static void os_info_old_init(void)
return; return;
if (!oldmem_data.start) if (!oldmem_data.start)
goto fail; 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; goto fail;
if (addr == 0 || addr % PAGE_SIZE) if (addr == 0 || addr % PAGE_SIZE)
goto fail; goto fail;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment