diff mbox

[Xen-devel,V5,06/15] Add efi_arch_handle_cmdline() for processing commandline

Message ID 1411080607-32365-7-git-send-email-roy.franz@linaro.org
State New
Headers show

Commit Message

Roy Franz Sept. 18, 2014, 10:49 p.m. UTC
Add arch function for processing the Xen commandline and
updating internal structures.

Signed-off-by: Roy Franz <roy.franz@linaro.org>
---
 xen/common/efi/boot.c          | 37 +++++++++----------------------------
 xen/include/asm-x86/efi-boot.h | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 28 deletions(-)

Comments

Jan Beulich Sept. 22, 2014, 12:17 p.m. UTC | #1
>>> On 19.09.14 at 00:49, <roy.franz@linaro.org> wrote:
> Add arch function for processing the Xen commandline and
> updating internal structures.
> 
> Signed-off-by: Roy Franz <roy.franz@linaro.org>

With two small requests for adjustments below
Acked-by: Jan Beulich <jbeulich@suse.com>

> @@ -256,7 +257,8 @@ static void __init PrintErrMesg(const CHAR16 *mesg, EFI_STATUS ErrCode)
>  }
>  
>  static unsigned int __init get_argv(unsigned int argc, CHAR16 **argv,
> -                                    CHAR16 *cmdline, UINTN cmdsize)
> +                                    CHAR16 *cmdline, UINTN cmdsize,
> +                                    CHAR16 **options)

I think this would better be named "dom0_options" or "dom0_opts" or
some such (also in the caller).

> @@ -701,14 +701,14 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
>      dir_handle = get_parent_handle(loaded_image, &file_name);
>  
>      argc = get_argv(0, NULL, loaded_image->LoadOptions,
> -                    loaded_image->LoadOptionsSize);
> +                    loaded_image->LoadOptionsSize, &options);

I don't see why you don't pass NULL here, the more that you add
a respective check to get_argv().

Jan
Roy Franz Sept. 23, 2014, 1:40 a.m. UTC | #2
On Mon, Sep 22, 2014 at 5:17 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>> On 19.09.14 at 00:49, <roy.franz@linaro.org> wrote:
>> Add arch function for processing the Xen commandline and
>> updating internal structures.
>>
>> Signed-off-by: Roy Franz <roy.franz@linaro.org>
>
> With two small requests for adjustments below
> Acked-by: Jan Beulich <jbeulich@suse.com>
>
>> @@ -256,7 +257,8 @@ static void __init PrintErrMesg(const CHAR16 *mesg, EFI_STATUS ErrCode)
>>  }
>>
>>  static unsigned int __init get_argv(unsigned int argc, CHAR16 **argv,
>> -                                    CHAR16 *cmdline, UINTN cmdsize)
>> +                                    CHAR16 *cmdline, UINTN cmdsize,
>> +                                    CHAR16 **options)
>
> I think this would better be named "dom0_options" or "dom0_opts" or
> some such (also in the caller).

I think xen_options would be better, or else I'm really confused :)
This string is combined with the Xen options from the
config file into mbi.cmdline. Dom0 arguments come from the "kernel"
line in the configuration tile.

>
>> @@ -701,14 +701,14 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
>>      dir_handle = get_parent_handle(loaded_image, &file_name);
>>
>>      argc = get_argv(0, NULL, loaded_image->LoadOptions,
>> -                    loaded_image->LoadOptionsSize);
>> +                    loaded_image->LoadOptionsSize, &options);
>
> I don't see why you don't pass NULL here, the more that you add
> a respective check to get_argv().

I don't either - I will change this.
>
> Jan
>
Jan Beulich Sept. 23, 2014, 12:25 p.m. UTC | #3
>>> On 23.09.14 at 03:40, <roy.franz@linaro.org> wrote:
> On Mon, Sep 22, 2014 at 5:17 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>>> On 19.09.14 at 00:49, <roy.franz@linaro.org> wrote:
>>> @@ -256,7 +257,8 @@ static void __init PrintErrMesg(const CHAR16 *mesg, EFI_STATUS ErrCode)
>>>  }
>>>
>>>  static unsigned int __init get_argv(unsigned int argc, CHAR16 **argv,
>>> -                                    CHAR16 *cmdline, UINTN cmdsize)
>>> +                                    CHAR16 *cmdline, UINTN cmdsize,
>>> +                                    CHAR16 **options)
>>
>> I think this would better be named "dom0_options" or "dom0_opts" or
>> some such (also in the caller).
> 
> I think xen_options would be better, or else I'm really confused :)
> This string is combined with the Xen options from the
> config file into mbi.cmdline. Dom0 arguments come from the "kernel"
> line in the configuration tile.

