Class: Hardware::CPU Private

Inherits:
Object show all
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

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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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

.archSymbol

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.

Returns:



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_bitSymbol

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.

Returns:



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_bitSymbol

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.

Returns:



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.

Parameters:

Returns:



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.

Returns:

  • (Boolean)


163
164
165
# File 'hardware.rb', line 163

def arm?
  type == :arm
end

.arm_familyObject

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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


173
174
175
# File 'hardware.rb', line 173

def big_endian?
  [1].pack("I") == [1].pack("N")
end

.bitsInteger?

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.

Returns:

  • (Integer, nil)


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

.coresInteger

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.

Returns:

  • (Integer)


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

.extmodelObject

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

.familySymbol

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.

Returns:



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.

Parameters:

Returns:

  • (Boolean)


188
189
190
# File 'hardware.rb', line 188

def feature?(name)
  features.include?(name)
end

.featuresArray<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.

Returns:



135
136
137
# File 'extend/os/linux/hardware/cpu.rb', line 135

def features
  @features ||= flags[1..].map(&:intern)
end

.flagsObject

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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


168
169
170
# File 'hardware.rb', line 168

def little_endian?
  !big_endian?
end

.optimization_flagsHash{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.

Returns:



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.

Note:

This is more reliable than checking uname. sysctl returns the right answer even when running in Rosetta 2.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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

.typeSymbol

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.

Returns:



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.

Returns:

  • (false)


102
103
104
# File 'extend/os/mac/hardware/cpu.rb', line 102

def virtualized?
  sysctl_bool("kern.hv_vmm_present")
end