Author: imp
Date: Fri Jul 13 16:43:23 2018
New Revision: 336246
URL: https://svnweb.freebsd.org/changeset/base/336246

Log:
  Eliminate boot loader copies of boot arg parsing.
  
  Eliminate 4 of the copies of the arg parsing in /boot/laoder
  by using boot_parse_cmdline.
  
  Sponsored by: Netflix
  Differential Revision: https://reviews.freebsd.org/D16205

Modified:
  head/stand/common/metadata.c
  head/stand/efi/loader/main.c
  head/stand/i386/libi386/bootinfo.c
  head/stand/userboot/userboot/bootinfo.c

Modified: head/stand/common/metadata.c
==============================================================================
--- head/stand/common/metadata.c        Fri Jul 13 16:43:17 2018        
(r336245)
+++ head/stand/common/metadata.c        Fri Jul 13 16:43:23 2018        
(r336246)
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <stand.h>
 #include <sys/param.h>
 #include <sys/linker.h>
+#include <sys/boot.h>
 #include <sys/reboot.h>
 #if defined(LOADER_FDT_SUPPORT)
 #include <fdt_platform.h>
@@ -96,61 +97,10 @@ md_bootserial(void)
 static int
 md_getboothowto(char *kargs)
 {
-    char       *cp;
     int                howto;
-    int                active;
 
     /* Parse kargs */
-    howto = 0;
-    if (kargs != NULL) {
-       cp = kargs;
-       active = 0;
-       while (*cp != 0) {
-           if (!active && (*cp == '-')) {
-               active = 1;
-           } else if (active)
-               switch (*cp) {
-               case 'a':
-                   howto |= RB_ASKNAME;
-                   break;
-               case 'C':
-                   howto |= RB_CDROM;
-                   break;
-               case 'd':
-                   howto |= RB_KDB;
-                   break;
-               case 'D':
-                   howto |= RB_MULTIPLE;
-                   break;
-               case 'm':
-                   howto |= RB_MUTE;
-                   break;
-               case 'g':
-                   howto |= RB_GDB;
-                   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 'v':
-                   howto |= RB_VERBOSE;
-                   break;
-               default:
-                   active = 0;
-                   break;
-               }
-           cp++;
-       }
-    }
-
+    howto = boot_parse_cmdline(kargs);
     howto |= bootenv_flags();
 #if defined(__sparc64__)
     if (md_bootserial() != -1)

Modified: head/stand/efi/loader/main.c
==============================================================================
--- head/stand/efi/loader/main.c        Fri Jul 13 16:43:17 2018        
(r336245)
+++ head/stand/efi/loader/main.c        Fri Jul 13 16:43:23 2018        
(r336246)
@@ -420,79 +420,10 @@ parse_args(int argc, CHAR16 *argv[], bool has_kbd)
         */
        howto = 0;
        for (i = 1; i < argc; i++) {
-               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 'h':
-                                       howto |= RB_SERIAL;
-                                       break;
-                               case 'm':
-                                       howto |= RB_MUTE;
-                                       break;
-                               case 'p':
-                                       howto |= RB_PAUSE;
-                                       break;
-                               case 'P':
-                                       if (!has_kbd)
-                                               howto |= RB_SERIAL | 
RB_MULTIPLE;
-                                       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 {
-                                                       cpy16to8(&argv[i + 
1][0], var,
-                                                           sizeof(var));
-                                                       
setenv("comconsole_speed", var, 1);
-                                               }
-                                               i++;
-                                               break;
-                                       } else {
-                                               cpy16to8(&argv[i][j + 1], var,
-                                                   sizeof(var));
-                                               setenv("comconsole_speed", var, 
1);
-                                               break;
-                                       }
-                               case 'v':
-                                       howto |= RB_VERBOSE;
-                                       break;
-                               }
-                       }
-               } else {
-                       vargood = false;
-                       for (j = 0; argv[i][j] != 0; j++) {
-                               if (j == sizeof(var)) {
-                                       vargood = false;
-                                       break;
-                               }
-                               if (j > 0 && argv[i][j] == '=')
-                                       vargood = true;
-                               var[j] = (char)argv[i][j];
-                       }
-                       if (vargood) {
-                               var[j] = 0;
-                               putenv(var);
-                       }
-               }
+               cpy16to8(argv[i], var, sizeof(var));
+               howto |= boot_parse_arg(var);
        }