Indeed - I mixed things up: This is the first "--" separator, the Dom0
options come after the second. In which case staying with just
"options" is quite fine.

Jan
Roy Franz Sept. 24, 2014, 12:09 a.m. UTC | #4
On Tue, Sep 23, 2014 at 5:25 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>> On 23.09.14 at 03:40, <roy.franz@linaro.org> wrote:
>> On Mon, Sep 22, 2014 at 5:17 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>>>> On 19.09.14 at 00:49, <roy.franz@linaro.org> wrote:
>>>> @@ -256,7 +257,8 @@ static void __init PrintErrMesg(const CHAR16 *mesg, EFI_STATUS ErrCode)
>>>>  }
>>>>
>>>>  static unsigned int __init get_argv(unsigned int argc, CHAR16 **argv,
>>>> -                                    CHAR16 *cmdline, UINTN cmdsize)
>>>> +                                    CHAR16 *cmdline, UINTN cmdsize,
>>>> +                                    CHAR16 **options)
>>>
>>> I think this would better be named "dom0_options" or "dom0_opts" or
>>> some such (also in the caller).
>>
>> I think xen_options would be better, or else I'm really confused :)
>> This string is combined with the Xen options from the
>> config file into mbi.cmdline. Dom0 arguments come from the "kernel"
>> line in the configuration tile.
>
> Indeed - I mixed things up: This is the first "--" separator, the Dom0
> options come after the second. In which case staying with just
> "options" is quite fine.
>
> Jan
>

Is this second "--" handled by XEN itself?  I don't see any handling
of that in the EFI boot code.  The only thing that goes
into the multiboot .string field for the dom0 kernel is from the config file.

Roy
Jan Beulich Sept. 24, 2014, 8:13 a.m. UTC | #5
>>> On 24.09.14 at 02:09, <roy.franz@linaro.org> wrote:
> On Tue, Sep 23, 2014 at 5:25 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>>> On 23.09.14 at 03:40, <roy.franz@linaro.org> wrote:
>>> On Mon, Sep 22, 2014 at 5:17 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>>>>> On 19.09.14 at 00:49, <roy.franz@linaro.org> wrote:
>>>>> @@ -256,7 +257,8 @@ static void __init PrintErrMesg(const CHAR16 *mesg, 
> EFI_STATUS ErrCode)
>>>>>  }
>>>>>
>>>>>  static unsigned int __init get_argv(unsigned int argc, CHAR16 **argv,
>>>>> -                                    CHAR16 *cmdline, UINTN cmdsize)
>>>>> +                                    CHAR16 *cmdline, UINTN cmdsize,
>>>>> +                                    CHAR16 **options)
>>>>
>>>> I think this would better be named "dom0_options" or "dom0_opts" or
>>>> some such (also in the caller).
>>>
>>> I think xen_options would be better, or else I'm really confused :)
>>> This string is combined with the Xen options from the
>>> config file into mbi.cmdline. Dom0 arguments come from the "kernel"
>>> line in the configuration tile.
>>
>> Indeed - I mixed things up: This is the first "--" separator, the Dom0
>> options come after the second. In which case staying with just
>> "options" is quite fine.
> 
> Is this second "--" handled by XEN itself?  I don't see any handling
> of that in the EFI boot code.  The only thing that goes
> into the multiboot .string field for the dom0 kernel is from the config 
> file.

Yes, that's being handled in __start_xen() (search for "kextra" if
you want to see where exactly).

