o
    jI                    @   s  d Z ddd e D ZddlZddlZddlZddlZddlZdZda	G dd de
ZG d	d
 d
e
Zdd ZdiddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Z d3d4 Z!d5d6 Z"i fd7d8Z#G d9d: d:e
Z$G d;d< d<e
Z%d=d> Z&d?d@ Z'dAdB Z(dCdD Z)dEdF Z*dGdH Z+dIdJ Z,dKdL Z-dMdN Z.dOdP Z/dQdR Z0dSdT Z1dUdV Z2dWdX Z3dYdZ Z4d[d\ Z5d]d^ Z6d_d` Z7dadb Z8dcdd Z9dedf Z:e;dgkre:  dS edhdha	e  dS )j)	       r   .c                 C      g | ]}t |qS  )str.0nr   r   P/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/cpuinfo/cpuinfo.py
<listcomp>       r   r   NTc                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )Tracec                 C   sp   || _ | j sd S ddlm} ddlm} |r| | _n| d}td|d| _| | _	| | _
d | _d S )Nr   )datetimeStringIOz%Y-%m-%d_%H-%M-%S-%fzcpuinfo_trace_{0}.tracew)
_is_activer   ior   _outputnowstrftimeopenformat_stdout_stderr_err)selfZ	is_activeZis_stored_in_stringr   r   dater   r   r
   __init__+   s   

zTrace.__init__c                 C   sT   | j sd S ddlm} | d }|d }|d }| jd||| | j  d S )Nr   stack      z{0} ({1} {2})
r   inspectr    r   writer   flushr   msgr    framefileliner   r   r
   header=      

zTrace.headerc                 C   sR   | j sd S ddlm} | d }|d }|d }| jd|| | j  d S )Nr   r   r!   r"   zSuccess ... ({0} {1})

r#   )r   r    r)   r*   r+   r   r   r
   successG   s   

zTrace.successc                 C   s   | j sd S ddlm} | d }|d }|d }t|trCddd |dD d }| j| | jd		|| | j
  d S t|trudd
lm} | }| jd	|| | jddd |dD d  | j
  d S d S )Nr   r   r!   r"    c                 S   s   g | ]}d | qS )	r   )r   r+   r   r   r
   r   [   r   zTrace.fail.<locals>.<listcomp>
zFailed ... ({0} {1})


format_excz	Failed ... ({0} {1})
c                 S      g | ]}d  |qS 		{0}
r   r   r   r   r
   r   d       )r   r$   r    
isinstancer   joinsplitr   r%   r   r&   	Exception	tracebackr3   )r   r(   r    r)   r*   r+   r3   
err_stringr   r   r
   failR   s"   



&z
Trace.failc                 C   sT   | j sd S ddlm} | d }|d }|d }| jd||| | j  d S )Nr   r      r!   r"   z	{0} ({1} {2})
r#   r'   r   r   r
   command_headerg   r-   zTrace.command_headerc                 C   sP   | j sd S | jd| | jddd |dD d  | j  d S )Nr6   r/   c                 S   r4   )z			{0}
r7   r   r   r   r
   r   u   r8   z(Trace.command_output.<locals>.<listcomp>r1   )r   r   r%   r   r:   r;   r&   )r   r(   outputr   r   r
   command_outputq   s   
&zTrace.command_outputc              	      s  | j sd S ddlm} | d }|d }|d }| jd||  fdd|D }|rC|D ]}	| jd|	 |	 |	  q0n| jd	 | jd
||  fdd|D }
|
rq|
D ]}	| jd|	|	  qan| jd	 | jd | j  d S )Nr   r   r"   r!   z	Changed keys ({0} {1})
c                    s0   g | ]}| v r|v r | | kr|qS r   r   r   keyinfonew_infor   r
   r      s   0 zTrace.keys.<locals>.<listcomp>z		{0}: {1} to {2}
z		None
z	New keys ({0} {1})
c                    s    g | ]}|v r| vr|qS r   r   rD   rF   r   r
   r           z		{0}: {1}
r1   r#   )r   keysrG   rH   r    r)   r*   r+   Zchanged_keysrE   Znew_keysr   rF   r
   rJ   x   s*   

 z
Trace.keysc                 C   s(   | j sd S | j|d  | j  d S )Nr1   )r   r   r%   r&   )r   r(   r   r   r
   r%      s   
zTrace.writec                 C   s&   | j  | j | j || j|dS )N)rB   stdoutstderrrG   erris_fail)r   getvaluer   r   r   )r   rG   rN   r   r   r
   to_dict   s   zTrace.to_dictN)__name__
__module____qualname__r   r,   r.   r?   rA   rC   rJ   r%   rP   r   r   r   r
   r   *   s    

r   c                   @   s  e Zd Ze d Ze Ze 	 dkZ
e Ze d ZdZedd Zedd Zed	d
 Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Z ed%d& Z!ed'd( Z"ed)d* Z#ed+d, Z$ed-d. Z%ed/d0 Z&ed1d2 Z'ed3d4 Z(ed5d6 Z)ed7d8 Z*ed9d: Z+ed;d< Z,ed=d> Z-d?S )@
DataSourcer   windows   Tc                   C   s   t jdS )N/proc/cpuinfo)ospathexistsr   r   r   r
   has_proc_cpuinfo      zDataSource.has_proc_cpuinfoc                   C      t tddkS )Ndmesgr   len_program_pathsr   r   r   r
   	has_dmesg      zDataSource.has_dmesgc                  C   s4   t   dd  } d| v otjdS )N"'linux/var/run/dmesg.boot)platformsystemstriplowerrX   rY   rZ   )unamer   r   r
   has_var_run_dmesg_boot   s    z!DataSource.has_var_run_dmesg_bootc                   C   r]   )Ncpufreq-infor   r_   r   r   r   r
   has_cpufreq_info   rc   zDataSource.has_cpufreq_infoc                   C   r]   )Nsestatusr   r_   r   r   r   r
   has_sestatus   rc   zDataSource.has_sestatusc                   C   r]   )Nsysctlr   r_   r   r   r   r
   
has_sysctl   rc   zDataSource.has_sysctlc                   C   r]   )Nisainfor   r_   r   r   r   r
   has_isainfo   rc   zDataSource.has_isainfoc                   C   r]   )Nkstatr   r_   r   r   r   r
   	has_kstat   rc   zDataSource.has_kstatc                  C   sD   t   dd  } d| v pd| v }|o!ttddkS )Nrd   re   ZbeosZhaikusysinfor   )rh   ri   rj   rk   r`   ra   )rl   Zis_beosr   r   r
   has_sysinfo   s    zDataSource.has_sysinfoc                   C   r]   )Nlscpur   r_   r   r   r   r
   	has_lscpu   rc   zDataSource.has_lscpuc                   C   r]   )Nlspropr   r_   r   r   r   r
   has_ibm_pa_features   rc   zDataSource.has_ibm_pa_featuresc                  C   s$   t g d\} }| dkot|dkS )N)wmicrX   getVersionr   )_run_and_get_stdoutr`   )
returncoderB   r   r   r
   has_wmic   s   zDataSource.has_wmicc                   C      t ddgS )NcatrW   r   r   r   r   r
   cat_proc_cpuinfo   r\   zDataSource.cat_proc_cpuinfoc                   C   
   t dgS )Nrn   r   r   r   r   r
   cpufreq_info      
zDataSource.cpufreq_infoc                   C   r   )Nrp   z-br   r   r   r   r
   
