svn commit: r294767 - head/sys/boot/efi/loader
Steven Hartland
steven.hartland at multiplay.co.uk
Tue Jan 26 10:29:08 UTC 2016
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");
>
More information about the svn-src-head
mailing list