|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH] lib/ukboot: Fix handling of main arguments
Hi Simon,
I've read your comments but I couldn't find out why you don't agree with
global approach. So, what are the reasons why you would prefer declaring
the arguments static rather than global?
Personally I find making the arguments global to be more elegant and
offer a unified approach, since they would have the same location for
all platforms.
Also, please see a comment inline.
On 6/6/19 12:34 PM, Simon Kuenzer wrote:
> Hey Costin,
>
> thanks a lot for the patch. I think the actual problem is that the boot
> stack could be released later after boot for something else, so it is
> not guaranteed anymore that the arguments are safe and staying.
> However, I don't agree to make argv and argc global available. Just
> allocate them in the bss section.
> See my comments inline.
>
> On 05.06.19 21:55, Costin Lupu wrote:
>> When the command line is parsed and split into arguments, each argument
>> is saved in an array of pointers allocated on the stack ('argv' array in
>> ukplat_entry_argp()). This means that the array can be overwritten any
>> time before starting the main thread which needs the arguments. This
>> patch fixes that by making the array global, encapsulated by the
>> 'main_arg' structure.
>>
>> Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx>
>> ---
>> include/uk/plat/bootstrap.h | 11 ++++++++++-
>> lib/ukboot/boot.c | 33 ++++++++++++---------------------
>> lib/ukboot/exportsyms.uk | 1 +
>> plat/linuxu/setup.c | 7 ++++++-
>> 4 files changed, 29 insertions(+), 23 deletions(-)
>>
>> diff --git a/include/uk/plat/bootstrap.h b/include/uk/plat/bootstrap.h
>> index 0652ccd1..a9e404e8 100644
>> --- a/include/uk/plat/bootstrap.h
>> +++ b/include/uk/plat/bootstrap.h
>> @@ -36,6 +36,7 @@
>> #ifndef __UKPLAT_BOOTSTRAP__
>> #define __UKPLAT_BOOTSTRAP__
>> +#include <uk/config.h>
>> #include <uk/arch/types.h>
>> #include <uk/essentials.h>
>> @@ -43,6 +44,14 @@
>> extern "C" {
>> #endif
>> +/* Main arguments structure */
>> +struct main_arg {
>> + int argc;
>> + char *argv[CONFIG_LIBUKBOOT_MAXNBARGS];
>> +};
>> +/* Main arguments */
>> +extern struct main_arg global_main_arg;
>> +
>> /**
>> * Called by platform library during initialization
>> * This function has to be provided by a non-platform library for
>> bootstrapping
>> @@ -52,7 +61,7 @@ extern "C" {
>> * @param argc Number of arguments
>> * @param args Array to '\0'-terminated arguments
>> */
>> -void ukplat_entry(int argc, char *argv[]) __noreturn;
>> +void ukplat_entry(struct main_arg *arg) __noreturn;
>> /**
>> * Called by platform library during initialization
>> diff --git a/lib/ukboot/boot.c b/lib/ukboot/boot.c
>> index 4dcc0afb..5cc3b573 100644
>> --- a/lib/ukboot/boot.c
>> +++ b/lib/ukboot/boot.c
>> @@ -68,17 +68,13 @@ extern int liblwip_init(void);
>> #endif /* CONFIG_LIBLWIP */
>> static void main_thread_func(void *arg) __noreturn;
>> -
>> -struct thread_main_arg {
>> - int argc;
>> - char **argv;
>> -};
>> +struct main_arg global_main_arg;
>> static void main_thread_func(void *arg)
>> {
>> int i;
>> int ret;
>> - struct thread_main_arg *tma = arg;
>> + struct main_arg *tma = arg;
>> uk_pr_info("Pre-init table at %p - %p\n",
>> __preinit_array_start, &__preinit_array_end);
>> @@ -145,26 +141,26 @@ static void main_thread_func(void *arg)
>> /* defined in <uk/plat.h> */
>> void ukplat_entry_argp(char *arg0, char *argb, __sz argb_len)
>> {
>> - char *argv[CONFIG_LIBUKBOOT_MAXNBARGS];
>
> Just declare
> char *argv[CONFIG_LIBUKBOOT_MAXNBARGS];
> as
> static char *argv[CONFIG_LIBUKBOOT_MAXNBARGS];
>
> The same for argc.
>
> We also need to double-check that our string buffer with the arguments
> (where argv is pointing to), is not allocated on the stack in the
> platform. If this is the case, we are safe.
>
I'm not sure I follow this, you mean to check if the strings aren't
allocated on this stack? Or to check if it comes from bss?
>> - int argc = 0;
>> + global_main_arg.argc = 0;
>> if (arg0) {
>> - argv[0] = arg0;
>> - argc += 1;
>> + global_main_arg.argv[0] = arg0;
>> + global_main_arg.argc += 1;
>> }
>> if (argb && argb_len) {
>> - argc += uk_argnparse(argb, argb_len, arg0 ? &argv[1] : &argv[0],
>> + global_main_arg.argc += uk_argnparse(argb, argb_len,
>> + arg0 ? &global_main_arg.argv[1]
>> + : &global_main_arg.argv[0],
>> arg0 ? (CONFIG_LIBUKBOOT_MAXNBARGS - 1)
>> : CONFIG_LIBUKBOOT_MAXNBARGS);
>> }
>> - ukplat_entry(argc, argv);
>> + ukplat_entry(&global_main_arg);
>
> If you declare the arguments as global you do not need to hand them over
> anymore, but as I said I would not change this at all.
>
>> }
>> /* defined in <uk/plat.h> */
>> -void ukplat_entry(int argc, char *argv[])
>> +void ukplat_entry(struct main_arg *arg)
>> {
>> const uk_ctor_func_t *cfn;
>> - struct thread_main_arg tma;
>> #if CONFIG_LIBUKALLOC
>> struct uk_alloc *a = NULL;
>> int rc;
>> @@ -234,19 +230,14 @@ void ukplat_entry(int argc, char *argv[])
>> s = uk_sched_default_init(a);
>> if (unlikely(!s))
>> UK_CRASH("Could not initialize the scheduler\n");
>> -#endif
>> - tma.argc = argc;
>> - tma.argv = argv;
>> -
>> -#if CONFIG_LIBUKSCHED
>> - main_thread = uk_thread_create("main", main_thread_func, &tma);
>> + main_thread = uk_thread_create("main", main_thread_func, arg);
>> if (unlikely(!main_thread))
>> UK_CRASH("Could not create main thread\n");
>> uk_sched_start(s);
>> #else
>> /* Enable interrupts before starting the application */
>> ukplat_lcpu_enable_irq();
>> - main_thread_func(&tma);
>> + main_thread_func(arg);
>> #endif
>> }
>> diff --git a/lib/ukboot/exportsyms.uk b/lib/ukboot/exportsyms.uk
>> index 3edc6c6a..adbb84fb 100644
>> --- a/lib/ukboot/exportsyms.uk
>> +++ b/lib/ukboot/exportsyms.uk
>> @@ -1,3 +1,4 @@
>> ukplat_entry_argp
>> ukplat_entry
>> +global_main_arg
>> main
>> diff --git a/plat/linuxu/setup.c b/plat/linuxu/setup.c
>> index 50454437..4f6f5688 100644
>> --- a/plat/linuxu/setup.c
>> +++ b/plat/linuxu/setup.c
>> @@ -172,6 +172,11 @@ void _liblinuxuplat_entry(int argc, char *argv[])
>> argv += (ret - 1);
>> argv[0] = progname;
>
> Make also sure that argv and argc are declared as static here, instead.
>
>> + /* Setup global arguments */
>> + global_main_arg.argc = argc;
>> + for (int i = 0; i < argc; i++)
>> + global_main_arg.argv[i] = argv[i];
>> +
>> /*
>> * Allocate heap memory
>> */
>> @@ -186,5 +191,5 @@ void _liblinuxuplat_entry(int argc, char *argv[])
>> /*
>> * Enter Unikraft
>> */
>> - ukplat_entry(argc, argv);
>> + ukplat_entry(&global_main_arg);
>> }
>>
>
> Thanks,
>
> Simon
>
> _______________________________________________
> 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 |