Merge large page support code.
[barrelfish] / lib / barrelfish / vspace / memobj_anon.c
index 0c5c03a..56e3fc6 100644 (file)
 
 /*
  * 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>
@@ -191,8 +192,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 +221,17 @@ 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;
+        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;
@@ -260,6 +269,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
@@ -316,8 +330,12 @@ static errval_t unfill(struct memobj *memobj, genvaddr_t offset,
     }
 
     // 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 {
@@ -354,7 +372,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);
             }
@@ -404,6 +423,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;