Just forgot to add Mac after 1week. But with all the churn here, predicting 
when may be tough.

Warner

On January 26, 2016, at 3:29 AM, Steven Hartland 
<steven.hartl...@multiplay.co.uk> wrote:

No plan to MFC these changes?

On 26/01/2016 06:26, Warner Losh wrote:
> Author: imp
> Date: Tue Jan 26 06:26:46 2016
> New Revision: 294767
> URL: https://svnweb.freebsd.org/changeset/base/294767
>
> Log:
>    Parse the command line arguments, and do it before we initialize the
>    console so it can be changed by the command line arguments.
>    
>    Differential Revision: https://reviews.freebsd.org/D5038
>
> Modified:
>    head/sys/boot/efi/loader/main.c
>
> Modified: head/sys/boot/efi/loader/main.c
> ==============================================================================
> --- head/sys/boot/efi/loader/main.c   Tue Jan 26 06:26:44 2016        
> (r294766)
> +++ head/sys/boot/efi/loader/main.c   Tue Jan 26 06:26:46 2016        
> (r294767)
> @@ -29,6 +29,8 @@
>   __FBSDID("$FreeBSD$");
>   
>   #include <sys/param.h>
> +#include <sys/reboot.h>
> +#include <sys/boot.h>
>   #include <stand.h>
>   #include <string.h>
>   #include <setjmp.h>
> @@ -83,13 +85,22 @@ print_str16(const CHAR16 *str)
>               printf("%c", (char)str[i]);
>   }
>   
> +static void
> +cp16to8(const CHAR16 *src, char *dst, size_t len)
> +{
> +     size_t i;
> +
> +     for (i = 0; i < len && src[i]; i++)
> +             dst[i] = (char)src[i];
> +}
> +
>   EFI_STATUS
>   main(int argc, CHAR16 *argv[])
>   {
>       char var[128];
>       EFI_LOADED_IMAGE *img;
>       EFI_GUID *guid;
> -     int i, j, vargood, unit;
> +     int i, j, vargood, unit, howto;
>       struct devsw *dev;
>       uint64_t pool_guid;
>       UINTN k;
> @@ -113,27 +124,97 @@ main(int argc, CHAR16 *argv[])
>       cons_probe();
>   
>       /*
> +      * Parse the args to set the console settings, etc
> +      * boot1.efi passes these in, if it can read /boot.config or 
> /boot/config
> +      * or iPXE may be setup to pass these in.
> +      *
>        * Loop through the args, and for each one that contains an '=' that is
>        * not the first character, add it to the environment.  This allows
>        * loader and kernel env vars to be passed on the command line.  Convert
>        * args from UCS-2 to ASCII (16 to 8 bit) as they are copied.
>        */
> +     howto = 0;
>       for (i = 1; i < argc; i++) {
> -             vargood = 0;
> -             for (j = 0; argv[i][j] != 0; j++) {
> -                     if (j == sizeof(var)) {
> -                             vargood = 0;
> -                             break;
> +             if (argv[i][0] == '-') {
> +                     for (j = 1; argv[i][j] != 0; j++) {
> +                             int ch;
> +
> +                             ch = argv[i][j];
> +                             switch (ch) {
> +                             case 'a':
> +                                     howto |= RB_ASKNAME;
> +                                     break;
> +                             case 'd':
> +                                     howto |= RB_KDB;
> +                                     break;
> +                             case 'D':
> +                                     howto |= RB_MULTIPLE;
> +                                     break;
> +                             case 'm':
> +                                     howto |= RB_MUTE;
> +                                     break;
> +                             case 'h':
> +                                     howto |= RB_SERIAL;
> +                                     break;
> +                             case 'p':
> +                                     howto |= RB_PAUSE;
> +                                     break;
> +                             case 'r':
> +                                     howto |= RB_DFLTROOT;
> +                                     break;
> +                             case 's':
> +                                     howto |= RB_SINGLE;
> +                                     break;
> +                             case 'S':
> +                                     if (argv[i][j + 1] == 0) {
> +                                             if (i + 1 == argc) {
> +                                                     
> setenv("comconsole_speed", "115200", 1);
> +                                             } else {
> +                                                     cp16to8(&argv[i + 
> 1][0], var,
> +                                                         sizeof(var));
> +                                                     
> setenv("comconsole_speedspeed", var, 1);
> +                                             }
> +                                             i++;
> +                                             break;
> +                                     } else {
> +                                             cp16to8(&argv[i][j + 1], var,
> +                                                 sizeof(var));
> +                                             setenv("comconsole_speed", var, 
> 1);
> +                                             break;
> +                                     }
> +                             case 'v':
> +                                     howto |= RB_VERBOSE;
> +                                     break;
> +                             }
> +                     }
> +             } else {
> +                     vargood = 0;
> +                     for (j = 0; argv[i][j] != 0; j++) {
> +                             if (j == sizeof(var)) {
> +                                     vargood = 0;
> +                                     break;
> +                             }
> +                             if (j > 0 && argv[i][j] == '=')
> +                                     vargood = 1;
> +                             var[j] = (char)argv[i][j];
> +                     }
> +                     if (vargood) {
> +                             var[j] = 0;
> +                             putenv(var);
>                       }
> -                     if (j > 0 && argv[i][j] == '=')
> -                             vargood = 1;
> -                     var[j] = (char)argv[i][j];
> -             }
> -             if (vargood) {
> -                     var[j] = 0;
> -                     putenv(var);
>               }
>       }
> +     for (i = 0; howto_names[i].ev != NULL; i++)
> +             if (howto & howto_names[i].mask)
> +                     setenv(howto_names[i].ev, "YES", 1);
> +     if (howto & RB_MULTIPLE) {
> +             if (howto & RB_SERIAL)
> +                     setenv("console", "comconsole efi" , 1);
> +             else
> +                     setenv("console", "efi comconsole" , 1);
> +     } else if (howto & RB_SERIAL) {
> +             setenv("console", "comconsole" , 1);
> +     }
>   
>       if (efi_copy_init()) {
>               printf("failed to allocate staging area\n");
>

_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to