sestatus_b   r\   zDataSource.sestatus_bc                   C   r   )Nr^   z-ar   r   r   r   r
   dmesg_a   r\   zDataSource.dmesg_ac                   C   r   )Nr   rg   r   r   r   r   r
   cat_var_run_dmesg_boot   r\   z!DataSource.cat_var_run_dmesg_bootc                   C      t g dS )N)rr   zmachdep.cpuhw.cpufrequencyr   r   r   r   r
   "sysctl_machdep_cpu_hw_cpufrequency   r\   z-DataSource.sysctl_machdep_cpu_hw_cpufrequencyc                   C   r   )Nrt   z-vbr   r   r   r   r
   
isainfo_vb   r\   zDataSource.isainfo_vbc                   C   r   )N)rv   z-mZcpu_infor   r   r   r   r
   kstat_m_cpu_info   r\   zDataSource.kstat_m_cpu_infoc                   C   r   )Nrx   z-cpur   r   r   r   r
   sysinfo_cpu  r\   zDataSource.sysinfo_cpuc                   C   r   )Nrz   r   r   r   r   r
   rz     r   zDataSource.lscpuc                  C   s*   dd l } |  d}|rtd|d gS d S )Nr   z(/proc/device-tree/cpus/*/ibm,pa-featuresr|   )globr   )r   Zibm_featuresr   r   r
   ibm_pa_features	  s
   
zDataSource.ibm_pa_featuresc                   C   r   )N)r~   cpur   zOName,CurrentClockSpeed,L2CacheSize,L3CacheSize,Description,Caption,Manufacturerz/format:listr   r   r   r   r
   wmic_cpu  r\   zDataSource.wmic_cpuc                  C   s   t dd} |  S )N.Hardware\Description\System\CentralProcessor\0ZProcessorNameString)_read_windows_registry_keyrj   )processor_brandr   r   r
   winreg_processor_brand  s   
z!DataSource.winreg_processor_brandc                  C      t dd} | S )Nr   ZVendorIdentifierr   )vendor_id_rawr   r   r
   winreg_vendor_id_raw     
zDataSource.winreg_vendor_id_rawc                  C   r   )Nz<SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentPROCESSOR_ARCHITECTUREr   )arch_string_rawr   r   r
   winreg_arch_string_raw  r   z!DataSource.winreg_arch_string_rawc                  C   s   t dd} t| } | S )Nr   z~Mhz)r   _to_decimal_string)	hz_actualr   r   r
   winreg_hz_actual$  s   
zDataSource.winreg_hz_actualc                  C   r   )Nr   Z
FeatureSetr   Zfeature_bitsr   r   r
   winreg_feature_bits*  r   zDataSource.winreg_feature_bitsN).rQ   rR   rS   rh   architecturebitsmultiprocessing	cpu_countri   rk   
is_windowsmachiner   rl   uname_string_raw	can_cpuidstaticmethodr[   rb   rm   ro   rq   rs   ru   rw   ry   r{   r}   r   r   r   r   r   r   r   r   r   r   rz   r   r   r   r   r   r   r   r   r   r   r
   rT      s    



























rT   c                 C   s   g }t d tjddtj}tjd tjD ]*}tj|| }t|tj	r.|
| |D ]}|| }t|tj	rB|
| q0q|S )NPATHEXTr/   PATH)filterrX   environr   r;   pathseprY   r:   accessX_OKappend)Zprogram_namepathsextspeZpextr   r   r
   ra   0  s   

ra   c                 C   s   ddl m}m} tdd|  d  |s|| |||d}n|| |||d}|||j||d}|j  | \}}|j	dd	}|j	dd	}t
d
t|j t
d| |j|fS )Nr   PopenPIPEzRunning command " z" ...rK   rL   stdin)r   rK   rL   UTF-8encodingzreturn code:zstdout:)
subprocessr   r   g_tracerA   r:   rK   closecommunicatedecoderC   r   r   )commandZpipe_commandr   r   p1Zp2Zstdout_outputZstderr_outputr   r   r
   r   =  s   

r   c                 C   s   t d| | zdd l}W n+ ty: } zzdd l}W n ty/ } zW Y d }~nd }~ww W Y d }~nd }~ww ||j| }|||d }|	| t 
dt| |S )Nz*Reading Registry key "{0}" field "{1}" ...r   zvalue:)r   rA   r   _winregImportErrorwinregOpenKeyHKEY_LOCAL_MACHINEQueryValueExZCloseKeyrC   r   )Zkey_name
field_namer   rM   rE   valuer   r   r
   r   W  s"   
r   c                  C   s"   t tj\} }| dvrtdd S )N)
X86_32X86_64ARM_7ARM_8PPC_64S390XMIPS_32MIPS_64RISCV_32RISCV_64zNpy-cpuinfo currently only works on X86 and some ARM/PPC/S390X/MIPS/RISCV CPUs.)_parse_archrT   r   r<   )archr   r   r   r
   _check_archi  s   r   c                 C   s6   dd l }dd l}| }||}||}|d}|S )Nr   utf8)picklebase64dumps	b64encoder   )thingr   r   abcdr   r   r
   _obj_to_b64q  s   


r   c                 C   sB   dd l }dd l}z|| }||}|W S  ty    i  Y S w Nr   )r   r   	b64decodeloadsr<   )r   r   r   r   r   r   r   r
   _b64_to_obj{  s   

r   c                 C   s8   t | trdd | D S t | trdd |  D S | S )Nc                 S   r   r   _utf_to_str)r   elementr   r   r
   r     r   z_utf_to_str.<locals>.<listcomp>c                 S   s   i | ]\}}t |t |qS r   r   )r   rE   r   r   r   r
   
<dictcomp>  s    z_utf_to_str.<locals>.<dictcomp>)r9   listdictitems)inputr   r   r
   r     s   

r   c                 C   s   g d}t || | |D ]8}||d r"| |d s"|| | |< q|dkrE|drE|d D ]}|| d vr>| d | q/| d   qd S )N)r   hardware_raw	brand_rawhz_advertised_friendlyhz_actual_friendlyhz_advertisedr   r   r   countr   r   l2_cache_sizel2_cache_line_sizel2_cache_associativitysteppingmodelfamilyprocessor_typeflagsl3_cache_sizel1_data_cache_sizel1_instruction_cache_sizer  )r   rJ   r   r   sort)rG   rH   rJ   rE   fr   r   r
   _copy_new_fields  s   
r  c                 C   s   |  D ]>}|D ]9}| }d|v rA|dd\}}|  }| }||krAt|dkrA| r;| s:|    S q|    S qqd S )N:r!   r   )
splitlinesrk   r;   rj   r`   isdigit)cant_be_number
raw_stringfield_namesr+   r   leftrightr   r   r
   _get_field_actual  s    r  c                 G   sH   t | ||}|r|rz||}W n ty   |}Y nw |d u r"|}|S N)r  r<   )r  r  Z
convert_todefault_valuer  retvalr   r   r
   
_get_field  s   r  c                 C   s   zAd | } | dd} ddd | D  } | dkrd} d| vr'd | } | d} | dr6d	 | } t| } d | } | W S  tyK   Y d
S w )N{0},r   r/   c                 s   $    | ]}|  s|d kr|V  qdS r   Nr  r   r   r   r
   	<genexpr>     " z%_to_decimal_string.<locals>.<genexpr>0z{0}.0z{0}00.0)r   replacer:   rj   rstripendswithfloatr<   )ticksr   r   r
   r     s"   





r   c                 C   s   zJt | } d| } | d}|d}|dd}||| d d}|| }d|d | ||d  }|d\}}t|t|}}||fW S  tyT   Y dS w )Nr  r"  r   r/   r!   {0}.{1}r   r   )	r'  r   lstripindexr$  ljustr;   intr<   )r(  scalehzZ	old_indexZ	new_indexr  r  r   r   r
   _hz_short_to_full  s   



r1  c                 C   s   zA|    } d\}}| drd}n| drd}n| dr"d}dd	d
 | D   }d|vr6|d7 }t||\}}||fW S  tyK   Y dS w )NNNghzr   mhz   r0  r   r/   c                 s   r  r  r  r   r   r   r
   r     r!  z'_hz_friendly_to_full.<locals>.<genexpr>r   z.0r*  )rj   rk   r&  r:   r1  r<   )Z	hz_stringr0  r/  r   r   r
   _hz_friendly_to_full  s"   



r6  c                 C   s   zZt | |\}}d||}|d}|dd}d}d}|dkr&d}d}n|dkr/d	}d}n|d
kr7d}d
}d|d | d  || d d  }dt||}|d}|W S  tyd   Y dS w )Nr)  r   r/   Hzr   r   GHzr5  MHzr@   ZKHzr!   z{0:.4f} {1}r"  z	0.0000 Hz)r1  r   r,  r$  r'  r%  r<   )r(  r/  r  r  resultZ	dot_indexsymbolr   r   r
   _hz_short_to_friendly  s.   
(
r<  c                 C   sf   dd l }| s| S d| } ddddd}| D ]\}}||| r0d| d d	  |  S q| S )
Nr   r  BZKBMBGB)z	^[0-9]+B$z	^[0-9]+K$z	^[0-9]+M$z	^[0-9]+G$z{0} {1})rer   r   matchrj   )r   rA  formatspatternZfriendly_sizer   r   r
   _to_friendly_bytes/  s   
rE  c                 C   s   |   }ddiddiddiddiddid	did
diddiddiddig
}z-|D ]'}t| d }t| d }||rNt||d  |   W S q'W | S  tyd } zW Y d }~| S d }~ww )NZgibi   @Zmibi   Zkib   gbmbkbgmkr   r!   r   )	rk   r   rJ   valuesr&  r.  r;   rj   r<   )Zfriendly_bytesr   rC  entryrD  Z
multiplierrM   r   r   r
   _friendly_bytes_to_intC  s4   
 	
rO  c                 C   s   d|   vrdS |   }d}|drd}n|drd}d|v r)|dd	 }n|d d	d	 }|dd }t|}||fS )
Nr0  r#  r   r   r4  r5  r3  r   @r!   )rk   r&  r;   rsplitr%  rj   r   )
cpu_stringr0  r/  r   r   r
   _parse_cpu_brand_stringa  s   

rT  c                    s  dd l }dd |d D }dd |d D }dd t||D } fd	d| D }d
\}}}}|D ]S}	|	dD ]K}
dd |
dD }
t|
dkr|
d |
d }}|dkrc|d}q>|dkrpt|dd}q>|dkr}t|dd}q>|dv rt|dd}q>q7  }d}|rd}|D ]}	d	|	}|
|r|d t|   }d}q|st|\}}|dkr|D ]$}	|	}dD ]}||v rd|d ||t|   }t|\}} nqq|||||||fS )Nr   c                 S      g | ]}|  qS r   startr   rK  r   r   r
   r   {  r   z._parse_cpu_brand_string_dx.<locals>.<listcomp>z\(c                 S   rU  r   rV  rX  r   r   r
   r   |  r   z\)c                 S   s   i | ]\}}||qS r   r   r   rL  vr   r   r
   r   }  r8   z._parse_cpu_brand_string_dx.<locals>.<dictcomp>c                    s    g | ]\}} |d  | qS )r!   r   )r   rW  endrS  r   r
   r   ~  rI   )NNNNr  c                 S   rU  r   )rj   r   r   r   r
   r     r   r  r!   originrd   r  0x   r  Zfamr  TFz({0})r#  )r8  r9  r7  zCPU @ )rA  finditerzipr   r;   r`   rj   r.  r+  r   r&  rT  find)rS  rA  ZstartsZendsZinsides	vendor_idr  r  r  Zinsidepairnamer   brandZ
is_workingfullhz_brandr/  r0  rN  r   r\  r
   _parse_cpu_brand_string_dxw  sX   

	rj  c              
   C   s  zh|  ddd  |  ddd   |  ddd   |  ddd   |  ddd   |  ddd   }dd	 |D }d
d	 |D }d }d}|D ]}tdd	 |D }||kr_|}|}qL|sei W S |\}}}	}
}}}d| v r| | dd   dd }|   }dd	 |D }dd	 |D }|D ]B}t| d }t| d }|dkr|d}
q|dkrt|dd}q|dkrt|dd}q|dv rt|dd}qg }dD ]}|| v r|	|  |d  dd  qg }|D ]}| dd  dd 
 }| dD ]}|	| qq|  t|	\}}|dkr+d}t|}|
|	||||d}|rJ|dkrJt|||d< t|||d < |r`|dkr`t|||d!< t|||d"< d#d$ | D W S  ty } zt| W Y d }~i S d }~ww )%Nz CPU0:r!   z CPU1:z CPU:z
CPU0:z
CPU1:z
CPU:c                 S   s   g | ]}| d d  qS )r1   r   )r;   rj   r   lr   r   r
   r     s    z'_parse_dmesg_output.<locals>.<listcomp>c                 S   r   r   )rj  rk  r   r   r
   r     r   r   c                 S   s   g | ]}|d uqS r  r   r   r   r   r
   r     r   z	  Origin=r1   c                 S   s   g | ]	}|  d qS =)rj   r;   r   r   r   r
   r         c                 S   s(   g | ]}|d     |d   iqS )r   r!   )rj   rk   r   r   r   r
   r     s   ( r]  rd   r  r^  r_  r  r`  )z  Features=z  Features2=z  AMD Features=z  AMD Features2=<>r  r#  r5  )r   r   r  r  r  r  r   r   r   r   c                 S      i | ]	\}}|r||qS r   r   rY  r   r   r
   r     ro  z'_parse_dmesg_output.<locals>.<dictcomp>)r;   sumrc  rj   r   rJ   rM  r.  r+  r   rk   r  rT  r   r<  r1  r   r<   r   r?   )rB   linesZcpu_stringsZbest_stringZhighest_countrS  r   r   r/  r   rd  r  r  r  fieldsfieldrf  r   Z
flag_linescategoryr  r+   flagr   rG   rM   r   r   r
   _parse_dmesg_output  s   

ry  c                 C   s  dd l }d\}}|  } |d| rd}d}||fS |d| r(d}d}||fS |d	| r6d
}d}||fS |d| rDd}d}||fS |d| rRd
}d}||fS |d| r`d}d}||fS |d| rnd}d}||fS |d| r|d}d}||fS |d| rd}d}||fS |d| rd}d}||fS | dkrd}d}||fS | dkrd}d}||fS |d| rd}d}||fS |d| rd}d}||fS ) Nr   r2  z4^i\d86$|^x86$|^x86_32$|^i86pc$|^ia32$|^ia-32$|^bepc$r       z9^x64$|^x86_64$|^x86_64t$|^i686-64$|^amd64$|^ia64$|^ia-64$r   @   z^armv8-a|aarch64|arm64$r   z/^armv7$|^armv7[a-z]$|^armv7-[a-z]$|^armv6[a-z]$r   z"^armv8$|^armv8[a-z]$|^armv8-[a-z]$z ^ppc32$|^prep$|^pmac$|^powermac$ZPPC_32z^powerpc$|^ppc64$|^ppc64le$r   z^sparc32$|^sparc$ZSPARC_32z^sparc64$|^sun4u$|^sun4v$ZSPARC_64z^s390x$r   mipsr   Zmips64r   z^riscv$|^riscv32$|^riscv32be$r   z^riscv64$|^riscv64be$r   )rA  rk   rB  )r   rA  r   r   r   r   r
   r   
  sv   .+'$!	r   c                 C   s   d|> }| |@ dk}|S )Nr!   r   r   )regbitmaskis_setr   r   r
   _is_bit_setC     r  c                 C   s   t  s| d dS t  \}}|dkr| d dS | D ]}|  }|dr8|dr5 dS  dS q d}d}| D ]!}|  }|drV|d	rVd}qA|d
rb|d	rbd}qA| 	d| | 	d| | pt| S )NzFailed to find sestatus.Fr   z$Failed to run sestatus. Skipping ...zcurrent mode:Z	enforcingTZallow_execheaponZallow_execmemzcan_selinux_exec_heap:zcan_selinux_exec_memory:)
rT   rq   r?   r   r  rj   rk   
startswithr&  rC   )tracer   rB   r+   Zcan_selinux_exec_heapZcan_selinux_exec_memoryr   r   r
   _is_selinux_enforcingI  s4   



r  c                 C   sr   i }| D ]2}| | }||v r|| |kr|||< q|sq|dkr!q|dkr&qt |tkr2|dr2q|||< q|S )Nr*  r@  r#  )typer   r  )rG   Zacceptable_valuesZfiltered_inforE   r   r   r   r
   #_filter_dict_keys_with_empty_valuesm  s"   
r  c                   @   s4   e Zd Zddg fddZdd Zdd Zd	d
 ZdS )ASMNr   c                 C   s4   || _ || _|| _d | _d | _d | _d | _d| _d S r   )restypeargtypesmachine_code
prochandlemmfuncaddresssize)r   r  r  r  r   r   r
   r     s   
zASM.__init__c                 C   s  t d| j}tt|| _tjrt|}|dk rd}t	d}t	d}tj
jj}tj|_|d t|||| _| jsAtdttjtjtjtjtj}|| j||dk r]tdt	d}t	d}tj
jj}	|	t| jt||t|}
|
std| jstj
jj}tj|_t| | _tj
j| jt| jt|}
|
std	n=dd
lm}m}m}m}m}m} t d| j}t|| _|d| j||B ||B |B d| _| j| t tj!"| j| _tj| jg| j#R  }|| j| _$d S )N    i      zFailed to VirtualAllocr   zFailed to memmover_  zFailed VirtualProtectzFailed FlushInstructionCache)mmapMAP_PRIVATEMAP_ANONYMOUS
PROT_WRITE	PROT_READ	PROT_EXECr@  )r  Zprot)%bytesr:   r  ctypesc_size_tr`   r  rT   r   c_ulongwindllkernel32ZVirtualAllocc_void_pr  r  r<   	CFUNCTYPE_memmove_addrZVirtualProtectbyrefr  ZGetCurrentProcessZFlushInstructionCacher  r  r  r  r  r  r  r%   	addressofc_intfrom_bufferr  r  )r   r  r  Z
MEM_COMMITZPAGE_READWRITEZpfnVirtualAllocmemmoveZPAGE_EXECUTEZold_protectZpfnVirtualProtectresZpfnGetCurrentProcessr  r  r  r  r  r  Zfunctyper   r   r
   compile  sJ   





"
" 
 zASM.compilec                 C   s   |   }|S r  )r  )r   r  r   r   r
   run  s   zASM.runc                 C   s^   t jrtd}tjjt| jt	d| n| j
  d | _d | _
d | _d | _d| _d S )Ni   r   )rT   r   r  r  r  r  ZVirtualFreer  r  r  r  r   r  r  r  )r   ZMEM_RELEASEr   r   r
   free  s   
"

zASM.free)rQ   rR   rS   r   r  r  r  r   r   r   r
   r    s
    
8r  c                   @   sn   e Zd ZdddZddg fddZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )CPUIDNc                 C   s    |d u r	t dd}t|| _d S )NF)r   r  is_selinux_enforcing)r   r  r   r   r
   r     s   
zCPUID.__init__r   c                 C   s   t |||}|  |S r  )r  r  )r   r  r  r  asmr   r   r
   	_asm_func  s   zCPUID._asm_funcc                 G   s*   t tjd|}|  | }|  |S )Nr   )r  r  c_uint32r  r  r  )r   r  r  r  r   r   r
   _run_asm  s
   zCPUID._run_asmc                 C   sf   |  dd}|  dd}|  dd}g }|||fD ]}dD ]}|t||? d@  qqd|}|S )N   1         ér      r_        r/   )r  r   chrr:   )r   ebxecxedxrd  r}  r	   r   r   r
   get_vendor_id  s&   
zCPUID.get_vendor_idc           	      C   s   |  dd}|d? d@ }|d? d@ }|d? d@ }|d? d@ }|d	? d@ }|d
? d@ }d}|dv r5|| }n|}|dv rA|d> | }||||dS )N      s   r      r  r     r@   r_     r  )r  )r5  r  )r  r  r  r  r  )	r   eaxZstepping_idr  Z	family_idr  Zextended_model_idZextended_family_idr  r   r   r
   get_info  s*   
zCPUID.get_infoc                 C   s   |  d}|S )Ns      r  )r   max_extension_supportr   r   r
   get_max_extension_support=  s   zCPUID.get_max_extension_supportc                 C   s  |  dd}|  dd}i dt|ddt|ddt|d	d
t|ddt|ddt|ddt|ddt|ddt|ddt|ddt|ddt|ddt|ddt|dd t|d!d"t|d#d$t|d%i d&t|d'd(t|d)d*t|d+d,t|d-d.t|d/d0t|d1d2t|d3d4t|d5d6t|d7d8t|d9d:t|d;d<t|d=d>t|d?d@t|ddAt|ddBt|d	dCt|di dDt|ddEt|ddFt|ddGt|ddHt|ddIt|ddJt|dKdLt|ddMt|ddNt|ddOt|d!dPt|d%dQt|d'dRt|d)dSt|dTdUt|d+dVt|d-t|d/t|d1t|d3t|d5t|d7t|d9t|d;t|d=t|d?dW	}dXdY | D }|dkr|  dZd[}|  dZd\}i d]t|d	d^t|dd_t|dd`t|ddat|ddbt|ddct|dddt|dKdet|ddft|ddgt|ddht|d!dit|d#djt|d%dkt|d'dlt|d)dmt|dTi dnt|d+dot|d-dpt|d/dqt|d1drt|d3dst|d5dtt|d7dut|d9dvt|d;dwt|d=dxt|d?dyt|ddzt|dd{t|d	d|t|dd}t|dd~t|dt|dt|dt|dKt|dt|dt|dt|d-t|d=d}ddY | D }||7 }|dkr|  d}|  d}i dt|ddt|ddt|d	d
t|ddt|ddt|ddt|ddt|ddt|ddt|ddt|ddt|ddt|ddt|dd t|d!d"t|d#d$t|d%i dt|d)dt|dTdt|d-d.t|d/d0t|d1dt|d3dt|d5dt|d7dt|d;dt|d=dt|d?dt|ddt|ddt|d	dt|ddt|ddt|di dt|ddt|ddt|ddt|ddt|dKdt|ddt|ddt|ddt|d!dt|d#dt|d%dt|d)dt|d+dt|d-dt|d/dt|d1dt|d5t|d7t|d9d}ddY | D }||7 }|  |S )Nr  r  r  fpur   vmer!   der"   pser@   tscr  msrrV   paer5  mce   cx8r  apicr   sep   mtrrr  pge   mca   cmovr  patr_  pse36   Zpn   clflush   dts   acpi   mmx   fxsrr  sse   sse2   ss   Zht   tm   ia64   Zpbe   ZpniZ	pclmulqdqZdtes64ZmonitorZds_cplZvmxZsmxZestZtm2Zssse3Zcid
   fmaZcx16ZxtprZpdcmZpcidZdcaZsse4_1Zsse4_2r  Zx2apicZmovbe)	ZpopcntZtscdeadlineZaesZxsaveZosxsaveZavxZf16cZrdrndZ
hypervisorc                 S      g | ]\}}|r|qS r   r   rY  r   r   r
   r         z#CPUID.get_flags.<locals>.<listcomp>s   1s
      s
      ZsgxZbmi1hleZavx2ZsmepZbmi2ZermsZinvpcidZrtmZpqmZmpxZpqeZavx512fZavx512dqZrdseedZadxZsmapZ
avx512ifmaZpcommitZ
clflushoptZclwbZintel_ptZavx512pfZavx512erZavx512cdshaZavx512bwZavx512vlZprefetchwt1Z
avx512vbmiZumipZpkuZospkeZavx512vbmi2)ZgfniZvaesZ
vpclmulqdqZ
avx512vnniZavx512bitalgZavx512vpopcntdqZrdpidZsgx_lcc                 S   r  r   r   rY  r   r   r
   r     r  l       s
     s
     ZsyscallmpnxZmmxextZfxsr_optZpdpe1gpZrdtscpZlmZ3dnowext3dnowZlahf_lmZ
cmp_legacyZsvmZextapicZ
cr8_legacyZabmZsse4aZmisalignsseZ3dnowprefetchZosvwZibsZxopZskinitZwdtZlwpZfma4ZtceZ
nodeid_msrZtbmZtopoextZperfctr_coreZ
perfctr_nbZdbx)ZperftscZpci_l2ic                 S   r  r   r   rY  r   r   r
   r   V  r  )r  r  r   r  )r   r  r  r  r  r  Zextended_flagsr   r   r
   	get_flagsH  s  








	





















 
"
#
$
%
&
'
(
)
*
+
,
.
/
0
1
3
4
5
6
7
89E
		





	






















 
"
#
$
%
&
(*E









	



















 
"
#
$
%
&
'
(
)
*
+
,
-
.
/
1
2
3
5
7
8
9
:
<=EzCPUID.get_flagsc                 C   s   d}|dkr?g d}|D ]2}|  |d}|  |d}|  |d}|  |d}||||fD ]}	dD ]}
|t|	|
? d	@ 7 }q0q,q|d
 }|S )Nr/   l       )s     s     s     s   r  r  r  r  r   )r  r  rj   )r   r  r   ZinstructionsZinstructionr  r  r  r  r}  r	   r   r   r
   get_processor_brand]  s6   zCPUID.get_processor_brandc                 C   sB   i }|dk r|S |  d}|d@ d |d? d@ |d? d@ d	}|S )
Nl       s
     r  rF  r  r  r_  i  )size_bassociativityline_size_br  )r   r  
cache_infor  r   r   r
   	get_cache  s   


zCPUID.get_cachec                    s   d }t jdkr.d }ttjttjf}| ||g d}|j  fdd}||_|}|S t jdkrCtj}d}| ||g d}|}|S )N32bit)   Us   r        1s   ]s   Ms   s      ]   c                     sB   t d} t d} t | t | | jd> d@ |jB }|S )Nr   rz  l        )r  r  r  r   )highlowr  Zold_funcr   r
   new_func  s
   

z&CPUID.get_ticks_func.<locals>.new_func64bitr   )	   Hr  r  r  r  s    r  s   	r
  )rT   r   r  POINTERc_uintr  r  c_uint64)r   r  r  r  Zget_ticks_x86_32r  Zget_ticks_x86_64r   r  r
   get_ticks_func  s(   
	
zCPUID.get_ticks_funcc                 C   s@   ddl m} |  }| }|d | }|| }|  |S )Nr   )sleepr!   )timer  r  r  r  )r   r  Zticks_fnrW  r[  r(  r   r   r
   
get_raw_hz  s   zCPUID.get_raw_hzr  )rQ   rR   rS   r   r  r  r  r  r  r  r  r  r  r  r   r   r   r
   r    s    
#!  6:r  c                  C   s  ddl m}  tdd}i }|jt_|jt_ztt	j
\}}|dvr-|d ||dW S t|}|jr@|d ||dW S | }||}| }||}| }	t|	}	t|\}
}| d|t|
|t|	dt|
|t|	d|d |d	 |d
 |d |d |d |d ||d}t|}|  W n1 ty } z%ddlm} | }ddd | dD d |_!||dW  Y d}~S d}~ww ||dS )z
	Warning! This function has the potential to crash the Python runtime.
	Do not call it directly. Use the _get_cpu_info_from_cpuid function instead.
	It will safely call this function in another process.
	r   r   Tr   r   -Not running on X86_32 or X86_64. Skipping ...z"SELinux is enforcing. Skipping ...r/   r   r  r  r  r  r  r  )r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r2   c                 S   r4   r5   r7   r   r   r   r
   r   8  r8   z3_get_cpu_info_from_cpuid_actual.<locals>.<listcomp>r1   NF)"r   r   r   r   sysrK   r   rL   r   rT   r   r?   rP   r  r  r  r  r  r  r  r   rT  r  r<  r1  r  r  r.   r<   r=   r3   r:   r;   r   )r   r  rG   r   r   Zcpuidr  r  r   r   r   r/  rM   r3   r>   r   r   r
   _get_cpu_info_from_cpuid_actual  s^   




 r  c                 C   s0   t j}t j}t }|t _|t _| t| d S r  )r  rK   rL   r  putr   )queueorig_stdoutorig_stderrrB   r   r   r
   +_get_cpu_info_from_cpuid_subprocess_wrapper=  s   r   c               
   C   sZ  t d ddlm} m} tjst d i S ttj	\}}|dvr)t d i S zt
r| }| t|fd}|  | rG|d | s>|jdkrTt d i W S | r`t d	 i W S t| }dd
l}|jdd}d|v r|d rt |d  d|v r|d rtjd|d  tj  d|v r|d rtjd|d  tj  d|vrt d i W S d|v r|d rt d t |d  t d i W S d|v r|d rt d i W S d|vs|d st d i W S |d W S tj}	tj}
t }|	t_|
t_t   |d W S  ty, } zt | W Y d
}~i S d
}~ww )z
	Returns the CPU info gathered by querying the X86 cpuid register in a new process.
	Returns {} on non X86 cpus.
	Returns {} if SELinux is in enforcing mode.
	z Tying to get info from CPUID ...r   )ProcessQueuezCan't CPUID. Skipping ...r  r  )targetargsz,Failed to run CPUID in process. Skipping ...z7Failed to get anything from CPUID process. Skipping ...Nr  )indentrB   rK   z{0}
rL   rN   z6Failed to get is_fail from CPUID process. Skipping ...rM   z
Failed ...rG   z:Failed to get return info from CPUID process. Skipping ...)r   r,   r   r!  r"  rT   r   r?   r   r   CAN_CALL_CPUID_IN_SUBPROCESSr   rW  is_aliver:   exitcodeemptyr   r   pprintZPrettyPrinterr%   r  rK   r   r&   rL   r  r.   r<   )r!  r"  r   r   r  r   rB   r*  ppr  r  rM   r   r   r
   _get_cpu_info_from_cpuidH  sz   















r,  c               
   C   s  t d zEt st d i W S t \} }| dkr%t d i W S td|dddd	d
}td|dddddd}td|ddd}td|tdd}td|tdd}td|tdd}td|ddd}td|ddddd}	|	rv|	 }	|		  |sz;t
ddD ]3}
d|
}td|dd|}|rdd |dD }t|}d|v r|d dkrd |v r|d  } nq~W n	 ty   Y nw td|ddd!d"d#d$d%	}| d& }t|}d'\}}zt|\}}W n	 ty   Y nw ||t||	||||d(}|r|d)kr|}d*}n
|r|d)kr|}t||d+kr&t|||d,< t|||d-< t||d+kr<t|d*|d.< t|d*|d/< t|dddd0}t   |W S  tye } zt | i W  Y d}~S d}~ww )1z`
	Returns the CPU info gathered from /proc/cpuinfo.
	Returns {} if /proc/cpuinfo is not found.
	z(Tying to get info from /proc/cpuinfo ...z*Failed to find /proc/cpuinfo. Skipping ...r   z-Failed to run cat /proc/cpuinfo. Skipping ...FNr/   rd  z	vendor idvendorTz
model namer   	processorZuarchz
cache sizer@  r  r  z
cpu familyZHardwarer  FeaturesASEs implementedr  zcache{0}c                 S   s   g | ]}| d qS rm  )r;   )r   rN  r   r   r
   r     r8   z3_get_cpu_info_from_proc_cpuinfo.<locals>.<listcomp>r   level3r  zcpu MHzz	cpu speedclockzcpu MHz dynamiczcpu MHz staticr4  r   )r   r   r  r  r   r  r  r  r#  r5  r*  r   r   r   r   r  r  r  )r   r,   rT   r[   r?   r   r  r.  r;   r  ranger   r   r<   rk   r%  rj   r   rT  rO  r1  r<  r  r.   )r   rB   rd  r   
cache_sizer  r  r  Zhardwarer  irf  r   r   r   r/  rG   rM   r   r   r
   _get_cpu_info_from_proc_cpuinfo  s   




r8  c               
   C   s>  t d zd\} }t st d i W S t \}}|dkr(t d i W S |dd dd } | d	}|d
ks?J | d|d   	 } | 
drSd}n| 
drZd}| dd } t| } t| |t| |t| |t| |d}t|}t   |W S  ty } zt | i W  Y d}~S d}~ww )z^
	Returns the CPU info gathered from cpufreq-info.
	Returns {} if cpufreq-info is not found.
	z'Tying to get info from cpufreq-info ...rP  z)Failed to find cpufreq-info. Skipping ...r   z(Failed to run cpufreq-info. Skipping ...zcurrent CPU frequency isr!   r1   r7  r@  r"   r4  r5  r3  r   )r   r   r   r   N)r   r,   rT   ro   r?   r   r;   rc  rj   rk   r&  r%  r   r<  r1  r  r.   r<   )ri  r/  r   rB   r7  rG   rM   r   r   r
   _get_cpu_info_from_cpufreq_info  sB   






r9  c               
   C   s0  t d zwt st d i W S t \} }| dkr%t d i W S i }td|dddd}|rTt|}d	}t|||d
< t|||d< t	|||d< t	|||d< td|dddd}|rt|}d	}t|||d
< t|||d< t	|||d< t	|||d< td|ddd}|r||d< td|ddd}|r||d< ntd|ddd}|r|
 s||d< td|ddd}|r|
 rt||d< td|ddd}|r|
 rt||d< td|ddd}	|	r|	
 rt|	|d< td|ddd}
|
r|
dd  }
t|
|d< td|ddd}|r |dd  }t||d< td|dddd }|r;|dd  }t||d!< td|ddd"}|rU|dd  }t||d#< td|ddd$d%d&}|rn| }|  ||d$< t|dddd'}t   |W S  ty } zt | i W  Y d}~S d}~ww )(zP
	Returns the CPU info gathered from lscpu.
	Returns {} if lscpu is not found.
	z Tying to get info from lscpu ...z"Failed to find lscpu. Skipping ...r   z!Failed to run lscpu. Skipping ...FNzCPU max MHzzCPU MHzr5  r   r   r   r   zCPU dynamic MHzzCPU static MHzz	Vendor IDr   z
Model namer   Modelz
CPU familyr  Steppingr  r  z	L1d cache(r	  z	L1i cacher
  zL2 cachez	L2d cacher   zL3 cacher  r  r/  r0  r4  )r   r,   rT   r{   r?   rz   r  r   r<  r1  r  r.  r;   rj   rO  r  r  r.   r<   )r   rB   rG   Znew_hzr/  rd  rg  r  r  r  r	  r
  r   r  r  rM   r   r   r
   _get_cpu_info_from_lscpu;  s   




r=  c                  C   s   t d ttj\} }| dv rt d i S t s"t d i S t \}}|du s0|dkr7t d i S t|}t 	  |S )zr
	Returns the CPU info gathered from dmesg.
	Returns {} if dmesg is not found or does not have the desired info.
	z$Tying to get info from the dmesg ...)r   zRunning on S390X. Skipping ...z"Failed to find dmesg. Skipping ...Nr   z&Failed to run "dmesg -a". Skipping ...)
r   r,   r   rT   r   r?   rb   r   ry  r.   )r   r   r   rB   rG   r   r   r
   _get_cpu_info_from_dmesg  s   



r>  c                  C   sB  t d z t st d i W S t \} }|du s!| dkr)t d i W S |dd  }dd	 |D }d
|}t	|dd d}t	|dd d}i dt
|ddt
|ddt
|ddt
|ddt
|ddt
|ddt
|ddt
|ddt
|ddt
|ddt
|dd t
|d!d"t
|d#d$t
|d%d&t
|d'd(t
|dd)t
|d*t
|d+t
|d,t
|d-t
|d.t
|d/t
|d0t
|dt
|dt
|dt
|dt
|dt
|dd1}d2d	 | D }|  d3|i}t|}t   |W S  ty  } zt | i W  Y d}~S d}~ww )4z
	Returns the CPU info gathered from lsprop /proc/device-tree/cpus/*/ibm,pa-features
	Returns {} if lsprop is not found or ibm,pa-features does not have the desired info.
	z!Tying to get info from lsprop ...z#Failed to find lsprop. Skipping ...Nr   zEFailed to glob /proc/device-tree/cpus/*/ibm,pa-features. Skipping ...zibm,pa-featuresr!   c                 S   s   g | ]
}|t d v r|qS )Z0123456789abcfed)r   r   sr   r   r
   r     s    z6_get_cpu_info_from_ibm_pa_features.<locals>.<listcomp>r/   r  r_  Zmmur  Zslbr"   r  r@   ZdabrrV   ner5  Zwtrr  ZmcrZdsisrr   Zlpr  rir  Zdabrxr  Zsprg3r  Zrislbr  r+  r  Zvpmzdss_2.05r  r  r  r  r  r  r  )ZdarZpprzdss_2.02zdss_2.06Zlsd_in_dscrZugr_in_dscrzsso_2.06leZcfarZebzlsq_2.07zdss_2.07c                 S   r  r   r   rY  r   r   r
   r   -  r  r  )r   r,   rT   r}   r?   r   r;   rk   r:   r.  r  r   r  r  r.   r<   )r   rB   r   r  r  r  rG   rM   r   r   r
   "_get_cpu_info_from_ibm_pa_features  s   










	









	
