/*
  * Initialize dump globals for a given architecture
  */
-static int __init sys_info_init(enum arch_id arch)
+static int __init sys_info_init(enum arch_id arch, unsigned long mem_end)
 {
        int rc;
 
        rc = init_cpu_info(arch);
        if (rc)
                return rc;
-       sys_info.mem_size = real_memory_size;
+       sys_info.mem_size = mem_end;
 
        return 0;
 }
        return 0;
 }
 
-static int __init get_mem_size(unsigned long *mem)
+static int __init get_mem_info(unsigned long *mem, unsigned long *end)
 {
        int i;
        struct mem_chunk *chunk_array;
                if (chunk_array[i].size == 0)
                        break;
                *mem += chunk_array[i].size;
+               *end = max(*end, chunk_array[i].addr + chunk_array[i].size);
        }
        kfree(chunk_array);
        return 0;
 }
 
-static int __init zcore_header_init(int arch, struct zcore_header *hdr)
+static void __init zcore_header_init(int arch, struct zcore_header *hdr,
+                                    unsigned long mem_size)
 {
-       int rc, i;
-       unsigned long memory = 0;
        u32 prefix;
+       int i;
 
        if (arch == ARCH_S390X)
                hdr->arch_id = DUMP_ARCH_S390X;
        else
                hdr->arch_id = DUMP_ARCH_S390;
-       rc = get_mem_size(&memory);
-       if (rc)
-               return rc;
-       hdr->mem_size = memory;
-       hdr->rmem_size = memory;
+       hdr->mem_size = mem_size;
+       hdr->rmem_size = mem_size;
        hdr->mem_end = sys_info.mem_size;
-       hdr->num_pages = memory / PAGE_SIZE;
+       hdr->num_pages = mem_size / PAGE_SIZE;
        hdr->tod = get_tod_clock();
        get_cpu_id(&hdr->cpu_id);
        for (i = 0; zfcpdump_save_areas[i]; i++) {
                hdr->lc_vec[hdr->cpu_cnt] = prefix;
                hdr->cpu_cnt++;
        }
-       return 0;
 }
 
 /*
 
 static int __init zcore_init(void)
 {
+       unsigned long mem_size, mem_end;
        unsigned char arch;
        int rc;
 
+       mem_size = mem_end = 0;
        if (ipl_info.type != IPL_TYPE_FCP_DUMP)
                return -ENODATA;
        if (OLDMEM_BASE)
        }
 #endif /* CONFIG_64BIT */
 
-       rc = sys_info_init(arch);
+       rc = get_mem_info(&mem_size, &mem_end);
        if (rc)
                goto fail;
 
-       rc = zcore_header_init(arch, &zcore_header);
+       rc = sys_info_init(arch, mem_end);
        if (rc)
                goto fail;
+       zcore_header_init(arch, &zcore_header, mem_size);
 
        rc = zcore_reipl_init();
        if (rc)