File Coverage

blib/lib/Sys/Info/Driver/Unknown/Device/CPU/Env.pm
Criterion Covered Total %
statement 31 61 50.8
branch 4 30 13.3
condition 1 9 11.1
subroutine 10 12 83.3
pod 1 1 100.0
total 47 113 41.5


line stmt bran cond sub pod time code
1             package Sys::Info::Driver::Unknown::Device::CPU::Env;
2 1     1   5 use strict;
  1         2  
  1         25  
3 1     1   4 use warnings;
  1         13  
  1         23  
4 1     1   4 use vars qw( $VERSION );
  1         2  
  1         84  
5 1     1   6 use constant RE_VENDOR => qr/(.+?), \s (?:Genuine(Intel)|Authentic(AMD))/xms;
  1         2  
  1         1301  
6              
7             $VERSION = '0.78';
8              
9             my(%INTEL, %AMD, %OTHER_ID, %OTHER, %CPU, $INSTALLED);
10              
11             sub identify {
12 1     1 1 2 my $self = shift;
13              
14 1 50       4 if ( ! $self->{META_DATA} ) {
15 1 50       13 $self->_INSTALL() if ! $INSTALLED;
16              
17 1 50       5 if ( ! $CPU{id} ) {
18 1         2 $self->{META_DATA} = []; # fake
19 1         5 return;
20             }
21              
22 0         0 my($cpu, $count, @cpu);
23 0 0       0 if ($CPU{id} =~ RE_VENDOR ) {
24 0         0 my $cid = $1;
25 0   0     0 my $corp = $2 || $3;
26 0 0       0 if ( my %info = $self->_parse( $cid ) ) {
27 0 0       0 if ( my $mn = $self->_corp( $corp, $info{Family} ) ) {
28 0 0       0 if ( my $name = $mn->{ $info{Model} } ) {
29 0 0 0     0 $count = ($CPU{number} && $CPU{number} > 1) ? $CPU{number} : q{};
30 0         0 $cpu = "$corp $name";
31             }
32             }
33             }
34             }
35              
36 0         0 foreach my $other (keys %OTHER_ID) {
37 0 0       0 if ($CPU{id} =~ / \Q$other\E /xms) {
38 0         0 $cpu = $OTHER_ID{$other};
39             }
40             }
41              
42 0 0       0 $count = 1 if !$count;
43 0         0 for ( 1..$count ) {
44 0         0 push @cpu, {
45             architecture => ($CPU{id} =~ m{ \A (.+?) \s? Family }xmsi),
46             data_width => undef,
47             speed => undef,
48             bus_speed => undef,
49             address_width => undef,
50             name => $cpu,
51             };
52             }
53 0         0 $self->{META_DATA} = [@cpu];
54             }
55              
56 0         0 return $self->_serve_from_cache(wantarray);
57             }
58              
59             # ------------------------[ P R I V A T E ]------------------------ #
60              
61             sub _INSTALL {
62 1     1   2 my $self = shift;
63 1         4 %INTEL = _INTEL();
64 1         4 %AMD = _AMD();
65 1         3 %OTHER_ID = _OTHER_ID();
66 1         4 %OTHER = _OTHER();
67 1         8 %CPU = ( # PIV 3.0 GHz HT
68             id => $ENV{PROCESSOR_IDENTIFIER}, # x86 Family 15 Model 3 Stepping 3, GenuineIntel
69             number => $ENV{NUMBER_OF_PROCESSORS}, # 2
70             arch => $ENV{PROCESSOR_ARCHITECTURE}, # x86
71             rev => $ENV{PROCESSOR_REVISION}, # 0303
72             level => $ENV{PROCESSOR_LEVEL}, # 15
73             );
74              
75 1 50 33     26 if ( ! $CPU{id} && $self->can('__env_pi') ) {
76 0         0 $CPU{id} = $self->__env_pi;
77             }
78 1         2 $INSTALLED = 1;
79 1         3 return;
80             }
81              
82             sub _corp {
83 0     0   0 my $self = shift;
84 0         0 my $corp = shift;
85 0         0 my $family = shift;
86 0 0       0 return $corp eq 'Intel' ? $INTEL{$family}
    0          
87             : $corp eq 'AMD' ? $AMD{$family}
88             : undef;
89             }
90              
91             sub _parse {
92 0     0   0 my $self = shift;
93 0         0 my $id = shift;
94 0         0 my $arch = $CPU{arch};
95 0 0       0 if ($id =~ /$arch\s(.+?) \z/xms) {
96 0         0 my %h = split /\s+/xms, $1; # Family Model Stepping
97 0         0 for my $k (keys %h) {
98 0 0       0 $h{$k} = q{} unless defined $h{$k};
99             }
100 0         0 return %h;
101             }
102             }
103              
104             sub _INTEL {
105             # Family Model Name
106             return
107 1     1   28 '4' => {
108             '0' => '486 DX-25/33',
109             '1' => '486 DX-50',
110             '2' => '486 SX',
111             '3' => '486 DX/2',
112             '4' => '486 SL',
113             '5' => '486 SX/2',
114             '7' => '486 DX/2-WB',
115             '8' => '486 DX/4',
116             '9' => '486 DX/4-WB',
117             },
118             '5' => {
119             '0' => 'Pentium 60/66 A-step',
120             '1' => 'Pentium 60/66',
121             '2' => 'Pentium 75 - 200',
122             '3' => 'OverDrive PODP5V83',
123             '4' => 'Pentium MMX',
124             '7' => 'Mobile Pentium 75 - 200',
125             '8' => 'Mobile Pentium MMX',
126             },
127             '6' => {
128             '0' => 'Pentium Pro A-step',
129             '1' => 'Pentium Pro',
130             '3' => 'Pentium II (Klamath)',
131             '5' => 'Pentium II (Deschutes), Celeron (Covington), Mobile Pentium II (Dixon)',
132             '6' => 'Mobile Pentium II, Celeron (Mendocino)',
133             '7' => 'Pentium III (Katmai)',
134             '8' => 'Pentium III (Coppermine)',
135             '9' => 'Mobile Pentium III',
136             '10' => 'Pentium III (0.18 µm)',
137             '11' => 'Pentium III (0.13 µm)',
138              
139             '13' => 'Celeron M', # ???
140             '15' => 'Core 2 Duo (Merom)', # ???
141             },
142             '7' => {
143             '0' => 'Itanium (IA-64)',
144             },
145             '15' => {
146             '0' => 'Pentium IV (0.18 µm)',
147             '1' => 'Pentium IV (0.18 µm)',
148             '2' => 'Pentium IV (0.13 µm)',
149             '3' => 'Pentium IV (0.09 µm)',
150             # Itanium 2 (IA-64)?
151             },
152             }
153              
154             sub _AMD {
155             # Family Model Name
156             return
157 1     1   13 '4' => {
158             '3' => '486 DX/2',
159             '7' => '486 DX/2-WB',
160             '8' => '486 DX/4',
161             '9' => '486 DX/4-WB',
162             '14' => 'Am5x86-WT',
163             '15' => 'Am5x86-WB',
164             },
165             '5' => {
166             '0' => 'K5/SSA5',
167             '1' => 'K5',
168             '2' => 'K5',
169             '3' => 'K5',
170             '6' => 'K6',
171             '7' => 'K6',
172             '8' => 'K6-2',
173             '9' => 'K6-3',
174             '13' => 'K6-2+ or K6-III+',
175             },
176             '6' => {
177             '0' => 'Athlon (25 µm)',
178             '1' => 'Athlon (25 µm)',
179             '2' => 'Athlon (18 µm)',
180             '3' => 'Duron',
181             '4' => 'Athlon (Thunderbird)',
182             '6' => 'Athlon (Palamino)',
183             '7' => 'Duron (Morgan)',
184             '8' => 'Athlon (Thoroughbred)',
185             '10' => 'Athlon (Barton)',
186             },
187             '15' => {
188             '4' => 'Athlon 64',
189             '5' => 'Athlon 64 FX Opteron',
190             },
191             }
192              
193             sub _OTHER_ID {
194             # Vendor Manufacturer Name
195             return
196 1     1   11 'CyrixInstead' => 'Cyrix',
197             'CentaurHauls' => 'Centaur',
198             'NexGenDriven' => 'NexGen',
199             'GenuineTMx86' => 'Transmeta',
200             'RiseRiseRise' => 'Rise',
201             'UMC UMC UMC' => 'UMC',
202             'SiS SiS SiS' => 'SiS',
203             'Geode by NSC' => 'National Semiconductor',
204             }
205              
206             sub _OTHER {
207             return
208 1     1   19 Cyrix => {
209             # Family Model Name
210             '4' => {
211             '4' => 'MediaGX',
212             },
213             '5' => {
214             '2' => '6x86 / 6x86L (Identifying the difference)',
215             '4' => 'MediaGX MMX Enhanced',
216             },
217             '6' => {
218             '0' => 'm II (6x86MX)',
219             '5' => 'VIA Cyrix M2 core',
220             '6' => 'WinChip C5A',
221             '7' => 'WinChip C5B ,WinChip C5C',
222             '8' => 'WinChip C5N',
223             '9' => 'WinChip C5XL, WinChip C5P',
224             },
225             },
226             UMC => {
227             '4' => {
228             '1' => 'U5D',
229             '2' => 'U5S',
230             },
231             },
232             Centaur => {
233             '5' => {
234             '4' => 'C6',
235             '8' => 'C2',
236             '9' => 'C3',
237             },
238             },
239             'National Semiconductor' => {
240             '5' => {
241             '4' => 'GX1, GXLV, GXm',
242             '5' => 'GX2',
243             },
244             },
245              
246             NexGen => {
247             '5' => {
248             '0' => 'Nx586',
249             },
250             },
251             Rise => {
252             '5' => {
253             '0' => 'mP6',
254             '1' => 'mP6',
255             },
256             },
257             SiS => {
258             '5' => {
259             '0' => '55x',
260             }
261             },
262             Transmeta => {
263             '5' => {
264             '4' => 'Crusoe TM3x00 and TM5x00',
265             },
266             },
267             }
268              
269             1;
270              
271             __END__