S
rD  c                  C   s^   t d t st d i S t \} }|du s| dkr%t d i S t|}t   |S )z
	Returns the CPU info gathered from /var/run/dmesg.boot.
	Returns {} if dmesg is not found or does not have the desired info.
	z6Tying to get info from the /var/run/dmesg.boot log ...z5Failed to find /var/run/dmesg.boot file. Skipping ...Nr   z5Failed to run "cat /var/run/dmesg.boot". Skipping ...)r   r,   rT   rm   r?   r   ry  r.   )r   rB   rG   r   r   r
   )_get_cpu_info_from_cat_var_run_dmesg_boot;  s   


rE  c                  C   s  t d zt st d i W S t \} }|du s | dkr(t d i W S td|ddd}td|ddd	}td|tdd
}td|tdd}td|tdd}td|tdd}td|ddd 	 }|
td|ddd 	  |
td|ddd 	  |  t|\}	}
td|ddd}t|}||t|	|
t|dt|	|
t|dt|d ||||d}t|}t   |W S  ty } zt | i W  Y d}~S d}~ww )zR
	Returns the CPU info gathered from sysctl.
	Returns {} if sysctl is not found.
	z!Tying to get info from sysctl ...z#Failed to find sysctl. Skipping ...Nr   z@Failed to run "sysctl machdep.cpu hw.cpufrequency". Skipping ...Fzmachdep.cpu.vendorTzmachdep.cpu.brand_stringzmachdep.cpu.cache.sizezmachdep.cpu.steppingzmachdep.cpu.modelzmachdep.cpu.familyr/   zmachdep.cpu.featureszmachdep.cpu.leaf7_featureszmachdep.cpu.extfeaturesr   rF  r   r   r   r   r   r   r   r  r  r  r  )r   r,   rT   rs   r?   r   r  r.  rk   r;   extendr  rT  r   r<  r1  r  r.   r<   )r   rB   rd  r   r6  r  r  r  r  r   r/  r   rG   rM   r   r   r
   _get_cpu_info_from_sysctlS  sT   




