|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v2 6/7] lib/ukboot: Replace the parser with the uklibparam
Hi Sharan, this patch looks good.
-- Felipe
Reviewed-by: Felipe Huici <felipe.huici@xxxxxxxxx>
On 13.08.19, 14:37, "Minios-devel on behalf of Sharan Santhanam"
<minios-devel-bounces@xxxxxxxxxxxxxxxxxxxx on behalf of
Sharan.Santhanam@xxxxxxxxx> wrote:
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 97c7d18b..9738a912 100644
--- a/lib/ukboot/boot.c
+++ b/lib/ukboot/boot.c
@@ -61,6 +61,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
@@ -165,9 +168,10 @@ void ukplat_entry(int argc, char *argv[])
{
const uk_ctor_func_t *cfn;
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;
@@ -183,6 +187,16 @@ void ukplat_entry(int argc, char *argv[])
(*cfn)();
}
+#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
@@ -236,8 +250,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 c5b32201..bdea2aae 100644
--- a/plat/linuxu/memory.c
+++ b/plat/linuxu/memory.c
@@ -47,10 +47,37 @@
static __u32 heap_size = CONFIG_LINUXU_DEFAULT_HEAPMB;
UK_LIB_PARAM(heap_size, __u32);
+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 50454437..863d30ff 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();
/*
@@ -158,31 +58,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
*/
--
2.20.1
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |