162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * bootstr.c: Boot string/argument acquisition from the PROM. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright(C) 1995 David S. Miller (davem@caip.rutgers.edu) 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/string.h> 962306a36Sopenharmony_ci#include <asm/oplib.h> 1062306a36Sopenharmony_ci#include <linux/init.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define BARG_LEN 256 1362306a36Sopenharmony_cistatic char barg_buf[BARG_LEN] = { 0 }; 1462306a36Sopenharmony_cistatic char fetched __initdata = 0; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cichar * __init 1762306a36Sopenharmony_ciprom_getbootargs(void) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci int iter; 2062306a36Sopenharmony_ci char *cp, *arg; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci /* This check saves us from a panic when bootfd patches args. */ 2362306a36Sopenharmony_ci if (fetched) { 2462306a36Sopenharmony_ci return barg_buf; 2562306a36Sopenharmony_ci } 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci switch (prom_vers) { 2862306a36Sopenharmony_ci case PROM_V0: 2962306a36Sopenharmony_ci cp = barg_buf; 3062306a36Sopenharmony_ci /* Start from 1 and go over fd(0,0,0)kernel */ 3162306a36Sopenharmony_ci for (iter = 1; iter < 8; iter++) { 3262306a36Sopenharmony_ci arg = (*(romvec->pv_v0bootargs))->argv[iter]; 3362306a36Sopenharmony_ci if (arg == NULL) 3462306a36Sopenharmony_ci break; 3562306a36Sopenharmony_ci while (*arg != 0) { 3662306a36Sopenharmony_ci /* Leave place for space and null. */ 3762306a36Sopenharmony_ci if (cp >= barg_buf + BARG_LEN - 2) 3862306a36Sopenharmony_ci /* We might issue a warning here. */ 3962306a36Sopenharmony_ci break; 4062306a36Sopenharmony_ci *cp++ = *arg++; 4162306a36Sopenharmony_ci } 4262306a36Sopenharmony_ci *cp++ = ' '; 4362306a36Sopenharmony_ci if (cp >= barg_buf + BARG_LEN - 1) 4462306a36Sopenharmony_ci /* We might issue a warning here. */ 4562306a36Sopenharmony_ci break; 4662306a36Sopenharmony_ci } 4762306a36Sopenharmony_ci *cp = 0; 4862306a36Sopenharmony_ci break; 4962306a36Sopenharmony_ci case PROM_V2: 5062306a36Sopenharmony_ci case PROM_V3: 5162306a36Sopenharmony_ci /* 5262306a36Sopenharmony_ci * V3 PROM cannot supply as with more than 128 bytes 5362306a36Sopenharmony_ci * of an argument. But a smart bootstrap loader can. 5462306a36Sopenharmony_ci */ 5562306a36Sopenharmony_ci strscpy(barg_buf, *romvec->pv_v2bootargs.bootargs, sizeof(barg_buf)); 5662306a36Sopenharmony_ci break; 5762306a36Sopenharmony_ci default: 5862306a36Sopenharmony_ci break; 5962306a36Sopenharmony_ci } 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci fetched = 1; 6262306a36Sopenharmony_ci return barg_buf; 6362306a36Sopenharmony_ci} 64