cpuid 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. data/VERSION +1 -1
  2. data/lib/cpuid/cpuid.rb +43 -7
  3. metadata +1 -1
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.3.0
data/lib/cpuid/cpuid.rb CHANGED
@@ -14,12 +14,15 @@ module CPUID
14
14
  BRAND_STR_FN_1 = 0x80000002
15
15
  BRAND_STR_FN_2 = 0x80000003
16
16
  BRAND_STR_FN_3 = 0x80000004
17
+ EXT_L2_FN = 0x80000006
18
+ POWER_MANAGEMENT_FN = 0x80000007
17
19
  ADDRESS_SIZE_FN = 0x80000008
18
20
 
19
- INTEL_SYSCALL_CHECK_BIT = 1 << 10
20
- INTEL_XD_CHECK_BIT = 1 << 19
21
- INTEL_64_CHECK_BIT = 1 << 28
21
+ INTEL_SYSCALL_CHECK_BIT = 1 << 11
22
+ INTEL_XD_CHECK_BIT = 1 << 20
23
+ INTEL_64_CHECK_BIT = 1 << 29
22
24
  INTEL_LAHF_CHECK_BIT = 1
25
+ INTEL_TSC_INVARIANCE_CHECK_BIT = 1 << 7
23
26
  ##
24
27
  # Returns the model information of the processor, which can be used
25
28
  # for telling individual processors apart. Note: you will need to use
@@ -130,7 +133,7 @@ module CPUID
130
133
  #
131
134
  # @return [Boolean]
132
135
  def has_syscall?
133
- !!(run_function(EXT_FEATURE_FN)[3] & INTEL_SYSCALL_CHECK_BIT)
136
+ (run_function(EXT_FEATURE_FN)[3] & INTEL_SYSCALL_CHECK_BIT) > 0
134
137
  end
135
138
 
136
139
  ##
@@ -138,7 +141,7 @@ module CPUID
138
141
  #
139
142
  # @return [Boolean]
140
143
  def has_xd_bit?
141
- !!(run_function(EXT_FEATURE_FN)[3] & INTEL_XD_CHECK_BIT)
144
+ (run_function(EXT_FEATURE_FN)[3] & INTEL_XD_CHECK_BIT) > 0
142
145
  end
143
146
 
144
147
  ##
@@ -146,7 +149,7 @@ module CPUID
146
149
  #
147
150
  # @return [Boolean]
148
151
  def has_lahf?
149
- !!(run_function(EXT_FEATURE_FN)[2] & INTEL_LAHF_CHECK_BIT)
152
+ (run_function(EXT_FEATURE_FN)[2] & INTEL_LAHF_CHECK_BIT) > 0
150
153
  end
151
154
 
152
155
  ##
@@ -154,11 +157,44 @@ module CPUID
154
157
  #
155
158
  # @return [Boolean] does the processor support x86_64?
156
159
  def has_x64?
157
- !!(run_function(EXT_FEATURE_FN)[3] & INTEL_64_CHECK_BIT)
160
+ (run_function(EXT_FEATURE_FN)[3] & INTEL_64_CHECK_BIT) > 0
161
+ end
162
+
163
+ ##
164
+ # Returns whether the processor supports TSC invariance.
165
+ #
166
+ # I honestly don't know what this is, but it's in the intel spec.
167
+ def has_tsc_invariance?
168
+ (run_function(POWER_MANAGEMENT_FN).last & INTEL_TSC_INVARIANCE_CHECK_BIT) > 0
169
+ end
170
+
171
+ ##
172
+ # Access L2 information via the extended function, 0x80000006.
173
+ def easy_L2_info
174
+ ecx = run_function(SIGNATURE_FEATURES_FN)[2]
175
+ assoc_bits = ((ecx >> 12) & 0xF)
176
+ assoc = {}
177
+ case assoc_bits
178
+ when 0x0
179
+ assoc[:disabled] = true
180
+ when 0xF
181
+ assoc[:fully_associative] = true
182
+ else
183
+ assoc[:direct_mapped] = true if assoc_bits & 0x1 > 0
184
+ assoc[:sixteen_way] = true if assoc_bits & 0x8 > 0
185
+ assoc[:eight_way] = true if assoc_bits & 0x6 > 0
186
+ assoc[:four_way] = true if assoc_bits & 0x4 > 0
187
+ assoc[:two_way] = true if assoc_bits & 0x2 > 0
188
+ end
189
+ {:line_size => ecx & 0xFF, :cache_size => (ecx >> 16) * 1024, :associativity => assoc}
158
190
  end
159
191
 
160
192
  #private
161
193
 
194
+ def supports_easy_L2?
195
+ EXT_L2_FN <= max_extended_param
196
+ end
197
+
162
198
  def signature
163
199
  @signature ||= run_function(SIGNATURE_FEATURES_FN).first
164
200
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cpuid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Edgar