linux/arch/mips/fw/arc/cmdline.c
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * cmdline.c: Kernel command line creation using ARCS argc/argv.
   7 *
   8 * Copyright (C) 1996 David S. Miller (davem@davemloft.net)
   9 */
  10#include <linux/bug.h>
  11#include <linux/init.h>
  12#include <linux/kernel.h>
  13#include <linux/string.h>
  14
  15#include <asm/sgialib.h>
  16#include <asm/bootinfo.h>
  17
  18#undef DEBUG_CMDLINE
  19
  20static char *ignored[] = {
  21        "ConsoleIn=",
  22        "ConsoleOut=",
  23        "SystemPartition=",
  24        "OSLoader=",
  25        "OSLoadPartition=",
  26        "OSLoadFilename=",
  27        "OSLoadOptions="
  28};
  29
  30static char *used_arc[][2] = {
  31        { "OSLoadPartition=", "root=" },
  32        { "OSLoadOptions=", "" }
  33};
  34
  35static char * __init move_firmware_args(char* cp)
  36{
  37        char *s;
  38        int actr, i;
  39
  40        actr = 1; /* Always ignore argv[0] */
  41
  42        while (actr < prom_argc) {
  43                for(i = 0; i < ARRAY_SIZE(used_arc); i++) {
  44                        int len = strlen(used_arc[i][0]);
  45
  46                        if (!strncmp(prom_argv(actr), used_arc[i][0], len)) {
  47                        /* Ok, we want it. First append the replacement... */
  48                                strcat(cp, used_arc[i][1]);
  49                                cp += strlen(used_arc[i][1]);
  50                                /* ... and now the argument */
  51                                s = strchr(prom_argv(actr), '=');
  52                                if (s) {
  53                                        s++;
  54                                        strcpy(cp, s);
  55                                        cp += strlen(s);
  56                                }
  57                                *cp++ = ' ';
  58                                break;
  59                        }
  60                }
  61                actr++;
  62        }
  63
  64        return cp;
  65}
  66
  67void __init prom_init_cmdline(void)
  68{
  69        char *cp;
  70        int actr, i;
  71
  72        actr = 1; /* Always ignore argv[0] */
  73
  74        cp = arcs_cmdline;
  75        /*
  76         * Move ARC variables to the beginning to make sure they can be
  77         * overridden by later arguments.
  78         */
  79        cp = move_firmware_args(cp);
  80
  81        while (actr < prom_argc) {
  82                for (i = 0; i < ARRAY_SIZE(ignored); i++) {
  83                        int len = strlen(ignored[i]);
  84
  85                        if (!strncmp(prom_argv(actr), ignored[i], len))
  86                                goto pic_cont;
  87                }
  88                /* Ok, we want it. */
  89                strcpy(cp, prom_argv(actr));
  90                cp += strlen(prom_argv(actr));
  91                *cp++ = ' ';
  92
  93        pic_cont:
  94                actr++;
  95        }
  96
  97        if (cp != arcs_cmdline)         /* get rid of trailing space */
  98                --cp;
  99        *cp = '\0';
 100
 101#ifdef DEBUG_CMDLINE
 102        printk(KERN_DEBUG "prom cmdline: %s\n", arcs_cmdline);
 103#endif
 104}
 105