Merge large page support code.
[barrelfish] / lib / barrelfish / init.c
index 6e18d67..9c134d2 100644 (file)
@@ -4,7 +4,8 @@
  */
 
 /*
- * Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012, ETH Zurich.
+ * Copyright (c) 2007-2012, ETH Zurich.
+ * Copyright (c) 2014, HP Labs.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -148,6 +149,45 @@ errval_t trace_my_setup(void)
 
 static bool request_done = false;
 
+static bool parse_argv(struct spawn_domain_params *params, size_t *morecore_alignment)
+{
+    // grab pagesize config from argv if available
+    size_t morecore_pagesize = MORECORE_PAGESIZE;
+    int i = 1;
+    bool found = false;
+    for (; i < params->argc; i++) {
+        if (!found) {
+            if (!strncmp(params->argv[i], "morecore=", 9)) {
+                morecore_pagesize = strtol(params->argv[i]+9, NULL, 0);
+                // check for valid page size
+                switch (morecore_pagesize) {
+#ifdef __x86_64__
+                    case HUGE_PAGE_SIZE:
+#endif
+                    case BASE_PAGE_SIZE:
+                    case LARGE_PAGE_SIZE:
+                        break;
+                    default:
+                        morecore_pagesize = MORECORE_PAGESIZE;
+                }
+                found = true;
+            }
+        } else {
+            // found so move all other args one to the front
+            params->argv[i-1] = params->argv[i];
+        }
+    }
+    if (found) {
+        params->argc -= 1;
+    }
+
+    if (morecore_alignment) {
+        *morecore_alignment = morecore_pagesize;
+    }
+
+    return found;
+}
+
 /** \brief Initialise libbarrelfish.
  *
  * This runs on a thread in every domain, after the dispatcher is setup but
@@ -197,7 +237,16 @@ errval_t barrelfish_init_onthread(struct spawn_domain_params *params)
         // TODO: the kernel boots us with a deterministic pmap structure: use it
     }
 
-    err = morecore_init();
+    if (init_domain) {
+        // we cannot use large pages in the init domains because we are not
+        // connected to the memory server and need to work with the 4k pages
+        // in the base cn.
+        err = morecore_init(BASE_PAGE_SIZE);
+    } else {
+        size_t morecore_pagesize = 0;
+        parse_argv(params, &morecore_pagesize);
+        err = morecore_init(morecore_pagesize);
+    }
     if (err_is_fail(err)) {
         return err_push(err, LIB_ERR_MORECORE_INIT);
     }
@@ -250,6 +299,12 @@ errval_t barrelfish_init_onthread(struct spawn_domain_params *params)
         return err_push(err, LIB_ERR_RAM_ALLOC_SET);
     }
 
+    // switch morecore to intended configuration
+    err = morecore_reinit();
+    if (err_is_fail(err)) {
+        return err_push(err, LIB_ERR_MORECORE_INIT);
+    }
+
 #ifdef CONFIG_TRACE
     err = trace_my_setup();
     if (err_is_fail(err)) {