rH  c                  C   s   t  } | t  | S )T
	Returns the CPU info gathered from sysinfo.
	Returns {} if sysinfo is not found.
	)_get_cpu_info_from_sysinfo_v1update_get_cpu_info_from_sysinfo_v2)rG   r   r   r
   _get_cpu_info_from_sysinfo  s   rM  c                  C   s  t d zt st d i W S t \} }|du s | dkr(t d i W S d}|dd d	d  }d}t|d
d dd  }t|dd dd  }t|dd dd  }g }|dD ]}	|		dr|	 
  D ]}
||
 qqq|  t|\}}|}||t||t||t||t||t|||||d}t|}t   |W S  ty } zt | i W  Y d}~S d}~ww )rI  z,Tying to get info from sysinfo version 1 ...$Failed to find sysinfo. Skipping ...Nr   *Failed to run "sysinfo -cpu". Skipping ...r/   	CPU #0: "r!   "
z, stepping r  z, model z	, family r1   		rF  )r   r,   rT   ry   r?   r   r;   rj   r.  r  rk   r   r  rT  r<  r1  rE  r  r.   r<   )r   rB   rd  r   r6  r  r  r  r  r+   rx  r   r/  r   rG   rM   r   r   r
   rJ    sX   


   

rJ  c                  C   s(  t d zt st d i W S t \} }|du s | dkr(t d i W S d}|dd d	d  }d}|d
d dd  }t|dd dd  }t|dd dd  }t|dd dd  }dd }	|	|dd |	|dd  |	|dd  }
|
	  dd |dD }|d dd  
 }|dd }t|}|}d}|drd}n|drd}||t||t||t||t||t|||||
