[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCH 7/8] lib/ukboot: Replace the parser with the uklibparam



We replace the existing parser in linuxu platform with uklibparam.
The library parsing is performed during the boot after constructor
initialization.

Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx>
---
 lib/ukboot/boot.c    |  20 +++++++--
 plat/linuxu/memory.c |  29 +++++++++++-
 plat/linuxu/setup.c  | 125 ---------------------------------------------------
 3 files changed, 45 insertions(+), 129 deletions(-)

diff --git a/lib/ukboot/boot.c b/lib/ukboot/boot.c
index 4846782..d663f47 100644
--- a/lib/ukboot/boot.c
+++ b/lib/ukboot/boot.c
@@ -60,6 +60,9 @@
 #if CONFIG_LIBUKBUS
 #include <uk/bus.h>
 #endif /* CONFIG_LIBUKBUS */
+#ifdef CONFIG_LIBUKLIBPARAM
+#include <uk/libparam.h>
+#endif /* CONFIG_LIBUKLIBPARAM */
 
 int main(int argc, char *argv[]) __weak;
 #ifdef CONFIG_LIBLWIP
@@ -142,9 +145,10 @@ void ukplat_entry(int argc, char *argv[])
 {
        int i;
        struct thread_main_arg tma;
+       int kern_args = 0;
+       int rc __maybe_unused = 0;
 #if CONFIG_LIBUKALLOC
        struct uk_alloc *a = NULL;
-       int rc;
 #endif
 #if CONFIG_LIBUKALLOC && CONFIG_LIBUKALLOCBBUDDY && CONFIG_LIBUKBOOT_INITALLOC
        struct ukplat_memregion_desc md;
@@ -176,6 +180,16 @@ void ukplat_entry(int argc, char *argv[])
                }
        }
 
+#ifdef CONFIG_LIBUKLIBPARAM
+       rc = (argc > 1) ? uk_libparam_parse(argv[0], argc - 1, &argv[1]) : 0;
+       if (unlikely(rc < 0))
+               uk_pr_crit("Failed to parse the kernel argument\n");
+       else {
+               kern_args = rc;
+               uk_pr_info("Found %d library args\n", kern_args);
+       }
+#endif /* CONFIG_LIBUKLIBPARAM */
+
 #if CONFIG_LIBUKALLOC && CONFIG_LIBUKALLOCBBUDDY && CONFIG_LIBUKBOOT_INITALLOC
        /* initialize memory allocator
         * FIXME: ukallocbbuddy is hard-coded for now
@@ -252,8 +266,8 @@ void ukplat_entry(int argc, char *argv[])
                UK_CRASH("Could not initialize the scheduler\n");
 #endif
 
-       tma.argc = argc;
-       tma.argv = argv;
+       tma.argc = argc - kern_args;
+       tma.argv = &argv[kern_args];
 
 #if CONFIG_LIBUKSCHED
        main_thread = uk_thread_create("main", main_thread_func, &tma);
diff --git a/plat/linuxu/memory.c b/plat/linuxu/memory.c
index 6b98acb..bc532b4 100644
--- a/plat/linuxu/memory.c
+++ b/plat/linuxu/memory.c
@@ -51,10 +51,37 @@ static __u32 heap_size = CONFIG_LINUXU_DEFAULT_HEAPMB;
 UK_LIB_PARAM(heap_size, __u32);
 #endif /* CONFIG_LIBUKLIBPARAM */
 
+static int __linuxu_plat_heap_init(void)
+{
+       void *pret;
+       int rc = 0;
+
+       _liblinuxuplat_opts.heap.len = heap_size * MB2B;
+       uk_pr_info("Heap size %u\n", heap_size);
+
+       /**
+        * Allocate heap memory
+        */
+       if (_liblinuxuplat_opts.heap.len > 0) {
+               pret = sys_mapmem(NULL, _liblinuxuplat_opts.heap.len);
+               if (PTRISERR(pret)) {
+                       rc = PTR2ERR(pret);
+                       uk_pr_err("Failed to allocate memory for heap: %d\n",
+                                  rc);
+               } else
+                       _liblinuxuplat_opts.heap.base = pret;
+       }
+
+       return rc;
+
+}
 
 int ukplat_memregion_count(void)
 {
-       return _liblinuxuplat_opts.heap.base ? 1 : 0;
+       int rc = 0;
+
+       rc = __linuxu_plat_heap_init();
+       return (rc == 0) ? 1 : 0;
 }
 
 int ukplat_memregion_get(int i, struct ukplat_memregion_desc *m)
diff --git a/plat/linuxu/setup.c b/plat/linuxu/setup.c
index 5045443..863d30f 100644
--- a/plat/linuxu/setup.c
+++ b/plat/linuxu/setup.c
@@ -35,12 +35,10 @@
 
 #include <uk/config.h>
 #include <string.h>
-#include <errno.h>
 #include <getopt.h>
 #include <stdlib.h>
 #include <linuxu/setup.h>
 #include <linuxu/console.h>
