*
* 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
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;