d}t|}t   |W S  ty } zt | i W  Y d}~S d}~ww )rI  z,Tying to get info from sysinfo version 2 ...rN  Nr   rO  r/   rP  r!   rQ  z
Signature:r1   z	stepping r  zmodel zfamily c                 S   s\   g }|  ddd  D ] }|ds|ds |S |   dD ]}|| q#q|S )Nr1   r!   z                rR  r   )r;   r  rj   rk   r   )rB   r  r+   rN  r   r   r
   get_subsection_flags  s   z;_get_cpu_info_from_sysinfo_v2.<locals>.get_subsection_flagsz
Features: z Extended Features (0x00000001): z Extended Features (0x80000001): c                 S   s   g | ]}|r|qS r   r   r   r   r   r
   r   	  r   z1_get_cpu_info_from_sysinfo_v2.<locals>.<listcomp>zrunning at r4  r3  r5  r   rF  )r   r,   rT   ry   r?   r   r;   rj   r.  r  rk   r%  r   r&  r<  r1  rE  r  r.   r<   )r   rB   rd  r   r6  	signaturer  r  r  rS  r  rt  Zraw_hzr   r   r/  rG   rM   r   r   r
   rL    sj   


   


rL  c                  C   s4  t d ztjrt st d i W S t \} }|du s#| dkr+t d i W S |d}dd |D }d	d
 |D }|d}t	|\}}|d}d}|rVt