+
        return (howto);
 }
 

Modified: head/stand/i386/libi386/bootinfo.c
==============================================================================
--- head/stand/i386/libi386/bootinfo.c  Fri Jul 13 16:43:17 2018        
(r336245)
+++ head/stand/i386/libi386/bootinfo.c  Fri Jul 13 16:43:23 2018        
(r336246)
@@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$");
 #include <stand.h>
 #include <sys/param.h>
 #include <sys/reboot.h>
+#include <sys/boot.h>
 #include <sys/linker.h>
 #include "bootstrap.h"
 #include "libi386.h"
@@ -38,62 +39,11 @@ __FBSDID("$FreeBSD$");
 int
 bi_getboothowto(char *kargs)
 {
-    char       *cp;
     char       *curpos, *next, *string;
     int                howto;
-    int                active;
     int                vidconsole;
 
-    /* Parse kargs */
-    howto = 0;
-    if (kargs  != NULL) {
-       cp = kargs;
-       active = 0;
-       while (*cp != 0) {
-           if (!active && (*cp == '-')) {
-               active = 1;
-           } else if (active)
-               switch (*cp) {
-               case 'a':
-                   howto |= RB_ASKNAME;
-                   break;
-               case 'C':
-                   howto |= RB_CDROM;
-                   break;
-               case 'd':
-                   howto |= RB_KDB;
-                   break;
-               case 'D':
-                   howto |= RB_MULTIPLE;
-                   break;
-               case 'm':
-                   howto |= RB_MUTE;
-                   break;
-               case 'g':
-                   howto |= RB_GDB;
-                   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 'v':
-                   howto |= RB_VERBOSE;
-                   break;
-               default:
-                   active = 0;
-                   break;
-               }
-           cp++;
-       }
-    }
+    howto = boot_parse_cmdline(kargs);
     howto |= bootenv_flags();
 
     /* Enable selected consoles */

Modified: head/stand/userboot/userboot/bootinfo.c
==============================================================================
--- head/stand/userboot/userboot/bootinfo.c     Fri Jul 13 16:43:17 2018        
(r336245)
+++ head/stand/userboot/userboot/bootinfo.c     Fri Jul 13 16:43:23 2018        
(r336246)
@@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$");
 #include <stand.h>
 #include <sys/param.h>
 #include <sys/reboot.h>
+#include <sys/boot.h>
 #include <sys/linker.h>
 
 #include "bootstrap.h"
@@ -38,63 +39,11 @@ __FBSDID("$FreeBSD$");
 int
 bi_getboothowto(char *kargs)
 {
-    char       *cp;
     char       *curpos, *next, *string;
     int                howto;
-    int                active;
     int                vidconsole;
 
-    /* Parse kargs */
-    howto = 0;
-    if (kargs  != NULL) {
-       cp = kargs;
-       active = 0;
-       while (*cp != 0) {
-           if (!active && (*cp == '-')) {
-               active = 1;
-           } else if (active)
-               switch (*cp) {
-               case 'a':
-                   howto |= RB_ASKNAME;
-                   break;
-               case 'C':
-                   howto |= RB_CDROM;
-                   break;
-               case 'd':
-                   howto |= RB_KDB;
-                   break;
-               case 'D':
-                   howto |= RB_MULTIPLE;
-                   break;
-               case 'm':
-                   howto |= RB_MUTE;
-                   break;
-               case 'g':
-                   howto |= RB_GDB;
-                   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 'v':
-                   howto |= RB_VERBOSE;
-                   break;
-               default:
-                   active = 0;
-                   break;
-               }
-           cp++;
-       }
-    }
-
+    howto = boot_parse_cmdline(kargs);
     howto |= bootenv_flags();
 
     /* Enable selected consoles */
@@ -117,7 +66,8 @@ bi_getboothowto(char *kargs)
 
     /*
      * XXX: Note that until the kernel is ready to respect multiple consoles
-     * for the boot messages, the first named console is the primary console
+     * for the messages from /etc/rc, the first named console is the primary
+     * console
      */
     if (!strcmp(string, "vidconsole"))
        howto &= ~RB_SERIAL;
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to