Skip to content

Instantly share code, notes, and snippets.

@randomvariable
Created November 6, 2016 23:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save randomvariable/40d17418bafcf5b7966a02a07e2747a5 to your computer and use it in GitHub Desktop.
Save randomvariable/40d17418bafcf5b7966a02a07e2747a5 to your computer and use it in GitHub Desktop.
Getting supported CPU instructions on Windows
require 'ruby-wmi'
ECX_FLAGS = [
'SSE3',
'PCLMULQDQ',
'DTES64',
'MONITOR',
'DS-CPL',
'VMX',
'SMX',
'EIST',
'TM2',
'SSSE3',
'CNXT-ID',
'SDBG',
'FMA',
'CMPXCHG16B',
'xTPR Update Control',
'PDCM',
nil,
'PCID',
'DCA',
'SSE4.1',
'SSE4.2',
'x2APIC',
'MOVBE',
'POPCNT',
'TSC-Deadline',
'AESNI',
'XSAVE',
'OSXSAVE',
'AVX',
'F16C',
'RDRAND',
nil
].freeze
EDX_FLAGS = [
'FPU',
'VME',
'DE',
'PSE',
'TSC',
'MSR',
'PAE',
'MCE',
'CX8',
'APIC',
nil,
'SEP',
'MTRR',
'PGE',
'MCA',
'CMOV',
'PAT',
'PSE-36',
'PSN',
'CLFSH',
nil,
'DS',
'ACPI',
'MMX',
'FXSR',
'SSE',
'SSE2',
'SS',
'HTT',
'TM',
nil,
'PBE'
].freeze
def parse_struct_for_cpu_flags(type, _formatted_length, _handle, data)
return unless type == 4
ecx = data[8..11]
edx = data[12..15]
ecx_bit_array = edx.map { |d| d.to_s(2) }.join
edx_bit_array = edx.map { |d| d.to_s(2) }.join
i = 0
flags = []
until i == 32
flags = flags << EDX_FLAGS[i] if edx_bit_array[i].to_i == 1 && EDX_FLAGS[i]
flags = flags << ECX_FLAGS[i] if ecx_bit_array[i].to_i == 1 && ECX_FLAGS[i]
i += 1
end
flags
end
def parse_smbios_for_cpu_flags(bios)
i = 0
until i >= bios.length
type = bios[i]
formatted_length = bios[i + 1]
handle = bios[i + 2] + bios[i + 3]
start = i
i += formatted_length
check_1 = nil
check_2 = nil
until (i >= bios.length) || (check_1 == 0 && check_2 == 0)
check_1 = bios[i]
check_2 = bios[i + 1]
i += 1
end
parsed = parse_struct_for_cpu_flags type, formatted_length, handle, bios[start + 1..i - 2]
return parsed if parsed
i += 1
end
end
def smbios
@smbios ||= WMI::MSSmBios_RawSMBiosTables.find(:all, namespace: 'ROOT\WMI')[0].SMBiosData
end
puts parse_smbios_for_cpu_flags(smbios)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment