diff options
Diffstat (limited to 'arch/sparc/prom/bootstr.c')
-rw-r--r-- | arch/sparc/prom/bootstr.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/arch/sparc/prom/bootstr.c b/arch/sparc/prom/bootstr.c new file mode 100644 index 000000000000..cfdeac2788d1 --- /dev/null +++ b/arch/sparc/prom/bootstr.c | |||
@@ -0,0 +1,63 @@ | |||
1 | /* $Id: bootstr.c,v 1.20 2000/02/08 20:24:23 davem Exp $ | ||
2 | * bootstr.c: Boot string/argument acquisition from the PROM. | ||
3 | * | ||
4 | * Copyright(C) 1995 David S. Miller (davem@caip.rutgers.edu) | ||
5 | */ | ||
6 | |||
7 | #include <linux/string.h> | ||
8 | #include <asm/oplib.h> | ||
9 | #include <asm/sun4prom.h> | ||
10 | #include <linux/init.h> | ||
11 | |||
12 | #define BARG_LEN 256 | ||
13 | static char barg_buf[BARG_LEN] = { 0 }; | ||
14 | static char fetched __initdata = 0; | ||
15 | |||
16 | extern linux_sun4_romvec *sun4_romvec; | ||
17 | |||
18 | char * __init | ||
19 | prom_getbootargs(void) | ||
20 | { | ||
21 | int iter; | ||
22 | char *cp, *arg; | ||
23 | |||
24 | /* This check saves us from a panic when bootfd patches args. */ | ||
25 | if (fetched) { | ||
26 | return barg_buf; | ||
27 | } | ||
28 | |||
29 | switch(prom_vers) { | ||
30 | case PROM_V0: | ||
31 | case PROM_SUN4: | ||
32 | cp = barg_buf; | ||
33 | /* Start from 1 and go over fd(0,0,0)kernel */ | ||
34 | for(iter = 1; iter < 8; iter++) { | ||
35 | arg = (*(romvec->pv_v0bootargs))->argv[iter]; | ||
36 | if(arg == 0) break; | ||
37 | while(*arg != 0) { | ||
38 | /* Leave place for space and null. */ | ||
39 | if(cp >= barg_buf + BARG_LEN-2){ | ||
40 | /* We might issue a warning here. */ | ||
41 | break; | ||
42 | } | ||
43 | *cp++ = *arg++; | ||
44 | } | ||
45 | *cp++ = ' '; | ||
46 | } | ||
47 | *cp = 0; | ||
48 | break; | ||
49 | case PROM_V2: | ||
50 | case PROM_V3: | ||
51 | /* | ||
52 | * V3 PROM cannot supply as with more than 128 bytes | ||
53 | * of an argument. But a smart bootstrap loader can. | ||
54 | */ | ||
55 | strlcpy(barg_buf, *romvec->pv_v2bootargs.bootargs, sizeof(barg_buf)); | ||
56 | break; | ||
57 | default: | ||
58 | break; | ||
59 | } | ||
60 | |||
61 | fetched = 1; | ||
62 | return barg_buf; | ||
63 | } | ||