From 6127bd73bde6c4265a2ac403203e24a11c582cc5 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 18 Jan 2010 14:48:18 +0000 Subject: minios: implement xc_map_foreign_bulk In order to do so it modifies map_frames_ex and do_map_frames to take an int *err as parameter and return any error that way. Signed-off-by: Stefano Stabellini --- extras/mini-os/arch/ia64/mm.c | 8 ++++---- extras/mini-os/arch/x86/ioremap.c | 2 +- extras/mini-os/arch/x86/mm.c | 21 +++++++++++---------- 3 files changed, 16 insertions(+), 15 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 b171f75dc3..9040517fc2 100644 --- a/extras/mini-os/arch/ia64/mm.c +++ b/extras/mini-os/arch/ia64/mm.c @@ -137,17 +137,17 @@ unsigned long allocate_ondemand(unsigned long n, unsigned long alignment) /* Helper function used in gnttab.c. */ void do_map_frames(unsigned long addr, - unsigned long *f, unsigned long n, unsigned long stride, - unsigned long increment, domid_t id, int may_fail, unsigned long prot) + const unsigned long *f, unsigned long n, unsigned long stride, + unsigned long increment, domid_t id, int *err, unsigned long prot) { /* TODO */ ASSERT(0); } void* -map_frames_ex(unsigned long* frames, unsigned long n, unsigned long stride, +map_frames_ex(const unsigned long* frames, unsigned long n, unsigned long stride, unsigned long increment, unsigned long alignment, domid_t id, - int may_fail, unsigned long prot) + int *err, unsigned long prot) { /* TODO: incomplete! */ ASSERT(n == 1 || (stride == 0 && increment == 1)); diff --git a/extras/mini-os/arch/x86/ioremap.c b/extras/mini-os/arch/x86/ioremap.c index f55d9e078e..c7f818609c 100644 --- a/extras/mini-os/arch/x86/ioremap.c +++ b/extras/mini-os/arch/x86/ioremap.c @@ -53,7 +53,7 @@ static void *__do_ioremap(unsigned long phys_addr, unsigned long size, } } va = (unsigned long)map_frames_ex(&mfns, num_pages, 0, 1, 1, - DOMID_IO, 0, prot); + DOMID_IO, NULL, prot); return (void *)(va + offset); mfn_invalid: diff --git a/extras/mini-os/arch/x86/mm.c b/extras/mini-os/arch/x86/mm.c index 8d688fc25a..cb7f037477 100644 --- a/extras/mini-os/arch/x86/mm.c +++ b/extras/mini-os/arch/x86/mm.c @@ -568,10 +568,9 @@ unsigned long allocate_ondemand(unsigned long n, unsigned long alignment) */ #define MAP_BATCH ((STACK_SIZE / 2) / sizeof(mmu_update_t)) void do_map_frames(unsigned long va, - unsigned long *mfns, unsigned long n, + const unsigned long *mfns, unsigned long n, unsigned long stride, unsigned long incr, - domid_t id, int may_fail, - unsigned long prot) + domid_t id, int *err, unsigned long prot) { pgentry_t *pgt = NULL; unsigned long done = 0; @@ -585,12 +584,14 @@ void do_map_frames(unsigned long va, } DEBUG("va=%p n=0x%lx, mfns[0]=0x%lx stride=0x%lx incr=0x%lx prot=0x%lx\n", va, n, mfns[0], stride, incr, prot); - + + if ( err ) + memset(err, 0x00, n * sizeof(int)); while ( done < n ) { unsigned long todo; - if ( may_fail ) + if ( err ) todo = 1; else todo = n - done; @@ -615,8 +616,8 @@ void do_map_frames(unsigned long va, rc = HYPERVISOR_mmu_update(mmu_updates, todo, NULL, id); if ( rc < 0 ) { - if (may_fail) - mfns[done * stride] |= 0xF0000000; + if (err) + err[done * stride] = rc; else { printk("Map %ld (%lx, ...) at %p failed: %d.\n", todo, mfns[done * stride] + done * incr, va, rc); @@ -632,17 +633,17 @@ void do_map_frames(unsigned long va, * Map an array of MFNs contiguous into virtual address space. Virtual * addresses are allocated from the on demand area. */ -void *map_frames_ex(unsigned long *mfns, unsigned long n, +void *map_frames_ex(const unsigned long *mfns, unsigned long n, unsigned long stride, unsigned long incr, unsigned long alignment, - domid_t id, int may_fail, unsigned long prot) + domid_t id, int *err, unsigned long prot) { unsigned long va = allocate_ondemand(n, alignment); if ( !va ) return NULL; - do_map_frames(va, mfns, n, stride, incr, id, may_fail, prot); + do_map_frames(va, mfns, n, stride, incr, id, err, prot); return (void *)va; } -- cgit v1.2.3