x86_64: cleaned up corner cases in pmap code.
authorSimon Gerber <simon.gerber@hp.com>
Tue, 15 Jul 2014 01:51:37 +0000 (18:51 -0700)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Mon, 4 May 2015 09:28:13 +0000 (11:28 +0200)
Signed-off-by: Simon Gerber <simon.gerber@hp.com>

lib/barrelfish/target/x86/pmap_x86.c
lib/barrelfish/target/x86_64/pmap_target.c
lib/barrelfish/vspace/memobj_anon.c

index 49ec264..bbce91d 100644 (file)
@@ -38,6 +38,10 @@ bool has_vnode(struct vnode *root, uint32_t entry, size_t len,
                 return has_vnode(n, 0, PTABLE_SIZE, true);
             }
             return true;
+        } else if (n->is_vnode) {
+            // all other vnodes do not overlap with us, so go to next
+            assert(n->entry < entry || n->entry >= end_entry);
+            continue;
         }
         // this remains the same regardless of `only_pages`.
         // n is frame [n->entry .. end)
@@ -168,6 +172,10 @@ void remove_empty_vnodes(struct pmap_x86 *pmap, struct vnode *root,
     uint32_t end_entry = entry + len;
     for (struct vnode *n = root->u.vnode.children; n; n = n->next) {
         if (n->entry >= entry && n->entry < end_entry) {
+            // sanity check and skip leaf entries
+            if (!n->is_vnode) {
+                continue;
+            }
             // here we know that all vnodes we're interested in are
             // page tables
             assert(n->is_vnode);
index e4e1f21..316c4cf 100644 (file)
@@ -211,6 +211,12 @@ static errval_t do_single_map(struct pmap_x86 *pmap, genvaddr_t vaddr,
                               size_t offset, size_t pte_count,
                               vregion_flags_t flags)
 {
+    if (pte_count == 0) {
+        debug_printf("do_single_map: pte_count == 0, called from %p\n",
+                __builtin_return_address(0));
+        return SYS_ERR_OK;
+    }
+    assert(pte_count > 0);
     // translate flags
     paging_x86_64_flags_t pmap_flags = vregion_to_pmap_flag(flags);
 
index 0c5c03a..57ffba7 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>
@@ -316,8 +317,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 {