T258: libspawndomain: fix segment cnode and page cnode creation to work in two-level...
authorSimon Gerber <simon.gerber@inf.ethz.ch>
Thu, 7 Jul 2016 13:34:37 +0000 (15:34 +0200)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Thu, 7 Jul 2016 13:34:37 +0000 (15:34 +0200)
Signed-off-by: Simon Gerber <simon.gerber@inf.ethz.ch>

errors/errno.fugu
lib/spawndomain/arch/x86/spawn_arch.c
lib/spawndomain/spawn.c

index 320fe97..85f5729 100755 (executable)
@@ -570,6 +570,9 @@ errors spawn SPAWN_ERR_ {
     failure CREATE_FDSPG        "Failure creating page for file descriptors",
     failure MINT_ROOTCN         "Failure minting root CNode into task CNode",
     failure CREATE_SLOTALLOC_CNODE "Failure creating slot_alloc cnode",
+    failure MINT_BASE_PAGE_CN   "Failure minting base page CNode into root CNode",
+    failure MINT_SEGCN          "Failure minting segment CNode into root CNode",
+    failure MINT_PAGECN         "Failure minting page CNode into root CNode",
 
     // setup_vspace
     failure MAP_DISPATCHER_TO_NEW "Failure mapping dispatcher frame to new domain",
index d9a25b4..5d2514e 100644 (file)
@@ -238,12 +238,18 @@ errval_t spawn_arch_load(struct spawninfo *si,
         .cnode = si->rootcn,
         .slot  = ROOTCN_SLOT_SEGCN,
     };
-    // XXX: this code assumes that elf_load never needs more than 32 slots for
+    struct capref local_cnode_cap;
+    // XXX: this code assumes that elf_load never needs more than 256 slots for
     // text frame capabilities.
-    err = cnode_create_raw(cnode_cap, &si->segcn, DEFAULT_CNODE_SLOTS, NULL);
+    err = cnode_create_l2(&local_cnode_cap, &si->segcn);
     if (err_is_fail(err)) {
         return err_push(err, SPAWN_ERR_CREATE_SEGCN);
     }
+    // Mint SegCN into new domain's cspace
+    err = cap_mint(cnode_cap, local_cnode_cap, 0, 0);
+    if (err_is_fail(err)) {
+        return err_push(err, SPAWN_ERR_MINT_SEGCN);
+    }
 
     // Load the binary
     si->tls_init_base = 0;
index 8dfeb98..4dcd0bd 100644 (file)
@@ -156,7 +156,7 @@ static errval_t spawn_setup_cspace(struct spawninfo *si)
     t1.slot  = ROOTCN_SLOT_BASE_PAGE_CN;
     err = cap_mint(t1, basecn_cap, 0, 0);
     if (err_is_fail(err)) {
-        return err_push(err, LIB_ERR_CAP_COPY);
+        return err_push(err, SPAWN_ERR_MINT_BASE_PAGE_CN);
     }
 
     return SYS_ERR_OK;
@@ -167,12 +167,18 @@ static errval_t spawn_setup_vspace(struct spawninfo *si)
     errval_t err;
 
     /* Create pagecn */
-    si->pagecn_cap = (struct capref){.cnode = si->rootcn, .slot = ROOTCN_SLOT_PAGECN};
-    err = cnode_create_raw(si->pagecn_cap, &si->pagecn, PAGE_CNODE_SLOTS, NULL);
+    err = cnode_create_l2(&si->pagecn_cap, &si->pagecn);
     if (err_is_fail(err)) {
         return err_push(err, SPAWN_ERR_CREATE_PAGECN);
     }
 
+    /* Mint pagecn into si->rootcn */
+    struct capref pagecn = (struct capref){.cnode = si->rootcn, .slot = ROOTCN_SLOT_PAGECN};
+    err = cap_mint(pagecn, si->pagecn_cap, 0, 0);
+    if (err_is_fail(err)) {
+        return err_push(err, SPAWN_ERR_MINT_PAGECN);
+    }
+
     /* Init pagecn's slot allocator */
 
     // XXX: satisfy a peculiarity of the single_slot_alloc_init_raw API