Jan
Ian Campbell Sept. 24, 2014, 9:33 a.m. UTC | #6
On Wed, 2014-09-24 at 09:13 +0100, Jan Beulich wrote:
> >>> On 24.09.14 at 02:09, <roy.franz@linaro.org> wrote:
> > On Tue, Sep 23, 2014 at 5:25 AM, Jan Beulich <JBeulich@suse.com> wrote:
> >>>>> On 23.09.14 at 03:40, <roy.franz@linaro.org> wrote:
> >>> On Mon, Sep 22, 2014 at 5:17 AM, Jan Beulich <JBeulich@suse.com> wrote:
> >>>>>>> On 19.09.14 at 00:49, <roy.franz@linaro.org> wrote:
> >>>>> @@ -256,7 +257,8 @@ static void __init PrintErrMesg(const CHAR16 *mesg, 
> > EFI_STATUS ErrCode)
> >>>>>  }
> >>>>>
> >>>>>  static unsigned int __init get_argv(unsigned int argc, CHAR16 **argv,
> >>>>> -                                    CHAR16 *cmdline, UINTN cmdsize)
> >>>>> +                                    CHAR16 *cmdline, UINTN cmdsize,
> >>>>> +                                    CHAR16 **options)
> >>>>
> >>>> I think this would better be named "dom0_options" or "dom0_opts" or
> >>>> some such (also in the caller).
> >>>
> >>> I think xen_options would be better, or else I'm really confused :)
> >>> This string is combined with the Xen options from the
> >>> config file into mbi.cmdline. Dom0 arguments come from the "kernel"
> >>> line in the configuration tile.
> >>
> >> Indeed - I mixed things up: This is the first "--" separator, the Dom0
> >> options come after the second. In which case staying with just
> >> "options" is quite fine.
> > 
> > Is this second "--" handled by XEN itself?  I don't see any handling
> > of that in the EFI boot code.  The only thing that goes
> > into the multiboot .string field for the dom0 kernel is from the config 
> > file.
> 
> Yes, that's being handled in __start_xen() (search for "kextra" if
> you want to see where exactly).

I'd never heard of this behaviour before, and it is (currently at least)
x86 specific.

I don't know if this is relevant to the discusion here though, probably
not?

Ian.
Jan Beulich Sept. 24, 2014, 11:34 a.m. UTC | #7
>>> On 24.09.14 at 11:33, <Ian.Campbell@citrix.com> wrote:
> On Wed, 2014-09-24 at 09:13 +0100, Jan Beulich wrote:
>> >>> On 24.09.14 at 02:09, <roy.franz@linaro.org> wrote:
>> > Is this second "--" handled by XEN itself?  I don't see any handling
>> > of that in the EFI boot code.  The only thing that goes
>> > into the multiboot .string field for the dom0 kernel is from the config 
>> > file.
>> 
>> Yes, that's being handled in __start_xen() (search for "kextra" if
>> you want to see where exactly).
> 
> I'd never heard of this behaviour before, and it is (currently at least)
> x86 specific.

Yeah, we needed this a long while ago for the case where the GrUB
GUI shows only a single line for entering extra options, which then
all get passed to the hypervisor making it impossible to add extra
Dom0 kernel options this same way.

> I don't know if this is relevant to the discusion here though, probably
> not?

Definitely not. I just didn't want to leave Roy's question unanswered.

Jan
diff mbox

Patch

diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
index 58e3cbc..2f8dade 100644
--- a/xen/common/efi/boot.c
+++ b/xen/common/efi/boot.c
@@ -58,6 +58,7 @@  static char *get_value(const struct file *cfg, const char *section,
                               const char *item);
 static void  split_value(char *s);
 static CHAR16 *s2w(union string *str);
+static char *w2s(const union string *str);
 static bool_t  read_file(EFI_FILE_HANDLE dir_handle, CHAR16 *name,
                                struct file *file);
 