-#include <linuxu/syscall.h>
 #include <uk/plat/console.h>
 #include <uk/plat/bootstrap.h>
 #include <uk/assert.h>
@@ -49,108 +47,10 @@
 
 struct liblinuxuplat_opts _liblinuxuplat_opts = { 0 };
 
-#define _coutk_chr(c)                          \
-       ukplat_coutk((char *) &(c), 1)
-#define _coutk_str(str)                                \
-       ukplat_coutk((str), strlen(str))
-
-static const char *sopts = "h?Vm:";
-static struct option lopts[] = {
-       {"help",        no_argument,            NULL,   'h'},
-       {"version",     no_argument,            NULL,   'V'},
-       {"heapmem",     required_argument,      NULL,   'm'},
-       {NULL, 0, NULL, 0}
-};
-
-static void version(void)
-{
-       _coutk_str("Unikraft "
-                  STRINGIFY(UK_CODENAME) " "
-                  STRINGIFY(UK_FULLVERSION) "\n");
-}
-
-static void usage(const char *progname)
-{
-       _coutk_str("Usage: ");
-       _coutk_str(progname);
-       _coutk_str(" [[LINUXU PLATFORM ARGUMENT]].. -- [[ARGUMENT]]..\n\n");
-       _coutk_str("Unikraft LinuxU platform arguments:\n");
-       _coutk_str("Mandatory arguments to long options are mandatory for short 
options too.\n");
-       _coutk_str("  -h, --help                 display this help and exit\n");
-       _coutk_str("  -V, --version              display Unikraft version and 
exit\n");
-       _coutk_str("  -m, --heapmem [MBYTES]     allocate MBYTES as heap 
memory\n");
-}
-
-static int parseopts(int argc, char *argv[], struct liblinuxuplat_opts *opts)
-{
-       const char *progname = argv[0];
-       char *old_optarg;
-       int old_optind;
-       int old_optopt;
-       char **argvopt;
-       int opt, optidx;
-       int ret;
-
-       /*
-        * Clear & set default options
-        */
-       memset(opts, 0, sizeof(*opts));
-       _liblinuxuplat_opts.heap.len = (size_t)(CONFIG_LINUXU_DEFAULT_HEAPMB)
-                                       * 1024 * 1024;
-
-       /*
-        * Parse arguments
-        */
-       old_optind = optind;
-       old_optopt = optopt;
-       old_optarg = optarg;
-       argvopt = argv;
-       optind = 1;
-       while ((opt = getopt_long(argc, argvopt, sopts, lopts, &optidx)) >= 0) {
-               switch (opt) {
-               case 'h':
-               case '?': /* usage */
-                       usage(progname);
-                       ukplat_halt();
-               case 'V': /* version */
-                       version();
-                       ukplat_halt();
-               case 'm':
-                       _liblinuxuplat_opts.heap.len = (((size_t)
-                                                        strtoul(optarg,
-                                                                NULL, 10))
-                                                       * 1024 * 1024);
-                       break;
-               default:
-                       _coutk_str(progname);
-                       _coutk_str(": invalid option: -");
-                       _coutk_chr(opt);
-                       _coutk_str("\n");
-                       usage(progname);
-                       ret = -EINVAL;
-                       goto out;
-               }
-       }
-       ret = optind;
-
-out:
-       /*
-        * Restore getopt state for later calls
-        */
-       optind = old_optind;
-       optopt = old_optopt;
-       optarg = old_optarg;
-       return ret;
-}
-
 void _liblinuxuplat_entry(int argc, char *argv[]) __noreturn;
 
 void _liblinuxuplat_entry(int argc, char *argv[])
 {
-       char *progname = argv[0];
-       int ret;
-       void *pret;
-
        _init_cpufeatures();
 
        /*
@@ -159,31 +59,6 @@ void _liblinuxuplat_entry(int argc, char *argv[])
        _liblinuxuplat_init_console();
 
        /*
-        * Parse LinuxU platform arguments
-        */
-       if ((ret = parseopts(argc, argv, &_liblinuxuplat_opts)) < 0)
-               ukplat_crash();
-
-       /*
-        * Remove arguments related to LinuxU platform
-        * and set progname again as argument 0
-        */
-       argc -= (ret - 1);
-       argv += (ret - 1);
-       argv[0] = progname;
-
-       /*
-        * Allocate heap memory
-        */
-       if (_liblinuxuplat_opts.heap.len > 0) {
-               pret = sys_mapmem(NULL, _liblinuxuplat_opts.heap.len);
-               if (PTRISERR(pret))
-                       uk_pr_err("Failed to allocate memory for heap: %d\n", 
PTR2ERR(pret));
-               else
-                       _liblinuxuplat_opts.heap.base = pret;
-       }
-
-       /*
         * Enter Unikraft
         */
        ukplat_entry(argc, argv);
-- 
2.7.4


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.