From ca28885fa775d60ad15575f58930c138141e682f Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Fri, 18 Jul 2008 15:45:06 +0100 Subject: mini-os: export allocate_ondemand allocate_ondemand can be used to allocate addresse space. Primarily used for mapping MFNs, it can also be used e.g. to map grant refs. Signed-off-by: Samuel Thibault --- extras/mini-os/arch/ia64/mm.c | 5 +++++ extras/mini-os/arch/x86/mm.c | 21 +++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) (limited to 'extras/mini-os/arch') diff --git a/extras/mini-os/arch/ia64/mm.c b/extras/mini-os/arch/ia64/mm.c index 273430da8b..916e2f610b 100644 --- a/extras/mini-os/arch/ia64/mm.c +++ b/extras/mini-os/arch/ia64/mm.c @@ -130,6 +130,11 @@ arch_init_demand_mapping_area(unsigned long max_pfn) max_pfn = max_pfn; } +unsigned long allocate_ondemand(unsigned long n, unsigned long alignment) +{ + return 0; +} + /* Helper function used in gnttab.c. */ void do_map_frames(unsigned long addr, unsigned long *f, unsigned long n, unsigned long stride, diff --git a/extras/mini-os/arch/x86/mm.c b/extras/mini-os/arch/x86/mm.c index e528647ca8..b1c0084fe7 100644 --- a/extras/mini-os/arch/x86/mm.c +++ b/extras/mini-os/arch/x86/mm.c @@ -492,9 +492,7 @@ void do_map_frames(unsigned long addr, } } -void *map_frames_ex(unsigned long *f, unsigned long n, unsigned long stride, - unsigned long increment, unsigned long alignment, domid_t id, - int may_fail, unsigned long prot) +unsigned long allocate_ondemand(unsigned long n, unsigned long alignment) { unsigned long x; unsigned long y = 0; @@ -517,13 +515,24 @@ void *map_frames_ex(unsigned long *f, unsigned long n, unsigned long stride, } if (y != n) { printk("Failed to find %ld frames!\n", n); - return NULL; + return 0; } + return demand_map_area_start + x * PAGE_SIZE; +} + +void *map_frames_ex(unsigned long *f, unsigned long n, unsigned long stride, + unsigned long increment, unsigned long alignment, domid_t id, + int may_fail, unsigned long prot) +{ + unsigned long addr = allocate_ondemand(n, alignment); + + if (!addr) + return NULL; /* Found it at x. Map it in. */ - do_map_frames(demand_map_area_start + x * PAGE_SIZE, f, n, stride, increment, id, may_fail, prot); + do_map_frames(addr, f, n, stride, increment, id, may_fail, prot); - return (void *)(unsigned long)(demand_map_area_start + x * PAGE_SIZE); + return (void *)addr; } static void clear_bootstrap(void) -- cgit v1.2.3