Add map_domain_pages/unmap_domain_pages to map contiguous

multi-franme extents of domain memory.

Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
kaf24@firebug.cl.cam.ac.uk committed 2005-12-06 15:52:51 +01:00
1 parent b8477f0215
commit ee694618a7
2 files changed
+25 -16

No files matched your search

+14 -8
View File
@@ -40,10 +40,10 @@ static void flush_all_ready_maps(void)
cache[i] = l1e_empty();
}
void *map_domain_page(unsigned long pfn)
void *map_domain_pages(unsigned long pfn, unsigned int order)
{
unsigned long va;
unsigned int idx, cpu = smp_processor_id();
unsigned int idx, i, flags, cpu = smp_processor_id();
l1_pgentry_t *cache = mapcache;
#ifndef NDEBUG
unsigned int flush_count = 0;
@@ -72,10 +72,15 @@ void *map_domain_page(unsigned long pfn)
local_flush_tlb();
shadow_epoch[cpu] = ++epoch;
}
}
while ( l1e_get_flags(cache[idx]) & _PAGE_PRESENT );
cache[idx] = l1e_from_pfn(pfn, __PAGE_HYPERVISOR);
flags = 0;
for ( i = 0; i < (1U << order); i++ )
flags |= l1e_get_flags(cache[idx+i]);
}
while ( flags & _PAGE_PRESENT );
for ( i = 0; i < (1U << order); i++ )
cache[idx+i] = l1e_from_pfn(pfn+i, __PAGE_HYPERVISOR);
spin_unlock(&map_lock);
@@ -83,11 +88,12 @@ void *map_domain_page(unsigned long pfn)
return (void *)va;
}
void unmap_domain_page(void *va)
void unmap_domain_pages(void *va, unsigned int order)
{
unsigned int idx;
unsigned int idx, i;
ASSERT((void *)MAPCACHE_VIRT_START <= va);
ASSERT(va < (void *)MAPCACHE_VIRT_END);
idx = ((unsigned long)va - MAPCACHE_VIRT_START) >> PAGE_SHIFT;
l1e_add_flags(mapcache[idx], READY_FOR_TLB_FLUSH);
for ( i = 0; i < (1U << order); i++ )
l1e_add_flags(mapcache[idx+i], READY_FOR_TLB_FLUSH);
}
+11 -8
View File
@@ -10,19 +10,22 @@
#include <xen/config.h>
#include <xen/mm.h>
#define map_domain_page(pfn) map_domain_pages(pfn,0)
#define unmap_domain_page(va) unmap_domain_pages(va,0)
#ifdef CONFIG_DOMAIN_PAGE
/*
* Maps a given page frame, returning the mmap'ed virtual address. The page is
* now accessible until a corresponding call to unmap_domain_page().
* Maps a given range of page frames, returning the mapped virtual address. The
* pages are now accessible until a corresponding call to unmap_domain_page().
*/
extern void *map_domain_page(unsigned long pfn);
extern void *map_domain_pages(unsigned long pfn, unsigned int order);
/*
* Pass a VA within a page previously mapped with map_domain_page().
* That page will then be removed from the mapping lists.
* Pass a VA within the first page of a range previously mapped with
* map_omain_pages(). Those pages will then be removed from the mapping lists.
*/
extern void unmap_domain_page(void *va);
extern void unmap_domain_pages(void *va, unsigned int order);
#define DMCACHE_ENTRY_VALID 1U
#define DMCACHE_ENTRY_HELD 2U
@@ -84,8 +87,8 @@ domain_mmap_cache_destroy(struct domain_mmap_cache *cache)
#else /* !CONFIG_DOMAIN_PAGE */
#define map_domain_page(pfn) phys_to_virt((pfn)<<PAGE_SHIFT)
#define unmap_domain_page(va) ((void)(va))
#define map_domain_pages(pfn,order) phys_to_virt((pfn)<<PAGE_SHIFT)
#define unmap_domain_pages(va,order) ((void)((void)(va),(void)(order)))
struct domain_mmap_cache {
};
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.