/*
* Copyright (c) 2009, 2010, 2011, ETH Zurich.
+ * Copyright (c) 2014, HP Labs.
* All rights reserved.
*
* This file is distributed under the terms in the attached LICENSE file.
* If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
+ * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
*/
#include <barrelfish/barrelfish.h>
*
* Pagefault relies on frames inserted in order
*/
-static errval_t fill(struct memobj *memobj, genvaddr_t offset, struct capref frame,
- size_t size)
+static errval_t fill_foff(struct memobj *memobj, genvaddr_t offset, struct capref frame,
+ size_t size, genpaddr_t foffset)
{
errval_t err;
struct memobj_anon *anon = (struct memobj_anon*)memobj;
return LIB_ERR_SLAB_ALLOC_FAIL;
}
}
- new->offset = offset;
- new->frame = frame;
- new->size = size;
+ new->offset = offset;
+ new->frame = frame;
+ new->size = size;
+ new->foffset = foffset;
+
+ {
+ struct frame_identity id;
+ err = invoke_frame_identify(frame, &id);
+ assert(err_is_ok(err));
+ new->pa = id.base;
+ }
// Insert in order
struct memobj_frame_list *walk = anon->frame_list;
}
return SYS_ERR_OK;
}
+static errval_t fill(struct memobj *memobj, genvaddr_t offset, struct capref frame,
+ size_t size)
+{
+ return fill_foff(memobj, offset, frame, size, 0);
+}
/**
* \brief Unmap/remove one frame from the end of the memobj
}
// Return the frame
- *ret_offset = fwalk->offset;
- *ret_frame = fwalk->frame;
+ if (ret_offset) {
+ *ret_offset = fwalk->offset;
+ }
+ if (ret_frame) {
+ *ret_frame = fwalk->frame;
+ }
if (fprev) {
fprev->next = fwalk->next;
} else {
genvaddr_t vregion_off = vregion_get_offset(vregion);
vregion_flags_t flags = vregion_get_flags(vregion);
err = pmap->f.map(pmap, base + vregion_off + walk->offset,
- walk->frame, 0, walk->size, flags, NULL, NULL);
+ walk->frame, walk->foffset, walk->size, flags,
+ NULL, NULL);
if (err_is_fail(err)) {
return err_push(err, LIB_ERR_PMAP_MAP);
}
memobj->f.pin = pin;
memobj->f.unpin = unpin;
memobj->f.fill = fill;
+ memobj->f.fill_foff = fill_foff;
memobj->f.unfill = unfill;
memobj->f.pagefault = pagefault;
memobj->f.pager_free = pager_free;