Class: Hardware::CPU Private

Inherits:
Object show all
Defined in:
hardware.rb,
extend/os/mac/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

Returns:

  • (Boolean)


70
71
72
# File 'extend/os/mac/hardware/cpu.rb', line 70

def aes?
  sysctl_bool("hw.optional.aes")
end

.altivec?Boolean

Returns:

  • (Boolean)


74
75
76
# File 'extend/os/mac/hardware/cpu.rb', line 74

def altivec?
  sysctl_bool("hw.optional.altivec")
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:



75
76
77
78
79
80
81
82
83
84
# File 'hardware.rb', line 75

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:



47
48
49
50
51
52
53
54
55
56
57
# File 'hardware.rb', line 47

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:



60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'hardware.rb', line 60

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:



192
193
194
195
196
# File 'hardware.rb', line 192

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)


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

def arm?
  type == :arm
end

.arm_familyObject



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
140
141
# File 'extend/os/mac/hardware/cpu.rb', line 108

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

Returns:

  • (Boolean)


82
83
84
# File 'extend/os/mac/hardware/cpu.rb', line 82

def avx2?
  sysctl_bool("hw.optional.avx2_0")
end

.avx?Boolean

Returns:

  • (Boolean)


78
79
80
# File 'extend/os/mac/hardware/cpu.rb', line 78

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)


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

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)


111
112
113
114
115
116
# File 'hardware.rb', line 111

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)


102
103
104
105
106
107
108
# File 'hardware.rb', line 102

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



66
67
68
# File 'extend/os/mac/hardware/cpu.rb', line 66

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:



97
98
99
# File 'hardware.rb', line 97

def family
  :dunno
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)


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

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.

Returns:



182
183
184
# File 'hardware.rb', line 182

def features
  []
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)


199
200
201
# File 'hardware.rb', line 199

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)


134
135
136
# File 'hardware.rb', line 134

def intel?
  type == :intel
end

.intel_family(_family = nil, _cpu_model = nil) ⇒ Object



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
173
174
# File 'extend/os/mac/hardware/cpu.rb', line 143

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)


124
125
126
# File 'hardware.rb', line 124

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)


129
130
131
# File 'hardware.rb', line 129

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)


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

def little_endian?
  !big_endian?
end

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

Returns:



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'hardware.rb', line 28

def optimization_flags
  @optimization_flags ||= T.let({
    dunno:              "",
    native:             arch_flag("native"),
    ivybridge:          "-march=ivybridge",
    sandybridge:        "-march=sandybridge",
    westmere:           "-march=westmere",
    nehalem:            "-march=nehalem",
    core2:              "-march=core2",
    core:               "-march=prescott",
    arm_vortex_tempest: "", # TODO: -mcpu=apple-m1 when we've patched all our GCCs to support it
    armv6:              "-march=armv6",
    armv8:              "-march=armv8-a",
    ppc64:              "-mcpu=powerpc64",
    ppc64le:            "-mcpu=powerpc64le",
  }.freeze, T.nilable(T::Hash[Symbol, String]))
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)


100
101
102
# File 'extend/os/mac/hardware/cpu.rb', line 100

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)


144
145
146
# File 'hardware.rb', line 144

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)


154
155
156
# File 'hardware.rb', line 154

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)


149
150
151
# File 'hardware.rb', line 149

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)


139
140
141
# File 'hardware.rb', line 139

def ppc?
  type == :ppc
end

.sse3?Boolean

Returns:

  • (Boolean)


86
87
88
# File 'extend/os/mac/hardware/cpu.rb', line 86

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)


119
120
121
# File 'hardware.rb', line 119

def sse4?
  RUBY_PLATFORM.to_s.include?("x86_64")
end

.sse4_2?Boolean

Returns:

  • (Boolean)


94
95
96
# File 'extend/os/mac/hardware/cpu.rb', line 94

def sse4_2?
  sysctl_bool("hw.optional.sse4_2")
end

.ssse3?Boolean

Returns:

  • (Boolean)


90
91
92
# File 'extend/os/mac/hardware/cpu.rb', line 90

def ssse3?
  sysctl_bool("hw.optional.supplementalsse3")
end

.sysctl_bool(key) ⇒ Object



176
177
178
# File 'extend/os/mac/hardware/cpu.rb', line 176

def sysctl_bool(key)
  sysctl_int(key) == 1
end

.sysctl_int(key) ⇒ Object



180
181
182
# File 'extend/os/mac/hardware/cpu.rb', line 180

def sysctl_int(key)
  sysctl_n(key).to_i & 0xffffffff
end

.sysctl_n(*keys) ⇒ Object



184
185
186
187
188
# File 'extend/os/mac/hardware/cpu.rb', line 184

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:



87
88
89
90
91
92
93
94
# File 'hardware.rb', line 87

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)


104
105
106
# File 'extend/os/mac/hardware/cpu.rb', line 104

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