/* Allocate one page for the pdp and the second for the code */
 #define KEXEC_CONTROL_PAGE_SIZE 4096
 
+/* Alignment of crashkernel memory */
+#define KEXEC_CRASH_MEM_ALIGN HPAGE_SIZE
+
 /* The native architecture */
 #define KEXEC_ARCH KEXEC_ARCH_S390
 
 
 #endif
 }
 
+/*
+ * Map or unmap crashkernel memory
+ */
+static void crash_map_pages(int enable)
+{
+       unsigned long size = resource_size(&crashk_res);
+
+       BUG_ON(crashk_res.start % KEXEC_CRASH_MEM_ALIGN ||
+              size % KEXEC_CRASH_MEM_ALIGN);
+       if (enable)
+               vmem_add_mapping(crashk_res.start, size);
+       else
+               vmem_remove_mapping(crashk_res.start, size);
+}
+
+/*
+ * Map crashkernel memory
+ */
+void crash_map_reserved_pages(void)
+{
+       crash_map_pages(1);
+}
+
+/*
+ * Unmap crashkernel memory
+ */
+void crash_unmap_reserved_pages(void)
+{
+       crash_map_pages(0);
+}
+
 /*
  * Give back memory to hypervisor before new kdump is loaded
  */
 
                res->flags = IORESOURCE_BUSY | IORESOURCE_MEM;
                switch (memory_chunk[i].type) {
                case CHUNK_READ_WRITE:
+               case CHUNK_CRASHK:
                        res->name = "System RAM";
                        break;
                case CHUNK_READ_ONLY:
                               &crash_base);
        if (rc || crash_size == 0)
                return;
-       crash_base = PAGE_ALIGN(crash_base);
-       crash_size = PAGE_ALIGN(crash_size);
+       crash_base = ALIGN(crash_base, KEXEC_CRASH_MEM_ALIGN);
+       crash_size = ALIGN(crash_size, KEXEC_CRASH_MEM_ALIGN);
        if (register_memory_notifier(&kdump_mem_nb))
                return;
        if (!crash_base)
        crashk_res.start = crash_base;
        crashk_res.end = crash_base + crash_size - 1;
        insert_resource(&iomem_resource, &crashk_res);
-       reserve_kdump_bootmem(crash_base, crash_size, CHUNK_READ_WRITE);
+       reserve_kdump_bootmem(crash_base, crash_size, CHUNK_CRASHK);
        pr_info("Reserving %lluMB of memory at %lluMB "
                "for crashkernel (System RAM: %luMB)\n",
                crash_size >> 20, crash_base >> 20, memory_end >> 20);
        for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) {
                unsigned long start_chunk, end_chunk, pfn;
 
-               if (memory_chunk[i].type != CHUNK_READ_WRITE)
+               if (memory_chunk[i].type != CHUNK_READ_WRITE &&
+                   memory_chunk[i].type != CHUNK_CRASHK)
                        continue;
                start_chunk = PFN_DOWN(memory_chunk[i].addr);
                end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size);