shortcut in protect for single page operations
authorMoritz Hoffmann <moritzho@inf.ethz.ch>
Fri, 13 Mar 2015 10:16:26 +0000 (11:16 +0100)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Thu, 11 Jun 2015 15:49:39 +0000 (17:49 +0200)
Signed-off-by: Moritz Hoffmann <moritzho@inf.ethz.ch>

lib/barrelfish/vspace/memobj_anon.c

index f4db574..36dff0f 100644 (file)
@@ -147,13 +147,26 @@ static errval_t protect(struct memobj *memobj, struct vregion *vregion,
     struct pmap *pmap     = vspace_get_pmap(vspace);
     genvaddr_t vregion_base  = vregion_get_base_addr(vregion);
     genvaddr_t vregion_off   = vregion_get_offset(vregion);
-    //size_t vregion_size = vregion_get_size(vregion);
-    //genvaddr_t vregion_end = vregion_off + vregion_size;
+    size_t vregion_size = vregion_get_size(vregion);
+    genvaddr_t vregion_end = vregion_off + vregion_size;
 
     //printf("(%s:%d) protect(0x%"PRIxGENVADDR", memobj->size = %zd) vregion size = %zd offset=%zd range=%zd\n", __FILE__, __LINE__, vregion_base + vregion_off, memobj->size, vregion_size, offset, range);
 
+    if (offset + range >= vregion_end) {
+        return LIB_ERR_MEMOBJ_WRONG_OFFSET;
+    }
+
     offset += vregion_off;
 
+    // Special handling if the range cannot span frames
+    if (range <= BASE_PAGE_SIZE) {
+        err = pmap->f.modify_flags(pmap, vregion_base + offset, range, flags, NULL);
+        if (err_is_fail(err)) {
+            return err_push(err, LIB_ERR_PMAP_MODIFY_FLAGS);
+        }
+        return SYS_ERR_OK;
+    }
+
     // protect all affected frames
     struct memobj_frame_list *fwalk = anon->frame_list;
     //printf("vregion_off = 0x%"PRIxGENVADDR"\n", vregion_off);