1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * bootstr.c: Boot string/argument acquisition from the PROM. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright(C) 1995 David S. Miller (davem@caip.rutgers.edu) 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/string.h> 9*4882a593Smuzhiyun #include <asm/oplib.h> 10*4882a593Smuzhiyun #include <linux/init.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define BARG_LEN 256 13*4882a593Smuzhiyun static char barg_buf[BARG_LEN] = { 0 }; 14*4882a593Smuzhiyun static char fetched __initdata = 0; 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun char * __init prom_getbootargs(void)17*4882a593Smuzhiyunprom_getbootargs(void) 18*4882a593Smuzhiyun { 19*4882a593Smuzhiyun int iter; 20*4882a593Smuzhiyun char *cp, *arg; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* This check saves us from a panic when bootfd patches args. */ 23*4882a593Smuzhiyun if (fetched) { 24*4882a593Smuzhiyun return barg_buf; 25*4882a593Smuzhiyun } 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun switch (prom_vers) { 28*4882a593Smuzhiyun case PROM_V0: 29*4882a593Smuzhiyun cp = barg_buf; 30*4882a593Smuzhiyun /* Start from 1 and go over fd(0,0,0)kernel */ 31*4882a593Smuzhiyun for (iter = 1; iter < 8; iter++) { 32*4882a593Smuzhiyun arg = (*(romvec->pv_v0bootargs))->argv[iter]; 33*4882a593Smuzhiyun if (arg == NULL) 34*4882a593Smuzhiyun break; 35*4882a593Smuzhiyun while (*arg != 0) { 36*4882a593Smuzhiyun /* Leave place for space and null. */ 37*4882a593Smuzhiyun if (cp >= barg_buf + BARG_LEN - 2) 38*4882a593Smuzhiyun /* We might issue a warning here. */ 39*4882a593Smuzhiyun break; 40*4882a593Smuzhiyun *cp++ = *arg++; 41*4882a593Smuzhiyun } 42*4882a593Smuzhiyun *cp++ = ' '; 43*4882a593Smuzhiyun if (cp >= barg_buf + BARG_LEN - 1) 44*4882a593Smuzhiyun /* We might issue a warning here. */ 45*4882a593Smuzhiyun break; 46*4882a593Smuzhiyun } 47*4882a593Smuzhiyun *cp = 0; 48*4882a593Smuzhiyun break; 49*4882a593Smuzhiyun case PROM_V2: 50*4882a593Smuzhiyun case PROM_V3: 51*4882a593Smuzhiyun /* 52*4882a593Smuzhiyun * V3 PROM cannot supply as with more than 128 bytes 53*4882a593Smuzhiyun * of an argument. But a smart bootstrap loader can. 54*4882a593Smuzhiyun */ 55*4882a593Smuzhiyun strlcpy(barg_buf, *romvec->pv_v2bootargs.bootargs, sizeof(barg_buf)); 56*4882a593Smuzhiyun break; 57*4882a593Smuzhiyun default: 58*4882a593Smuzhiyun break; 59*4882a593Smuzhiyun } 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun fetched = 1; 62*4882a593Smuzhiyun return barg_buf; 63*4882a593Smuzhiyun } 64