diff options
Diffstat (limited to 'arch/s390/kernel/crash_dump.c')
-rw-r--r-- | arch/s390/kernel/crash_dump.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/arch/s390/kernel/crash_dump.c b/arch/s390/kernel/crash_dump.c index f45b2ab0cb81..d7658c4b2ed5 100644 --- a/arch/s390/kernel/crash_dump.c +++ b/arch/s390/kernel/crash_dump.c | |||
@@ -95,7 +95,7 @@ static void *elfcorehdr_newmem; | |||
95 | /* | 95 | /* |
96 | * Copy one page from zfcpdump "oldmem" | 96 | * Copy one page from zfcpdump "oldmem" |
97 | * | 97 | * |
98 | * For pages below ZFCPDUMP_HSA_SIZE memory from the HSA is copied. Otherwise | 98 | * For pages below HSA size memory from the HSA is copied. Otherwise |
99 | * real memory copy is used. | 99 | * real memory copy is used. |
100 | */ | 100 | */ |
101 | static ssize_t copy_oldmem_page_zfcpdump(char *buf, size_t csize, | 101 | static ssize_t copy_oldmem_page_zfcpdump(char *buf, size_t csize, |
@@ -103,7 +103,7 @@ static ssize_t copy_oldmem_page_zfcpdump(char *buf, size_t csize, | |||
103 | { | 103 | { |
104 | int rc; | 104 | int rc; |
105 | 105 | ||
106 | if (src < ZFCPDUMP_HSA_SIZE) { | 106 | if (src < sclp_get_hsa_size()) { |
107 | rc = memcpy_hsa(buf, src, csize, userbuf); | 107 | rc = memcpy_hsa(buf, src, csize, userbuf); |
108 | } else { | 108 | } else { |
109 | if (userbuf) | 109 | if (userbuf) |
@@ -188,18 +188,19 @@ static int remap_oldmem_pfn_range_kdump(struct vm_area_struct *vma, | |||
188 | /* | 188 | /* |
189 | * Remap "oldmem" for zfcpdump | 189 | * Remap "oldmem" for zfcpdump |
190 | * | 190 | * |
191 | * We only map available memory above ZFCPDUMP_HSA_SIZE. Memory below | 191 | * We only map available memory above HSA size. Memory below HSA size |
192 | * ZFCPDUMP_HSA_SIZE is read on demand using the copy_oldmem_page() function. | 192 | * is read on demand using the copy_oldmem_page() function. |
193 | */ | 193 | */ |
194 | static int remap_oldmem_pfn_range_zfcpdump(struct vm_area_struct *vma, | 194 | static int remap_oldmem_pfn_range_zfcpdump(struct vm_area_struct *vma, |
195 | unsigned long from, | 195 | unsigned long from, |
196 | unsigned long pfn, | 196 | unsigned long pfn, |
197 | unsigned long size, pgprot_t prot) | 197 | unsigned long size, pgprot_t prot) |
198 | { | 198 | { |
199 | unsigned long hsa_end = sclp_get_hsa_size(); | ||
199 | unsigned long size_hsa; | 200 | unsigned long size_hsa; |
200 | 201 | ||
201 | if (pfn < ZFCPDUMP_HSA_SIZE >> PAGE_SHIFT) { | 202 | if (pfn < hsa_end >> PAGE_SHIFT) { |
202 | size_hsa = min(size, ZFCPDUMP_HSA_SIZE - (pfn << PAGE_SHIFT)); | 203 | size_hsa = min(size, hsa_end - (pfn << PAGE_SHIFT)); |
203 | if (size == size_hsa) | 204 | if (size == size_hsa) |
204 | return 0; | 205 | return 0; |
205 | size -= size_hsa; | 206 | size -= size_hsa; |
@@ -238,9 +239,9 @@ int copy_from_oldmem(void *dest, void *src, size_t count) | |||
238 | return rc; | 239 | return rc; |
239 | } | 240 | } |
240 | } else { | 241 | } else { |
241 | if ((unsigned long) src < ZFCPDUMP_HSA_SIZE) { | 242 | unsigned long hsa_end = sclp_get_hsa_size(); |
242 | copied = min(count, | 243 | if ((unsigned long) src < hsa_end) { |
243 | ZFCPDUMP_HSA_SIZE - (unsigned long) src); | 244 | copied = min(count, hsa_end - (unsigned long) src); |
244 | rc = memcpy_hsa(dest, (unsigned long) src, copied, 0); | 245 | rc = memcpy_hsa(dest, (unsigned long) src, copied, 0); |
245 | if (rc) | 246 | if (rc) |
246 | return rc; | 247 | return rc; |
@@ -580,6 +581,9 @@ int elfcorehdr_alloc(unsigned long long *addr, unsigned long long *size) | |||
580 | /* If elfcorehdr= has been passed via cmdline, we use that one */ | 581 | /* If elfcorehdr= has been passed via cmdline, we use that one */ |
581 | if (elfcorehdr_addr != ELFCORE_ADDR_MAX) | 582 | if (elfcorehdr_addr != ELFCORE_ADDR_MAX) |
582 | return 0; | 583 | return 0; |
584 | /* If we cannot get HSA size for zfcpdump return error */ | ||
585 | if (ipl_info.type == IPL_TYPE_FCP_DUMP && !sclp_get_hsa_size()) | ||
586 | return -ENODEV; | ||
583 | mem_chunk_cnt = get_mem_chunk_cnt(); | 587 | mem_chunk_cnt = get_mem_chunk_cnt(); |
584 | 588 | ||
585 | alloc_size = 0x1000 + get_cpu_cnt() * 0x300 + | 589 | alloc_size = 0x1000 + get_cpu_cnt() * 0x300 + |