#include <asm/xen/hypervisor.h>
 #include <xen/balloon.h>
 #include <xen/grant_table.h>
+#include <xen/hvc-console.h>
 
 #include "xen-ops.h"
 
        return ret;
 }
 
+/* Remapped non-RAM areas */
+#define NR_NONRAM_REMAP 4
+static struct nonram_remap {
+       phys_addr_t maddr;
+       phys_addr_t paddr;
+       size_t size;
+} xen_nonram_remap[NR_NONRAM_REMAP] __ro_after_init;
+static unsigned int nr_nonram_remap __ro_after_init;
+
+/*
+ * Do the real remapping of non-RAM regions as specified in the
+ * xen_nonram_remap[] array.
+ * In case of an error just crash the system.
+ */
+void __init xen_do_remap_nonram(void)
+{
+       unsigned int i;
+       unsigned int remapped = 0;
+       const struct nonram_remap *remap = xen_nonram_remap;
+       unsigned long pfn, mfn, end_pfn;
+
+       for (i = 0; i < nr_nonram_remap; i++) {
+               end_pfn = PFN_UP(remap->paddr + remap->size);
+               pfn = PFN_DOWN(remap->paddr);
+               mfn = PFN_DOWN(remap->maddr);
+               while (pfn < end_pfn) {
+                       if (!set_phys_to_machine(pfn, mfn))
+                               panic("Failed to set p2m mapping for pfn=%lx mfn=%lx\n",
+                                      pfn, mfn);
+
+                       pfn++;
+                       mfn++;
+                       remapped++;
+               }
+
+               remap++;
+       }
+
+       pr_info("Remapped %u non-RAM page(s)\n", remapped);
+}
+
+/*
+ * Add a new non-RAM remap entry.
+ * In case of no free entry found, just crash the system.
+ */
+void __init xen_add_remap_nonram(phys_addr_t maddr, phys_addr_t paddr,
+                                unsigned long size)
+{
+       BUG_ON((maddr & ~PAGE_MASK) != (paddr & ~PAGE_MASK));
+
+       if (nr_nonram_remap == NR_NONRAM_REMAP) {
+               xen_raw_console_write("Number of required E820 entry remapping actions exceed maximum value\n");
+               BUG();
+       }
+
+       xen_nonram_remap[nr_nonram_remap].maddr = maddr;
+       xen_nonram_remap[nr_nonram_remap].paddr = paddr;
+       xen_nonram_remap[nr_nonram_remap].size = size;
+
+       nr_nonram_remap++;
+}
+
 #ifdef CONFIG_XEN_DEBUG_FS
 #include <linux/debugfs.h>
 static int p2m_dump_show(struct seq_file *m, void *v)