|}|d}|rct|d }|d}	|	rpt|	d }	d\}
}}|dp~|d}|d}d|v r|dt|d k r|d}t||d  }
d|v r|dt|d k r|d}t||d  }d|v r|dt|d k r|d}t||d  }|d|t||t||t||t||||	|||
d}t|}t   |W S  ty } zt | i W  Y d}~S d}~ww )zd
	Returns the CPU info gathered from WMI.
	Returns {} if not on Windows, or wmic is not installed.
	zTying to get info from wmic ...z4Failed to find WMIC, or not on Windows. Skipping ...Nr   z Failed to run wmic. Skipping ...r1   c                 S   s"   g | ]}d |v r|  d qS rm  )r%  r;   r?  r   r   r
   r   D	  s   " z+_get_cpu_info_from_wmic.<locals>.<listcomp>c                 S   rr  r   r   rY  r   r   r
   r   E	  ro  z+_get_cpu_info_from_wmic.<locals>.<dictcomp>NameZCurrentClockSpeedr5  ZL2CacheSizerF  ZL3CacheSize)r/   r/   r/   DescriptionZCaptionr   Familyr!   r:  r;  ZManufacturer)r   r   r   r   r   r   r   r  r  r  r  )r   r,   rT   r   r   r?   r   r;   r   rT  r   r.  r,  r`   r<  r1  r  r.   r<   )r   rB   r   r   r   Zscale_advertisedr   Zscale_actualr   r  r  r  r  descriptionentriesr7  rG   rM   r   r   r
   _get_cpu_info_from_wmic0	  sp   













rZ  c                     s   t d ztjst d i W S t  } t }t }t	|\}}t
 }t|}t| \}}|dkr=d}t|}t   fdd}i d|dd	|d
d|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd |d!d"|d#d$|d%d&|d'|d(|d)|d*|d+|d,|d-|d.|d/|d0|d1|d2|d3|d4d5}	d6d7 |	 D }	|	  || t||t|dt||t|d|	d8}
t|
}
t   |
W S  ty } zt | i W  Y d9}~S d9}~ww ):z[
	Returns the CPU info gathered from the Windows Registry.
	Returns {} if not on Windows.
	z+Tying to get info from Windows registry ...z$Not running on Windows. Skipping ...r#  r5  c                    s   d| ? }| @ dk}|S )Nl        r   r   )r~  r  r  r   r   r
   r  	  r  z+_get_cpu_info_from_registry.<locals>.is_setr  r   r  r!   r  r"   r  r@   r  r  r  rV   r  r  r  r  r  r  r   Zsepamdr  r  r  r  r  r  r  r  r  r  r  r  r_  r  r  r  r  r  r  r  r  r  r  r  r  r  )r  serialr  r  r  r  r  r  r  r  r  r  r  c                 S   r  r   r   rY  r   r   r
   r   	  r  z/_get_cpu_info_from_registry.<locals>.<listcomp>)r   r   r   r   r   r   r  N)r   r,   rT   r   r?   r   rj   r   r   r   r   r   rT  r   r   r  r<  r1  r  r.   r<   )r   rd  r   r   r   r   r   r/  r  r  rG   rM   r   r   r
   _get_cpu_info_from_registry	  s   

	
$
r\  c                  C   s
  t d zt rt st d i W S t \} }|du s$| dkr,t d i W S t \} }|du s:| dkrBt d i W S |dd d	d 	 }|d
d d	d 	 }t
|dd d	d 	 }t
|dd d	d 	 }t
|dd d	d 	 }|	 d	d 	   }|  d}	|dd d	d 	 }
t|
}
|dd d	d 	 }t|}||t|
|	t|dt|
|	t|d||||d
}t|}t   |W S  ty } zt | i W  Y d}~S d}~ww )zh
	Returns the CPU info gathered from isainfo and kstat.
	Returns {} if isainfo or kstat are not found.
	z Tying to get info from kstat ...z,Failed to find isinfo or kstat. Skipping ...Nr   z)Failed to run "isainfo -vb". Skipping ...z/Failed to run "kstat -m cpu_info". Skipping ...z	vendor_id r!   r1   z	brand z
	stepping z	model z	family r@  r5  z	clock_MHz z	current_clock_Hz )
r   r   r   r   r   r   r  r  r  r  )r   r,   rT   ru   rw   r?   r   r   r;   rj   r.  rk   r  r   r<  r1  r  r.   r<   )r   Zflag_outputrv   rd  r   r  r  r  r  r/  r   r   rG   rM   r   r   r
   _get_cpu_info_from_kstat	  sX   



   
r]  c               
   C   s,  t d zwtjdd } d\}}}| d}d|v r4|dt|d k r4|d}t||d  }d|v rP|dt|d k rP|d}t||d  }d	|v rl|d	t|d k rl|d	}t||d  }|||d
}t|}t 	  |W S  t
y } zt | i W  Y d }~S d }~ww )Nz)Tying to get info from platform.uname ...r  r   )NNNr   rW  r!   r:  r;  )r  r  r  )r   r,   rT   r   r;   r,  r`   r.  r  r.   r<   r?   )rl   r  r  r  rY  r7  rG   rM   r   r   r
   !_get_cpu_info_from_platform_uname1
  s4   






