Merge large page support code.
[barrelfish] / lib / barrelfish / init.c
index 86b169b..9c134d2 100644 (file)
@@ -53,13 +53,17 @@ void libc_exit(int status)
 
     // Use spawnd if spawned through spawnd
     if(disp_get_domain_id() == 0) {
-        errval_t err = cap_revoke(cap_dispatcher);
+#if 0 // XXX: revocation goes through the mon, but monitor ep is revoked in the process
+        err = cap_revoke(cap_dispatcher);
         if (err_is_fail(err)) {
-           sys_print("revoking dispatcher failed in _Exit, spinning!", 100);
+            DEBUG_ERR(err, "revoking dispatcher failed in _Exit, spinning!");
+           //sys_print("revoking dispatcher failed in _Exit, spinning!", 100);
            while (1) {}
         }
         err = cap_delete(cap_dispatcher);
-        sys_print("deleting dispatcher failed in _Exit, spinning!", 100);
+        DEBUG_ERR(err, "deleting dispatcher failed in _Exit, spinning!");
+        //sys_print("deleting dispatcher failed in _Exit, spinning!", 100);
+#endif
 
         // XXX: Leak all other domain allocations
     } else {
@@ -69,6 +73,7 @@ void libc_exit(int status)
         }
     }
 
+    thread_exit(status);
     // If we're not dead by now, we wait
     while (1) {}
 }
@@ -331,6 +336,19 @@ errval_t barrelfish_init_onthread(struct spawn_domain_params *params)
         return err_push(err, LIB_ERR_DOMAIN_INIT);
     }
 
+    // XXX: Record text/data mappings from environment
+    char *p = getenv("ARRAKIS_PMAP");
+    if(p != NULL) {
+        struct morecore_state *mcstate = get_morecore_state();
+        for(mcstate->v2p_entries = 0; *p != '\0'; mcstate->v2p_entries++) {
+            assert(mcstate->v2p_entries < MAX_V2P_MAPPINGS);
+            struct v2pmap *e = &mcstate->v2p_mappings[mcstate->v2p_entries];
+            int r = sscanf(p, "%" PRIxGENVADDR ":%" PRIxGENPADDR ":%zx ", &e->va, &e->pa, &e->size);
+            assert(r == 3);
+            p = strchr(p, ' ') + 1;
+        }
+    }
+
     return err;
 }