aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/mm.c
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2012-11-22 10:47:58 +0100
committerJan Beulich <jbeulich@suse.com>2012-11-22 10:47:58 +0100
commitd0d4635d034f202bb401a6efa3ba61530f3854ab (patch)
tree3f2582ada49966c66898d6fdf8568e81098595f7 /xen/arch/x86/mm.c
parent7bdfb850aecdf43e2723e0a6c4415d6a81d4d187 (diff)
downloadxen-d0d4635d034f202bb401a6efa3ba61530f3854ab.tar.gz
xen-d0d4635d034f202bb401a6efa3ba61530f3854ab.tar.bz2
xen-d0d4635d034f202bb401a6efa3ba61530f3854ab.zip
implement vmap()
... and use it as basis for a proper ioremap() on x86. Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/mm.c')
-rw-r--r--xen/arch/x86/mm.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index fad3d33d03..ab94b022c6 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -100,6 +100,7 @@
#include <xen/iocap.h>
#include <xen/guest_access.h>
#include <xen/pfn.h>
+#include <xen/vmap.h>
#include <xen/xmalloc.h>
#include <xen/efi.h>
#include <xen/grant_table.h>
@@ -5460,6 +5461,32 @@ void __set_fixmap(
map_pages_to_xen(fix_to_virt(idx), mfn, 1, flags);
}
+void *__init arch_vmap_virt_end(void)
+{
+ return (void *)fix_to_virt(__end_of_fixed_addresses);
+}
+
+void __iomem *ioremap(paddr_t pa, size_t len)
+{
+ unsigned long pfn = PFN_DOWN(pa);
+ void *va;
+
+ WARN_ON(page_is_ram_type(pfn, RAM_TYPE_CONVENTIONAL));
+
+ /* The low first Mb is always mapped. */
+ if ( !((pa + len - 1) >> 20) )
+ va = __va(pa);
+ else
+ {
+ unsigned int offs = pa & (PAGE_SIZE - 1);
+ unsigned int nr = PFN_UP(offs + len);
+
+ va = __vmap(&pfn, nr, 1, 1, PAGE_HYPERVISOR_NOCACHE) + offs;
+ }
+
+ return (void __force __iomem *)va;
+}
+
#ifdef MEMORY_GUARD
void memguard_init(void)