a05ae041efaab9576b4829392f6c155310c1805c
[people/teissler/ipfire-2.x.git] / src / patches / coreutils-5.96-uname-1.patch
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