diff options
Diffstat (limited to 'arch/sparc64/solaris/misc.c')
-rw-r--r-- | arch/sparc64/solaris/misc.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/arch/sparc64/solaris/misc.c b/arch/sparc64/solaris/misc.c index 5284996780a..719c90905a1 100644 --- a/arch/sparc64/solaris/misc.c +++ b/arch/sparc64/solaris/misc.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <asm/oplib.h> | 23 | #include <asm/oplib.h> |
24 | #include <asm/idprom.h> | 24 | #include <asm/idprom.h> |
25 | #include <asm/smp.h> | 25 | #include <asm/smp.h> |
26 | #include <asm/prom.h> | ||
26 | 27 | ||
27 | #include "conv.h" | 28 | #include "conv.h" |
28 | 29 | ||
@@ -194,14 +195,17 @@ static char *machine(void) | |||
194 | } | 195 | } |
195 | } | 196 | } |
196 | 197 | ||
197 | static char *platform(char *buffer) | 198 | static char *platform(char *buffer, int sz) |
198 | { | 199 | { |
200 | struct device_node *dp = of_find_node_by_path("/"); | ||
199 | int len; | 201 | int len; |
200 | 202 | ||
201 | *buffer = 0; | 203 | *buffer = 0; |
202 | len = prom_getproperty(prom_root_node, "name", buffer, 256); | 204 | len = strlen(dp->name); |
203 | if(len > 0) | 205 | if (len > sz) |
204 | buffer[len] = 0; | 206 | len = sz; |
207 | memcpy(buffer, dp->name, len); | ||
208 | buffer[len] = 0; | ||
205 | if (*buffer) { | 209 | if (*buffer) { |
206 | char *p; | 210 | char *p; |
207 | 211 | ||
@@ -213,16 +217,22 @@ static char *platform(char *buffer) | |||
213 | return "sun4u"; | 217 | return "sun4u"; |
214 | } | 218 | } |
215 | 219 | ||
216 | static char *serial(char *buffer) | 220 | static char *serial(char *buffer, int sz) |
217 | { | 221 | { |
218 | int node = prom_getchild(prom_root_node); | 222 | struct device_node *dp = of_find_node_by_path("/options"); |
219 | int len; | 223 | int len; |
220 | 224 | ||
221 | node = prom_searchsiblings(node, "options"); | ||
222 | *buffer = 0; | 225 | *buffer = 0; |
223 | len = prom_getproperty(node, "system-board-serial#", buffer, 256); | 226 | if (dp) { |
224 | if(len > 0) | 227 | char *val = of_get_property(dp, "system-board-serial#", &len); |
225 | buffer[len] = 0; | 228 | |
229 | if (val && len > 0) { | ||
230 | if (len > sz) | ||
231 | len = sz; | ||
232 | memcpy(buffer, val, len); | ||
233 | buffer[len] = 0; | ||
234 | } | ||
235 | } | ||
226 | if (!*buffer) | 236 | if (!*buffer) |
227 | return "4512348717234"; | 237 | return "4512348717234"; |
228 | else | 238 | else |
@@ -305,8 +315,8 @@ asmlinkage int solaris_sysinfo(int cmd, u32 buf, s32 count) | |||
305 | case SI_MACHINE: r = machine(); break; | 315 | case SI_MACHINE: r = machine(); break; |
306 | case SI_ARCHITECTURE: r = "sparc"; break; | 316 | case SI_ARCHITECTURE: r = "sparc"; break; |
307 | case SI_HW_PROVIDER: r = "Sun_Microsystems"; break; | 317 | case SI_HW_PROVIDER: r = "Sun_Microsystems"; break; |
308 | case SI_HW_SERIAL: r = serial(buffer); break; | 318 | case SI_HW_SERIAL: r = serial(buffer, sizeof(buffer)); break; |
309 | case SI_PLATFORM: r = platform(buffer); break; | 319 | case SI_PLATFORM: r = platform(buffer, sizeof(buffer)); break; |
310 | case SI_SRPC_DOMAIN: r = ""; break; | 320 | case SI_SRPC_DOMAIN: r = ""; break; |
311 | case SI_VERSION: r = "Generic"; break; | 321 | case SI_VERSION: r = "Generic"; break; |
312 | default: return -EINVAL; | 322 | default: return -EINVAL; |