libbarrelfish: memobj: add optional frame offset to anonymous memobjs.
authorSimon Gerber <simon.gerber@inf.ethz.ch>
Mon, 12 Jan 2015 16:16:12 +0000 (17:16 +0100)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Mon, 12 Jan 2015 16:32:33 +0000 (17:32 +0100)
include/barrelfish/memobj.h
lib/barrelfish/vspace/memobj_anon.c

index b35de46..4ea0b92 100644 (file)
@@ -47,6 +47,8 @@ struct memobj_funcs {
                       genvaddr_t offset, size_t range);
     errval_t (*fill)(struct memobj *memobj, genvaddr_t offset, struct capref frame,
                      size_t size);
+    errval_t (*fill_foff)(struct memobj *memobj, genvaddr_t offset, struct capref frame,
+                     size_t size, genpaddr_t foffset);
     errval_t (*unfill)(struct memobj *memobj, genvaddr_t offset,
                        struct capref *ret_frame, genvaddr_t *ret_offset);
     errval_t (*pagefault)(struct memobj* memobj, struct vregion* region,
@@ -99,6 +101,7 @@ struct memobj_frame_list {
     struct capref frame;            ///< Capability of the frame
     size_t size;                    ///< Size of the frame
     genpaddr_t pa;                  ///< XXX: physical address of frame
+    genpaddr_t foffset;             ///< Offset into frame
     struct memobj_frame_list *next;
 };
 
index ad14cc3..1a94c55 100644 (file)
@@ -191,8 +191,8 @@ static errval_t unpin(struct memobj *memobj, struct vregion *vregion,
  *
  * 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;
@@ -220,9 +220,10 @@ static errval_t fill(struct memobj *memobj, genvaddr_t offset, struct capref fra
             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;
@@ -267,6 +268,11 @@ static errval_t fill(struct memobj *memobj, genvaddr_t offset, struct capref fra
     }
     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
@@ -361,7 +367,8 @@ static errval_t pagefault(struct memobj *memobj, struct vregion *vregion,
             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);
             }
@@ -411,6 +418,7 @@ errval_t memobj_create_anon(struct memobj_anon *anon, size_t size,
     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;