r^  c                  C   s  t d ttj\} }dddtjpd}djtj	 }d||}|t
t| |tjtjd}t d	|d
  t d|d  t d|d  t d|d  t d|d  t d|d  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t|t  t d |S )zo
	Returns the CPU info by using the best sources of information for your OS.
	Returns {} if nothing is found.
	zP!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!z32 bitz64 bit)il    zunknown bitsz{0}.{1}.{2}.{3}.{4}z	{0} ({1}))python_versioncpuinfo_versioncpuinfo_version_stringr   r   r   r   zpython_version: {0}r_  zcpuinfo_version: {0}r`  z	arch: {0}r   z	bits: {0}r   z
count: {0}r   zarch_string_raw: {0}r   )r   r%   r   rT   r   r   r  maxsizer   version_infoCPUINFO_VERSIONCPUINFO_VERSION_STRINGr   r  rZ  r\  r8  r9  r=  rH  r]  r>  rE  rD  rM  r,  r^  )r   r   Zfriendly_maxsizeZfriendly_versionPYTHON_VERSIONrG   r   r   r
   _get_cpu_info_internalS
  sD   


rg  c                  C   s   ddl } d}ttddrt }| |}d|}|S ddlm}m} tj	t
dg}|||||d}| d }|jdkr>d	S |jd
d}|S )zs
	Returns the CPU info by using the best sources of information for your OS.
	Returns the result in a json string
	r   NfrozenFr  r   --jsonr   z{}r   r   )jsongetattrr  rg  r   r   r   r   r   
executable__file__r   r   r   )rj  rB   rG   r   r   r   r   r   r   r
   get_cpu_info_json
  s   


rn  c                  C   s    ddl } t }| j|td}|S )zl
	Returns the CPU info by using the best sources of information for your OS.
	Returns the result in a dict
	r   N)object_hook)rj  rn  r   r   )rj  rB   r   r   r
   get_cpu_info
  s   rp  c               
   C   s  ddl m}  dd l}| dd}|jdddd |jd	dd
d |jdddd | }t|jdazt  W n! t	yW } zt
jt|d  t
d W Y d }~nd }~ww t }|sht
jd t
d |jrtt|| d S |jr}tt d S td|dd td|dd td|dd td|dd td|dd td|dd td|dd td |d!d td"|d#d td$|d%d td&|d'd td(|d)d td*|d+d td,|d-d td.|d/d td0|d1d td2|d3d td4|d5d td6|d7d td8|d9d td:|d;d td<|d=d td>|d?d td@dA|dBd d S )CNr   )ArgumentParserzGets CPU info with pure Python)rX  ri  
store_truezReturn the info in JSON format)actionhelpz	--versionz Return the version of py-cpuinfoz--tracez/Traces code paths used to find CPU info to fileFr1   r!   zFailed to find cpu info
zPython Version: {0}r_  r/   zCpuinfo Version: {0}ra  zVendor ID Raw: {0}r   zHardware Raw: {0}r   zBrand Raw: {0}r   zHz Advertised Friendly: {0}r   zHz Actual Friendly: {0}r   zHz Advertised: {0}r   zHz Actual: {0}r   z	Arch: {0}r   z	Bits: {0}r   z
Count: {0}r   zArch String Raw: {0}r   zL1 Data Cache Size: {0}r	  zL1 Instruction Cache Size: {0}r
  zL2 Cache Size: {0}r   zL2 Cache Line Size: {0}r  zL2 Cache Associativity: {0}r  zL3 Cache Size: {0}r  zStepping: {0}r  z
Model: {0}r  zFamily: {0}r  zProcessor Type: {0}r  z
Flags: {0}z, r  )argparserq  rj  add_argument
parse_argsr   r  r   r   r<   r  rL   r%   r   exitrg  printr   versionre  r   r   r:   )rq  rj  parserr$  rM   rG   r   r   r
   main
  s^   


 r|  __main__Fr  )<rd  r:   re  rX   r  rh   r   r  r&  r   objectr   rT   ra   r   r   r   r   r   r   r  r  r  r   r1  r6  r<  rE  rO  rT  rj  ry  r   r  r  r  r  r  r  r   r,  r8  r9  r=  r>  rD  rE  rH  rM  rJ  rL  rZ  r\  r]  r^  rg  rn  rp  r|  rQ   r   r   r   r
   <module>   s   { 

	"4_9$X    Kd`/a @
ARTiD"L 
9


