]>
Commit | Line | Data |
---|---|---|
dd714b8a MT |
1 | Submitted By: Matthew Burgess <matthew at linuxfromscratch dot org> |
2 | Date: 2005-10-23 | |
3 | Initial Package Version: 5.92 | |
4 | Upstream Status: pending | |
5 | Origin: Scot McPherson | |
6 | Description: Fix the output of uname once and for all. | |
7 | ||
8 | $ uname -m # This always worked. | |
9 | i686 | |
10 | $ uname -i # Used to report 'unknown'. | |
11 | i386 | |
12 | $ uname -p # Likewise. | |
13 | athlon-4 | |
14 | ||
15 | diff -Naur coreutils-5.92.orig/src/uname.c coreutils-5.92/src/uname.c | |
16 | --- coreutils-5.92.orig/src/uname.c 2005-09-15 20:34:42.000000000 +0000 | |
17 | +++ coreutils-5.92/src/uname.c 2005-10-23 10:14:06.000000000 +0000 | |
18 | @@ -29,6 +29,12 @@ | |
19 | # include <sys/systeminfo.h> | |
20 | #endif | |
21 | ||
22 | +#ifdef linux | |
23 | +#define cpuid(in,a,b,c,d)\ | |
24 | + asm("cpuid": "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (in)); | |
25 | +int has_sse( void ); | |
26 | +#endif | |
27 | + | |
28 | #if HAVE_SYS_SYSCTL_H | |
29 | # if HAVE_SYS_PARAM_H | |
30 | # include <sys/param.h> /* needed for OpenBSD 3.0 */ | |
31 | @@ -256,6 +262,96 @@ | |
32 | if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor)) | |
33 | element = processor; | |
34 | } | |
35 | +#else | |
36 | + { | |
37 | + struct utsname u; | |
38 | + uname (&u); | |
39 | + element = u.machine; | |
40 | +#ifdef linux | |
41 | +/****************************************************************************** | |
42 | + * | |
43 | + * Hello, major hack. I shouldn't have to do this. struct utsname should | |
44 | + * have another element with this info in it. There's probably a struct | |
45 | + * somewhere that has this info, I just don't know where it is. | |
46 | + * | |
47 | + *****************************************************************************/ | |
48 | + | |
49 | + if( !strcmp( element, "i586" ) || !strcmp( element, "i686" ) ) { | |
50 | + int eax, ebx, ecx, edx, unused; | |
51 | + int model, family, sse; | |
52 | + | |
53 | + cpuid(0,unused,ebx,ecx,edx); | |
54 | + cpuid(1,eax,unused,unused,unused); | |
55 | + model = (eax >> 4) & 0xf; | |
56 | + family = (eax >> 8) & 0xf; | |
57 | + | |
58 | + switch(ebx) { | |
59 | + case 0x756e6547: // Intel | |
60 | + switch( family ) { | |
61 | + case 5: // Pentium | |
62 | + if( model <= 3 ) | |
63 | + element="pentium"; | |
64 | + if( model > 3 ) | |
65 | + element="pentium-mmx"; | |
66 | + break; | |
67 | + case 6: // PentiumPro - Pentium III | |
68 | + if( model == 1 ) // Pentium Pro | |
69 | + element="pentiumpro"; | |
70 | + if( ( model == 3 ) || ( model == 5 ) || | |
71 | + ( model == 6 ) ) // Pentium II | |
72 | + element="pentium2"; | |
73 | + if( ( model == 7 ) || ( model == 8 ) || | |
74 | + ( model == 10 ) || ( model == 11 ) ) // These are all Pentium III | |
75 | + element="pentium3"; | |
76 | + break; | |
77 | + case 15: // Pentium4 | |
78 | + element="pentium4"; | |
79 | + break; | |
80 | + default: | |
81 | + break; | |
82 | + } // end switch( family ) | |
83 | + break; | |
84 | + case 0x68747541: // AMD | |
85 | + switch(family) { | |
86 | + case 5: | |
87 | + if( ( model == 0 ) || ( model == 1 ) || | |
88 | + ( model == 2 ) || ( model == 3 ) ) // K5 | |
89 | + element="i586"; | |
90 | + if( ( model == 6 ) || ( model == 7 ) ) // K6 | |
91 | + element="k6"; | |
92 | + if( model == 8 ) // K6-2 | |
93 | + element="k6-2"; | |
94 | + if( model == 9 ) // K6-3 | |
95 | + element="k6-3"; | |
96 | + break; | |
97 | + case 6: | |
98 | + if( model <= 4 ) | |
99 | + element="athlon"; | |
100 | + if( model > 4 ) { | |
101 | + sse = has_sse(); | |
102 | + if( sse == 0 ) | |
103 | + element="athlon"; | |
104 | + if( sse == 1 ) | |
105 | + element="athlon-4"; | |
106 | + } | |
107 | + break; | |
108 | + case 15: | |
109 | + element="athlon-4"; | |
110 | + break; | |
111 | + default: | |
112 | + break; | |
113 | + } // end switch( family ) | |
114 | + break; | |
115 | + case 0x69727943: // Cyrix | |
116 | + element="i386"; // who knows what cyrix supports, lets be safe | |
117 | + break; | |
118 | + default: | |
119 | + break; | |
120 | + } // end switch(ebx) | |
121 | + } | |
122 | + | |
123 | +#endif | |
124 | + } | |
125 | #endif | |
126 | #ifdef UNAME_PROCESSOR | |
127 | if (element == unknown) | |
128 | @@ -293,7 +389,7 @@ | |
129 | ||
130 | if (toprint & PRINT_HARDWARE_PLATFORM) | |
131 | { | |
132 | - char const *element = unknown; | |
133 | + char *element = unknown; | |
134 | #if HAVE_SYSINFO && defined SI_PLATFORM | |
135 | { | |
136 | static char hardware_platform[257]; | |
137 | @@ -301,6 +397,15 @@ | |
138 | hardware_platform, sizeof hardware_platform)) | |
139 | element = hardware_platform; | |
140 | } | |
141 | +#else | |
142 | + { | |
143 | + struct utsname u; | |
144 | + uname (&u); | |
145 | + element = u.machine; | |
146 | + if (strlen (element) == 4 && element[0] == 'i' && element[2] == '8' | |
147 | + && element[3] == '6') | |
148 | + element[1] = '3'; | |
149 | + } | |
150 | #endif | |
151 | #ifdef UNAME_HARDWARE_PLATFORM | |
152 | if (element == unknown) | |
153 | @@ -323,3 +428,29 @@ | |
154 | ||
155 | exit (EXIT_SUCCESS); | |
156 | } | |
157 | + | |
158 | +#ifdef linux | |
159 | + | |
160 | +/****************************************************************************** | |
161 | + * | |
162 | + * int has_sse( void ) | |
163 | + * Checks Athlon CPU's to see if they support SSE. | |
164 | + * | |
165 | + *****************************************************************************/ | |
166 | + | |
167 | +int has_sse( void ) | |
168 | +{ | |
169 | + unsigned long edx, unused; | |
170 | + int sse; | |
171 | + cpuid(1,unused,unused,unused,edx); | |
172 | + // I think, I need this tested on a Duron with SSE | |
173 | + // and one without it. | |
174 | + sse = edx & 0x2000000; | |
175 | + if( sse == 0 ) { | |
176 | + return 0; | |
177 | + } else { | |
178 | + return 1; | |
179 | + } | |
180 | + | |
181 | +} | |
182 | +#endif |