Logo Search packages:      
Sourcecode: linux version File versions  Download package

cmdline.c

/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * cmdline.c: Kernel command line creation using ARCS argc/argv.
 *
 * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
 */
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/string.h>

#include <asm/sgialib.h>
#include <asm/bootinfo.h>

#undef DEBUG_CMDLINE

char * __init prom_getcmdline(void)
{
      return arcs_cmdline;
}

static char *ignored[] = {
      "ConsoleIn=",
      "ConsoleOut=",
      "SystemPartition=",
      "OSLoader=",
      "OSLoadPartition=",
      "OSLoadFilename=",
      "OSLoadOptions="
};

static char *used_arc[][2] = {
      { "OSLoadPartition=", "root=" },
      { "OSLoadOptions=", "" }
};

static char * __init move_firmware_args(char* cp)
{
      char *s;
      int actr, i;

      actr = 1; /* Always ignore argv[0] */

      while (actr < prom_argc) {
            for(i = 0; i < ARRAY_SIZE(used_arc); i++) {
                  int len = strlen(used_arc[i][0]);

                  if (!strncmp(prom_argv(actr), used_arc[i][0], len)) {
                  /* Ok, we want it. First append the replacement... */
                        strcat(cp, used_arc[i][1]);
                        cp += strlen(used_arc[i][1]);
                        /* ... and now the argument */
                        s = strstr(prom_argv(actr), "=");
                        if (s) {
                              s++;
                              strcpy(cp, s);
                              cp += strlen(s);
                        }
                        *cp++ = ' ';
                        break;
                  }
            }
            actr++;
      }

      return cp;
}

void __init prom_init_cmdline(void)
{
      char *cp;
      int actr, i;

      actr = 1; /* Always ignore argv[0] */

      cp = arcs_cmdline;
      /*
       * Move ARC variables to the beginning to make sure they can be
       * overridden by later arguments.
       */
      cp = move_firmware_args(cp);

      while (actr < prom_argc) {
            for (i = 0; i < ARRAY_SIZE(ignored); i++) {
                  int len = strlen(ignored[i]);

                  if (!strncmp(prom_argv(actr), ignored[i], len))
                        goto pic_cont;
            }
            /* Ok, we want it. */
            strcpy(cp, prom_argv(actr));
            cp += strlen(prom_argv(actr));
            *cp++ = ' ';

      pic_cont:
            actr++;
      }

      if (cp != arcs_cmdline)       /* get rid of trailing space */
            --cp;
      *cp = '\0';

#ifdef DEBUG_CMDLINE
      printk(KERN_DEBUG "prom cmdline: %s\n", arcs_cmdline);
#endif
}

Generated by  Doxygen 1.6.0   Back to index