diff options
author | Jan Beulich <jbeulich@suse.com> | 2012-11-22 10:47:58 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2012-11-22 10:47:58 +0100 |
commit | d0d4635d034f202bb401a6efa3ba61530f3854ab (patch) | |
tree | 3f2582ada49966c66898d6fdf8568e81098595f7 /xen/arch/x86/mm.c | |
parent | 7bdfb850aecdf43e2723e0a6c4415d6a81d4d187 (diff) | |
download | xen-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.c | 27 |
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) |