@@ -256,7 +257,8 @@  static void __init PrintErrMesg(const CHAR16 *mesg, EFI_STATUS ErrCode)
 }
 
 static unsigned int __init get_argv(unsigned int argc, CHAR16 **argv,
-                                    CHAR16 *cmdline, UINTN cmdsize)
+                                    CHAR16 *cmdline, UINTN cmdsize,
+                                    CHAR16 **options)
 {
     CHAR16 *ptr = (CHAR16 *)(argv + argc + 1), *prev = NULL;
     bool_t prev_sep = TRUE;
@@ -282,10 +284,8 @@  static unsigned int __init get_argv(unsigned int argc, CHAR16 **argv,
                 ++argc;
             else if ( prev && wstrcmp(prev, L"--") == 0 )
             {
-                union string rest = { .w = cmdline };
-
-                --argv;
-                place_string(&mbi.cmdline, w2s(&rest));
+                if ( options )
+                    *options = cmdline;
                 break;
             }
             else
@@ -660,7 +660,7 @@  efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
     EFI_LOADED_IMAGE *loaded_image;
     EFI_STATUS status;
     unsigned int i, argc;
-    CHAR16 **argv, *file_name, *cfg_file_name = NULL;
+    CHAR16 **argv, *file_name, *cfg_file_name = NULL, *options = NULL;
     UINTN cols, rows, depth, size, info_size, gop_mode = ~0;
     EFI_HANDLE *handles = NULL;
     EFI_SHIM_LOCK_PROTOCOL *shim_lock;
@@ -701,14 +701,14 @@  efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
     dir_handle = get_parent_handle(loaded_image, &file_name);
 
     argc = get_argv(0, NULL, loaded_image->LoadOptions,
-                    loaded_image->LoadOptionsSize);
+                    loaded_image->LoadOptionsSize, &options);
     if ( argc > 0 &&
          efi_bs->AllocatePool(EfiLoaderData,
                               (argc + 1) * sizeof(*argv) +
                                   loaded_image->LoadOptionsSize,
                               (void **)&argv) == EFI_SUCCESS )
         get_argv(argc, argv, loaded_image->LoadOptions,
-                 loaded_image->LoadOptionsSize);
+                 loaded_image->LoadOptionsSize, &options);
     else
         argc = 0;
     for ( i = 1; i < argc; ++i )
@@ -878,17 +878,7 @@  efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
     }
 
     name.s = get_value(&cfg, section.s, "options");
-    if ( name.s )
-        place_string(&mbi.cmdline, name.s);
-    /* Insert image name last, as it gets prefixed to the other options. */
-    if ( argc )
-    {
-        name.w = *argv;
-        w2s(&name);
-    }
-    else
-        name.s = "xen";
-    place_string(&mbi.cmdline, name.s);
+    efi_arch_handle_cmdline(argc ? *argv : NULL, options, name.s);
 
     cols = rows = depth = 0;
     if ( !base_video )
@@ -955,15 +945,6 @@  efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
         }
     }
 
-    if ( mbi.cmdline )
-        mbi.flags |= MBI_CMDLINE;
-    /*
-     * These must not be initialized statically, since the value must
-     * not get relocated when processing base relocations below.
-     */
-    mbi.boot_loader_name = (long)"EFI";
-    mbi.mods_addr = (long)mb_modules;
-
     /* Collect EDD info. */
     BUILD_BUG_ON(offsetof(struct edd_info, edd_device_params) != EDDEXTSIZE);
     BUILD_BUG_ON(sizeof(struct edd_device_params) != EDDPARMSIZE);
diff --git a/xen/include/asm-x86/efi-boot.h b/xen/include/asm-x86/efi-boot.h
index 93498bb..6e9376a 100644
--- a/xen/include/asm-x86/efi-boot.h
+++ b/xen/include/asm-x86/efi-boot.h
@@ -279,3 +279,37 @@  static void __init efi_arch_cfg_file_late(EFI_FILE_HANDLE dir_handle, char *sect
         efi_bs->FreePool(name.w);
     }
 }
+
+static void __init efi_arch_handle_cmdline(CHAR16 *image_name,
+                                           CHAR16 *cmdline_options,
+                                           char *cfgfile_options)
+{
+    union string name;
+
+    if ( cmdline_options )
+    {
+        name.w = cmdline_options;
+        w2s(&name);
+        place_string(&mbi.cmdline, name.s);
+    }
+    if ( cfgfile_options )
+        place_string(&mbi.cmdline, cfgfile_options);
+    /* Insert image name last, as it gets prefixed to the other options. */
+    if ( image_name )
+    {
+        name.w = image_name;
+        w2s(&name);
+    }
+    else
+        name.s = "xen";
+    place_string(&mbi.cmdline, name.s);
+
+    if ( mbi.cmdline )
+        mbi.flags |= MBI_CMDLINE;
+    /*
+     * These must not be initialized statically, since the value must
+     * not get relocated when processing base relocations later.
+     */
+    mbi.boot_loader_name = (long)"EFI";
+    mbi.mods_addr = (long)mb_modules;
+}