Class: Hardware::CPU Private
- Defined in:
- hardware.rb,
extend/os/mac/hardware/cpu.rb,
extend/os/linux/hardware/cpu.rb
Overview
This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.
Helper module for querying CPU information.
Constant Summary collapse
- INTEL_32BIT_ARCHS =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
[:i386].freeze
- INTEL_64BIT_ARCHS =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
[:x86_64].freeze
- INTEL_ARCHS =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
T.let((INTEL_32BIT_ARCHS + INTEL_64BIT_ARCHS).freeze, T::Array[Symbol])
- PPC_32BIT_ARCHS =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
[:ppc, :ppc32, :ppc7400, :ppc7450, :ppc970].freeze
- PPC_64BIT_ARCHS =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
[:ppc64, :ppc64le, :ppc970].freeze
- PPC_ARCHS =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
T.let((PPC_32BIT_ARCHS + PPC_64BIT_ARCHS).freeze, T::Array[Symbol])
- ARM_64BIT_ARCHS =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
[:arm64, :aarch64].freeze
- ARM_ARCHS =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
ARM_64BIT_ARCHS
- ALL_ARCHS =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
T.let([ *INTEL_ARCHS, *PPC_ARCHS, *ARM_ARCHS, ].freeze, T::Array[Symbol])
- INTEL_64BIT_OLDEST_CPU =
This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.
:core2
Class Method Summary collapse
- .aes? ⇒ Boolean private
- .altivec? ⇒ Boolean private
- .amd_family(family, cpu_model) ⇒ Object private
- .arch ⇒ Symbol private
- .arch_32_bit ⇒ Symbol private
- .arch_64_bit ⇒ Symbol private
- .arch_flag(arch) ⇒ String private
-
.arm? ⇒ Boolean
internal
Check whether the CPU architecture is ARM.
- .arm_family ⇒ Object private
- .avx2? ⇒ Boolean private
- .avx? ⇒ Boolean private
- .big_endian? ⇒ Boolean private
- .bits ⇒ Integer? private
- .cores ⇒ Integer private
- .extmodel ⇒ Object private
- .family ⇒ Symbol private
- .feature?(name) ⇒ Boolean private
-
.features ⇒ Array<Symbol>
private
Compatibility with Mac method, which returns lowercase symbols instead of strings.
-
.flags ⇒ Object
private
Supported CPU instructions.
- .in_rosetta2? ⇒ Boolean private
- .intel? ⇒ Boolean private
- .intel_family(family, cpu_model) ⇒ Object private
- .is_32_bit? ⇒ Boolean private
- .is_64_bit? ⇒ Boolean private
- .little_endian? ⇒ Boolean private
- .optimization_flags ⇒ Hash{Symbol => String} (also: generic_optimization_flags) private
- .physical_cpu_arm64? ⇒ Boolean private
- .ppc32? ⇒ Boolean private
- .ppc64? ⇒ Boolean private
- .ppc64le? ⇒ Boolean private
- .ppc? ⇒ Boolean private
- .sse3? ⇒ Boolean private
- .sse4? ⇒ Boolean private
- .sse4_2? ⇒ Boolean private
- .ssse3? ⇒ Boolean private
- .sysctl_bool(key) ⇒ Object private
- .sysctl_int(key) ⇒ Object private
- .sysctl_n(*keys) ⇒ Object private
- .type ⇒ Symbol private
- .virtualized? ⇒ false private
Class Method Details
.aes? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
68 69 70 |
# File 'extend/os/mac/hardware/cpu.rb', line 68 def aes? sysctl_bool("hw.optional.aes") end |
.altivec? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
72 73 74 |
# File 'extend/os/mac/hardware/cpu.rb', line 72 def altivec? sysctl_bool("hw.optional.altivec") end |
.amd_family(family, cpu_model) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'extend/os/linux/hardware/cpu.rb', line 90 def amd_family(family, cpu_model) case family when 0x06 :amd_k7 when 0x0f :amd_k8 when 0x10 :amd_k10 when 0x11 :amd_k8_k10_hybrid when 0x12 :amd_k12 when 0x14 :bobcat when 0x15 :bulldozer when 0x16 :jaguar when 0x17 case cpu_model when 0x10..0x2f :zen when 0x30..0x3f, 0x47, 0x60..0x7f, 0x84..0x87, 0x90..0xaf :zen2 end when 0x19 case cpu_model when ..0x0f, 0x20..0x5f :zen3 when 0x10..0x1f, 0x60..0x7f, 0xa0..0xaf :zen4 end when 0x1a :zen5 end end |
.arch ⇒ Symbol
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
76 77 78 79 80 81 82 83 84 85 |
# File 'hardware.rb', line 76 def arch case bits when 32 arch_32_bit when 64 arch_64_bit else :dunno end end |
.arch_32_bit ⇒ Symbol
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
48 49 50 51 52 53 54 55 56 57 58 |
# File 'hardware.rb', line 48 def arch_32_bit if arm? :arm elsif intel? :i386 elsif ppc32? :ppc32 else :dunno end end |
.arch_64_bit ⇒ Symbol
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'hardware.rb', line 61 def arch_64_bit if arm? :arm64 elsif intel? :x86_64 elsif ppc64le? :ppc64le elsif ppc64? :ppc64 else :dunno end end |
.arch_flag(arch) ⇒ String
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
193 194 195 196 197 |
# File 'hardware.rb', line 193 def arch_flag(arch) return "-mcpu=#{arch}" if ppc? "-march=#{arch}" end |
.arm? ⇒ Boolean
This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Check whether the CPU architecture is ARM.
163 164 165 |
# File 'hardware.rb', line 163 def arm? type == :arm end |
.arm_family ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'extend/os/mac/hardware/cpu.rb', line 106 def arm_family case sysctl_int("hw.cpufamily") when 0x2c91a47e # ARMv8.0-A (Typhoon) :arm_typhoon when 0x92fb37c8 # ARMv8.0-A (Twister) :arm_twister when 0x67ceee93 # ARMv8.1-A (Hurricane, Zephyr) :arm_hurricane_zephyr when 0xe81e7ef6 # ARMv8.2-A (Monsoon, Mistral) :arm_monsoon_mistral when 0x07d34b9f # ARMv8.3-A (Vortex, Tempest) :arm_vortex_tempest when 0x462504d2 # ARMv8.4-A (Lightning, Thunder) :arm_lightning_thunder when 0x573b5eec, 0x1b588bb3 # ARMv8.4-A (Firestorm, Icestorm) :arm_firestorm_icestorm when 0xda33d83d # ARMv8.5-A (Blizzard, Avalanche) :arm_blizzard_avalanche when 0xfa33415e # ARMv8.6-A (M3, Ibiza) :arm_ibiza when 0x5f4dea93 # ARMv8.6-A (M3 Pro, Lobos) :arm_lobos when 0x72015832 # ARMv8.6-A (M3 Max, Palma) :arm_palma when 0x6f5129ac # ARMv9.2-A (M4, Donan) :arm_donan when 0x17d5b93a # ARMv9.2-A (M4 Pro / M4 Max, Brava) :arm_brava else # When adding new ARM CPU families, please also update # test/hardware/cpu_spec.rb to include the new families. :dunno end end |
.avx2? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
80 81 82 |
# File 'extend/os/mac/hardware/cpu.rb', line 80 def avx2? sysctl_bool("hw.optional.avx2_0") end |
.avx? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
76 77 78 |
# File 'extend/os/mac/hardware/cpu.rb', line 76 def avx? sysctl_bool("hw.optional.avx1_0") end |
.big_endian? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
173 174 175 |
# File 'hardware.rb', line 173 def big_endian? [1].pack("I") == [1].pack("N") end |
.bits ⇒ Integer?
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
112 113 114 115 116 117 |
# File 'hardware.rb', line 112 def bits @bits ||= T.let(case RUBY_PLATFORM when /x86_64/, /ppc64|powerpc64/, /aarch64|arm64/ then 64 when /i\d86/, /ppc/, /arm/ then 32 end, T.nilable(Integer)) end |
.cores ⇒ Integer
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
103 104 105 106 107 108 109 |
# File 'hardware.rb', line 103 def cores return @cores if @cores @cores = Utils.popen_read("getconf", "_NPROCESSORS_ONLN").chomp.to_i @cores = T.let(1, T.nilable(Integer)) unless $CHILD_STATUS.success? @cores end |
.extmodel ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
64 65 66 |
# File 'extend/os/mac/hardware/cpu.rb', line 64 def extmodel sysctl_int("machdep.cpu.extmodel") end |
.family ⇒ Symbol
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'extend/os/linux/hardware/cpu.rb', line 15 def family return :arm if arm? return :ppc if ppc? return :dunno unless intel? # See https://software.intel.com/en-us/articles/intel-architecture-and-processor-identification-with-cpuid-model-and-family-numbers # and https://github.com/llvm/llvm-project/blob/main/llvm/lib/TargetParser/Host.cpp # and https://en.wikipedia.org/wiki/List_of_Intel_CPU_microarchitectures#Roadmap vendor_id = cpuinfo[/^vendor_id\s*: (.*)/, 1] cpu_family = cpuinfo[/^cpu family\s*: ([0-9]+)/, 1].to_i cpu_model = cpuinfo[/^model\s*: ([0-9]+)/, 1].to_i unknown = :"unknown_0x#{cpu_family.to_s(16)}_0x#{cpu_model.to_s(16)}" case vendor_id when "GenuineIntel" intel_family(cpu_family, cpu_model) when "AuthenticAMD" amd_family(cpu_family, cpu_model) end || unknown end |
.feature?(name) ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
188 189 190 |
# File 'hardware.rb', line 188 def feature?(name) features.include?(name) end |
.features ⇒ Array<Symbol>
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Compatibility with Mac method, which returns lowercase symbols instead of strings.
135 136 137 |
# File 'extend/os/linux/hardware/cpu.rb', line 135 def features @features ||= flags[1..].map(&:intern) end |
.flags ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Supported CPU instructions
128 129 130 131 |
# File 'extend/os/linux/hardware/cpu.rb', line 128 def flags @flags ||= cpuinfo[/^(?:flags|Features)\s*: (.*)/, 1]&.split @flags ||= [] end |
.in_rosetta2? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
200 201 202 |
# File 'hardware.rb', line 200 def in_rosetta2? false end |
.intel? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
135 136 137 |
# File 'hardware.rb', line 135 def intel? type == :intel end |
.intel_family(family, cpu_model) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
# File 'extend/os/mac/hardware/cpu.rb', line 141 def intel_family(_family = nil, _cpu_model = nil) case sysctl_int("hw.cpufamily") when 0x73d67300 # Yonah: Core Solo/Duo :core when 0x426f69ef # Merom: Core 2 Duo :core2 when 0x78ea4fbc # Penryn :penryn when 0x6b5a4cd2 # Nehalem :nehalem when 0x573b5eec # Westmere :westmere when 0x5490b78c # Sandy Bridge :sandybridge when 0x1f65e835 # Ivy Bridge :ivybridge when 0x10b282dc # Haswell :haswell when 0x582ed09c # Broadwell :broadwell when 0x37fc219f # Skylake :skylake when 0x0f817246 # Kaby Lake :kabylake when 0x38435547 # Ice Lake :icelake when 0x1cf8a03e # Comet Lake :cometlake else :dunno end end |
.is_32_bit? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
125 126 127 |
# File 'hardware.rb', line 125 def is_32_bit? bits == 32 end |
.is_64_bit? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
130 131 132 |
# File 'hardware.rb', line 130 def is_64_bit? bits == 64 end |
.little_endian? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
168 169 170 |
# File 'hardware.rb', line 168 def little_endian? !big_endian? end |
.optimization_flags ⇒ Hash{Symbol => String} Also known as: generic_optimization_flags
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
7 8 9 10 11 12 13 |
# File 'extend/os/linux/hardware/cpu.rb', line 7 def optimization_flags @optimization_flags ||= begin flags = generic_optimization_flags.dup flags[:native] = arch_flag(Homebrew::EnvConfig.arch) flags end end |
.physical_cpu_arm64? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This is more reliable than checking uname
. sysctl
returns
the right answer even when running in Rosetta 2.
98 99 100 |
# File 'extend/os/mac/hardware/cpu.rb', line 98 def physical_cpu_arm64? sysctl_bool("hw.optional.arm64") end |
.ppc32? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
145 146 147 |
# File 'hardware.rb', line 145 def ppc32? ppc? && is_32_bit? end |
.ppc64? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
155 156 157 |
# File 'hardware.rb', line 155 def ppc64? ppc? && is_64_bit? && big_endian? end |
.ppc64le? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
150 151 152 |
# File 'hardware.rb', line 150 def ppc64le? ppc? && is_64_bit? && little_endian? end |
.ppc? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
140 141 142 |
# File 'hardware.rb', line 140 def ppc? type == :ppc end |
.sse3? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
84 85 86 |
# File 'extend/os/mac/hardware/cpu.rb', line 84 def sse3? sysctl_bool("hw.optional.sse3") end |
.sse4? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
150 151 152 |
# File 'extend/os/linux/hardware/cpu.rb', line 150 def sse4? flags.include? "sse4_1" end |
.sse4_2? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
92 93 94 |
# File 'extend/os/mac/hardware/cpu.rb', line 92 def sse4_2? sysctl_bool("hw.optional.sse4_2") end |
.ssse3? ⇒ Boolean
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
88 89 90 |
# File 'extend/os/mac/hardware/cpu.rb', line 88 def ssse3? sysctl_bool("hw.optional.supplementalsse3") end |
.sysctl_bool(key) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
174 175 176 |
# File 'extend/os/mac/hardware/cpu.rb', line 174 def sysctl_bool(key) sysctl_int(key) == 1 end |
.sysctl_int(key) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
178 179 180 |
# File 'extend/os/mac/hardware/cpu.rb', line 178 def sysctl_int(key) sysctl_n(key).to_i & 0xffffffff end |
.sysctl_n(*keys) ⇒ Object
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
182 183 184 185 186 |
# File 'extend/os/mac/hardware/cpu.rb', line 182 def sysctl_n(*keys) (@properties ||= {}).fetch(keys) do @properties[keys] = Utils.popen_read("/usr/sbin/sysctl", "-n", *keys) end end |
.type ⇒ Symbol
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
88 89 90 91 92 93 94 95 |
# File 'hardware.rb', line 88 def type case RUBY_PLATFORM when /x86_64/, /i\d86/ then :intel when /arm/, /aarch64/ then :arm when /ppc|powerpc/ then :ppc else :dunno end end |
.virtualized? ⇒ false
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
102 103 104 |
# File 'extend/os/mac/hardware/cpu.rb', line 102 def virtualized? sysctl_bool("kern.hv_vmm_present") end |