|
|
@@ -0,0 +1,138 @@ |
|
|
|
#!/usr/bin/env python3 |
|
|
|
|
|
|
|
import re |
|
|
|
import os |
|
|
|
|
|
|
|
generic = { |
|
|
|
'7' : 'arm7', |
|
|
|
'8' : 'arm8', |
|
|
|
'9' : 'arm9tdmi', |
|
|
|
'a' : 'arm10e', |
|
|
|
'b' : 'mpcore' |
|
|
|
} |
|
|
|
|
|
|
|
specific = { |
|
|
|
'810' : 'arm810', |
|
|
|
'8xx' : 'arm8', |
|
|
|
'920' : 'arm920t', |
|
|
|
'922' : 'arm922t', |
|
|
|
'946' : 'arm946e-s', |
|
|
|
'926' : 'arm926ej-s', |
|
|
|
'966' : 'arm966e-s', |
|
|
|
'968' : 'arm968e-s', |
|
|
|
'940' : 'arm940e', |
|
|
|
'9xx' : 'arm9tdmi', |
|
|
|
'a20' : 'arm1020e', |
|
|
|
'a22' : 'arm1022e', |
|
|
|
'a26' : 'arm1026ej-s', |
|
|
|
'axx' : 'arm10e', |
|
|
|
'b36' : 'arm1136j-s', |
|
|
|
'b56' : 'arm1156t2-s', |
|
|
|
'b76' : 'arm1176jz-s', |
|
|
|
'bxx' : 'mpcore', |
|
|
|
'c05' : 'cortex-a5', |
|
|
|
'c07' : 'cortex-a7', |
|
|
|
'c08' : 'cortex-a8', |
|
|
|
'c09' : 'cortex-a9', |
|
|
|
'c0d' : 'cortex-a12', |
|
|
|
'c0f' : 'cortex-a15', |
|
|
|
'c0e' : 'cortex-a17', |
|
|
|
'd01' : 'cortex-a32', |
|
|
|
'd04' : 'cortex-a35', |
|
|
|
'd03' : 'cortex-a53', |
|
|
|
'd05' : 'cortex-a55', |
|
|
|
'd07' : 'cortex-a57', |
|
|
|
'd08' : 'cortex-a72', |
|
|
|
'd09' : 'cortex-a73', |
|
|
|
'd0a' : 'cortex-a75', |
|
|
|
'c14' : 'cortex-r4', |
|
|
|
'c15' : 'cortex-r5', |
|
|
|
'c17' : 'cortex-r7', |
|
|
|
'c18' : 'cortex-r8', |
|
|
|
'd21' : 'cortex-m33', |
|
|
|
'd20' : 'cortex-m23', |
|
|
|
'c20' : 'cortex-m7', |
|
|
|
'c24' : 'cortex-m4', |
|
|
|
'c23' : 'cortex-m3', |
|
|
|
'c21' : 'cortex-m1', |
|
|
|
'c20' : 'cortex-m0', |
|
|
|
'c60' : 'cortex-m0plus' |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
class CPUInfo(object): |
|
|
|
|
|
|
|
ARM='arm' |
|
|
|
Intel='x86' |
|
|
|
Generic='generic' |
|
|
|
|
|
|
|
|
|
|
|
def __init__(self): |
|
|
|
self.architecture=os.uname().machine |
|
|
|
if re.match('arm',self.architecture): self.chip=CPUInfo.ARM |
|
|
|
elif re.match('x86',self.architecture): self.chip=CPUInfo.Intel |
|
|
|
else : self.chip=CPUInfo.Generic |
|
|
|
|
|
|
|
with open('/proc/cpuinfo','r') as proc: |
|
|
|
lines=[l for l in proc] |
|
|
|
|
|
|
|
self.lines=[re.sub('\s+',' ',l) for l in lines] |
|
|
|
f=[re.match('(?:Features|flags) . ([\w ]+)$',l) for l in self.lines] |
|
|
|
f=[m.groups(0)[0] for m in f if m is not None] |
|
|
|
self.features=set() |
|
|
|
for line in f : self.features.update(line.strip().split(' ')) |
|
|
|
|
|
|
|
if self.chip==CPUInfo.ARM: |
|
|
|
c=[re.match('CPU part\s:\s+0x([0-9a-f]+)',l) for l in self.lines] |
|
|
|
self.cpu={m.groups(0)[0] for m in c if m is not None}.pop() |
|
|
|
self.model=specific.get(self.cpu,generic.get(self.cpu,'generic')) |
|
|
|
else: |
|
|
|
self.cpu=None |
|
|
|
self.model='generic' |
|
|
|
|
|
|
|
|
|
|
|
def __getitem__(self,key): |
|
|
|
return key in self.features |
|
|
|
|
|
|
|
@property |
|
|
|
def fpuFlags(self): |
|
|
|
if self.chip==CPUInfo.Intel: |
|
|
|
if self['sse'] or self['sse2']: |
|
|
|
return ['-msse','-mfpmath=sse'] |
|
|
|
return [] |
|
|
|
elif self.chip==CPUInfo.ARM: |
|
|
|
f=[] |
|
|
|
if self['neon']: f=['-mfpu=neon-fp-armv8','-mneon-for-64bits'] |
|
|
|
elif self['vfpv4']: f=['-mfpu=neon-vfpv4'] |
|
|
|
elif self['vfpv3']: f=['-mfpu=neon-vpfv3'] |
|
|
|
elif self['vfpv3d16']: f=['-mfpu=vfpv3-d16'] |
|
|
|
elif self['vfp'] or self['vfpv2'] or self['vfpd32']: f=['-mfpu=vfp'] |
|
|
|
f.append('-mfloat-abi=hard') |
|
|
|
return f |
|
|
|
else: |
|
|
|
return [] |
|
|
|
|
|
|
|
@property |
|
|
|
def modelFlags(self): |
|
|
|
if self.chip==CPUInfo.ARM: |
|
|
|
if self.model=='generic': return ['-mtune=generic'] |
|
|
|
else: return ['-mcpu={}'.format(self.model),'-mtune={}'.format(self.model)] |
|
|
|
else: |
|
|
|
return ['-mtune=generic'] |
|
|
|
|
|
|
|
@property |
|
|
|
def flags(self): |
|
|
|
f=self.modelFlags |
|
|
|
f.extend(self.fpuFlags) |
|
|
|
return f |
|
|
|
|
|
|
|
try: |
|
|
|
c=CPUInfo() |
|
|
|
print(' '.join(c.flags)) |
|
|
|
except Exception as e: |
|
|
|
print('Error : {}'.format(e)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|