o
    YqiI                    @   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   V/home/app/PaddleOCR-VL/.venv_paddleocr/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)self	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	tracebackr4   )r   r)   r!   r*   r+   r,   r4   
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 )Nr7   r0   c                 S   r5   )z			{0}
r8   r   r   r   r
   r   u   r9   z(Trace.command_output.<locals>.<listcomp>r2   )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   rE   rG   r   r
   r           z		{0}: {1}
r2   r$   )r   keysrH   rI   r!   r*   r+   r,   Zchanged_keysrF   Znew_keysr   rG   r
   rK   x   s*   

 z
Trace.keysc                 C   s(   | j sd S | j|d  | j  d S )Nr2   )r   r   r&   r'   )r   r)   r   r   r
   r&      s   
zTrace.writec                 C   s&   | j  | j | j || j|dS )N)rC   stdoutstderrrH   erris_fail)r   getvaluer   r   r   )r   rH   rO   r   r   r
   to_dict   s   zTrace.to_dictN)__name__
__module____qualname__r   r-   r/   r@   rB   rD   rK   r&   rQ   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lowerrY   rZ   r[   )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   rd   zDataSource.has_cpufreq_infoc                   C   r^   )Nsestatusr   r`   r   r   r   r
   has_sestatus   rd   zDataSource.has_sestatusc                   C   r^   )Nsysctlr   r`   r   r   r   r
   
has_sysctl   rd   zDataSource.has_sysctlc                   C   r^   )Nisainfor   r`   r   r   r   r
   has_isainfo   rd   zDataSource.has_isainfoc                   C   r^   )Nkstatr   r`   r   r   r   r
   	has_kstat   rd   zDataSource.has_kstatc                  C   sD   t   dd  } d| v pd| v }|o!ttddkS )Nre   rf   ZbeosZhaikusysinfor   )ri   rj   rk   rl   ra   rb   )rm   Zis_beosr   r   r
   has_sysinfo   s    zDataSource.has_sysinfoc                   C   r^   )Nlscpur   r`   r   r   r   r
   	has_lscpu   rd   zDataSource.has_lscpuc                   C   r^   )Nlspropr   r`   r   r   r   r
   has_ibm_pa_features   rd   zDataSource.has_ibm_pa_featuresc                  C   s$   t g d\} }| dkot|dkS )N)wmicrY   getVersionr   )_run_and_get_stdoutra   )
returncoderC   r   r   r
   has_wmic   s   zDataSource.has_wmicc                   C      t ddgS )NcatrX   r   r   r   r   r
   cat_proc_cpuinfo   r]   zDataSource.cat_proc_cpuinfoc                   C   
   t dgS )Nro   r   r   r   r   r
   cpufreq_info      
zDataSource.cpufreq_infoc                   C   r   )Nrq   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   rh   r   r   r   r   r
   cat_var_run_dmesg_boot   r]   z!DataSource.cat_var_run_dmesg_bootc                   C      t g dS )N)rs   zmachdep.cpuhw.cpufrequencyr   r   r   r   r
   "sysctl_machdep_cpu_hw_cpufrequency   r]   z-DataSource.sysctl_machdep_cpu_hw_cpufrequencyc                   C   r   )Nru   z-vbr   r   r   r   r
   
isainfo_vb   r]   zDataSource.isainfo_vbc                   C   r   )N)rw   z-mZcpu_infor   r   r   r   r
   kstat_m_cpu_info   r]   zDataSource.kstat_m_cpu_infoc                   C   r   )Nry   z-cpur   r   r   r   r
   sysinfo_cpu  r]   zDataSource.sysinfo_cpuc                   C   r   )Nr{   r   r   r   r   r
   r{     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_keyrk   )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).rR   rS   rT   ri   architecturebitsmultiprocessing	cpu_countrj   rl   
is_windowsmachiner   rm   uname_string_raw	can_cpuidstaticmethodr\   rc   rn   rp   rr   rt   rv   rx   rz   r|   r~   r   r   r   r   r   r   r   r   r   r   r{   r   r   r   r   r   r   r   r   r   r   r
   rU      s    



























rU   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PATHEXTr0   PATH)filterrY   environr   r<   pathseprZ   r;   accessX_OKappend)Zprogram_namepathsextspeZpextr   r   r
   rb   0  s   

rb   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" ...rL   rM   stdin)r   rL   rM   UTF-8encodingzreturn code:zstdout:)
subprocessr   r   g_tracerB   r;   rL   closecommunicatedecoderD   r   r   )commandZpipe_commandr   r   p1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   rB   r   _winregImportErrorwinregOpenKeyHKEY_LOCAL_MACHINEQueryValueExZCloseKeyrD   r   )Zkey_name
field_namer   rN   rF   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_archrU   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   rF   r   r   r   r
   
<dictcomp>  s    z_utf_to_str.<locals>.<dictcomp>)r:   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   rK   r   r   sort)rH   rI   rK   rF   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   )
splitlinesrl   r<   rk   ra   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   r0   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;   rk   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   r0   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   



r3  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   r2  r   r0   c                 s   r  r   r!  r   r   r   r
   r"    r#  z'_hz_friendly_to_full.<locals>.<genexpr>r   z.0r,  )rk   rl   r(  r;   r3  r=   )Z	hz_stringr2  r1  r   r   r
   _hz_friendly_to_full  s"   



r8  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   r0   Hzr   r   GHzr7  MHzrA   ZKHzr"   z{0:.4f} {1}r$  z	0.0000 Hz)r3  r   r.  r&  r)  r'  r=   )r*  r1  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   matchrk   )r   rC  formatspatternZfriendly_sizer   r   r
   _to_friendly_bytes/  s   
rG  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   )	rl   r   rK   valuesr(  r0  r<   rk   r=   )Zfriendly_bytesr   rE  entryrF  
multiplierrN   r   r   r
   _friendly_bytes_to_intC  s4   
 	
rR  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 )
Nr2  r%  r   r   r6  r7  r5  r   @r"   )rl   r(  r<   rsplitr'  rk   r   )
cpu_stringr2  r1  r   r   r
   _parse_cpu_brand_stringa  s   

rW  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   rM  r   r   r
   r   {  r   z._parse_cpu_brand_string_dx.<locals>.<listcomp>z\(c                 S   rX  r   rY  r[  r   r   r
   r   |  r   z\)c                 S   s   i | ]\}}||qS r   r   r   rN  vr   r   r
   r   }  r9   z._parse_cpu_brand_string_dx.<locals>.<dictcomp>c                    s    g | ]\}} |d  | qS )r"   r   )r   rZ  endrV  r   r
   r   ~  rJ   )NNNNr  c                 S   rX  r   )rk   r   r   r   r
   r     r   r  r"   originre   r  0x   r  famr  TFz({0})r%  )r:  r;  r9  zCPU @ )rC  finditerzipr   r<   ra   rk   r0  r-  r   r(  rW  find)rV  rC  ZstartsZendsZinsides	vendor_idr  r  r  Zinsidepairnamer   brandZ
is_workingfullhz_brandr1  r2  rP  r   r_  r
   _parse_cpu_brand_string_dxw  sX   

	rn  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 )r2   r   )r<   rk   r   lr   r   r
   r     s    z'_parse_dmesg_output.<locals>.<listcomp>c                 S   r   r   )rn  ro  r   r   r
   r     r   r   c                 S   s   g | ]}|d uqS r  r   r   r   r   r
   r     r   z	  Origin=r2   c                 S   s   g | ]	}|  d qS =)rk   r<   r   r   r   r
   r         c                 S   s(   g | ]}|d     |d   iqS )r   r"   )rk   rl   r   r   r   r
   r     s   ( r`  re   r  ra  rb  r  rc  )z  Features=z  Features2=z  AMD Features=z  AMD Features2=<>r  r%  r7  )r   r   r  r  r  r	  r   r   r   r   c                 S      i | ]	\}}|r||qS r   r   r\  r   r   r
   r     rs  z'_parse_dmesg_output.<locals>.<dictcomp>)r<   sumrg  rk   r   rK   rO  r0  r-  r   rl   r  rW  r   r>  r3  r   r=   r   r@   )rC   linesZcpu_stringsZbest_stringZhighest_countrV  r  r   r1  r   rh  r  r  r  fieldsfieldrj  r   Z
flag_linescategoryr	  r,   flagr   rH   rN   r   r   r
   _parse_dmesg_output  s   

r}  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   r4  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   Zmipsr   Zmips64r   z^riscv$|^riscv32$|^riscv32be$r   z^riscv64$|^riscv64be$r   )rC  rl   rD  )r   rC  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:)
rU   rr   r@   r   r  rk   rl   
startswithr(  rD   )tracer   rC   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,  rB  r%  )typer   r  )rH   Zacceptable_valuesZfiltered_inforF   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 memmoverb  zFailed VirtualProtectzFailed FlushInstructionCache)mmapMAP_PRIVATEMAP_ANONYMOUS
PROT_WRITE	PROT_READ	PROT_EXECrB  )r	  Zprot)%bytesr;   r  ctypesc_size_tra   r  rU   r   c_ulongwindllkernel32ZVirtualAllocc_void_pr  r  r=   Z	CFUNCTYPEZ_memmove_addrZVirtualProtectbyrefr  ZGetCurrentProcessZFlushInstructionCacher  r  r  r  r  r  r  r&   Z	addressofc_intZfrom_bufferr  r  )r   r  r  Z
MEM_COMMITZPAGE_READWRITEZpfnVirtualAllocZ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   )rU   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)rR   rS   rT   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      rb        r0   )r  r   chrr;   )r   ebxecxedxrh  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     rA   rb     r  )r  )r7  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#   pserA   tscr  msrrW   paer7  mce   cx8r  apicr   sep   mtrrr  pge   mca   cmovr  patrb  pse36   Zpn   clflush   dts   acpi   mmx   fxsrr  sse   sse2   ss   Zht   tm   ia64   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   r\  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   r\  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   r\  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 )Nr0   l       )s     s     s     s   r  r  r  r  r   )r  r  rk   )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  rH  r  r  rb  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   r~  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	  )rU   r   r  ZPOINTERZc_uintr  r  Z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_fnrZ  r^  r*  r   r   r
   
get_raw_hz  s   zCPUID.get_raw_hzr  )rR   rS   rT   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 ...r0   r  r  r   r  r  r  r  )r   r   r   r   r   r   r   r  r  r  r  r  r  r  r	  r3   c                 S   r5   r6   r8   r   r   r   r
   r   8  r9   z3_get_cpu_info_from_cpuid_actual.<locals>.<listcomp>r2   NF)"r   r   r   r   sysrL   r   rM   r   rU   r   r@   rQ   r  r  r  r  r  r  r  r   rW  r  r>  r3  r  r  r/   r=   r>   r4   r;   r<   r   )r   r  rH   r   r   Zcpuidr  r  r   r   r   r1  rN   r4   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  rL   rM   r  putr   )queueorig_stdoutorig_stderrrC   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  )indentrC   rL   z{0}
rM   rO   z6Failed to get is_fail from CPUID process. Skipping ...rN   z
Failed ...rH   z:Failed to get return info from CPUID process. Skipping ...)r   r-   r   r  r  rU   r   r@   r   r   CAN_CALL_CPUID_IN_SUBPROCESSr  rZ  is_aliver;   exitcodeemptyr   r   pprintPrettyPrinterr&   r  rL   r   r'   rM   r  r/   r=   )r  r  r   r   r  r   rC   r&  ppr  r  rN   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 ...FNr0   rh  z	vendor idvendorTz
model namer   	processorZuarchz
cache sizerB  r  r  z
cpu familyZHardwarer	  FeaturesASEs implementedr  zcache{0}c                 S   s   g | ]}| d qS rq  )r<   )r   rP  r   r   r
   r     r9   z3_get_cpu_info_from_proc_cpuinfo.<locals>.<listcomp>r   level3r  zcpu MHzz	cpu speedclockzcpu MHz dynamiczcpu MHz staticr6  r   )r   r   r
  r	  r   r  r  r  r%  r7  r,  r   r   r   r   r  r  r  )r   r-   rU   r\   r@   r   r  r0  r<   r  ranger   r   r=   rl   r'  rk   r   rW  rR  r3  r>  r  r/   )r   rC   rh  r   
cache_sizer  r  r  Zhardwarer	  irj  r   r   r   r1  rH   rN   r   r   r
   _get_cpu_info_from_proc_cpuinfo  s   




r5  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 ...rS  z)Failed to find cpufreq-info. Skipping ...r   z(Failed to run cpufreq-info. Skipping ...zcurrent CPU frequency isr"   r2   r9  rB  r#   r6  r7  r5  r   )r   r   r   r   N)r   r-   rU   rp   r@   r   r<   rg  rk   rl   r(  r'  r   r>  r3  r  r/   r=   )rm  r1  r   rC   r4  rH   rN   r   r   r
   _get_cpu_info_from_cpufreq_info  sB   






r6  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 MHzr7  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,  r-  r1  )r   r-   rU   r|   r@   r{   r  r   r>  r3  r  r0  r<   rk   rR  r  r  r/   r=   )r   rC   rH   Znew_hzr1  rh  rk  r  r  r  r  r  r  r
  r	  rN   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   rU   r   r@   rc   r   r}  r/   )r   r   r   rC   rH   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>r0   r  rb  Zmmur  Zslbr#   r  rA   ZdabrrW   ner7  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   r\  r   r   r
   r   -  r  r	  )r   r-   rU   r~   r@   r   r<   rl   r;   r0  r  r   r  r  r/   r=   )r   rC   r   r  r  r	  rH   rN   r   r   r
   "_get_cpu_info_from_ibm_pa_features  s   










	









	
S
rA  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-   rU   rn   r@   r   r}  r/   )r   rC   rH   r   r   r
   )_get_cpu_info_from_cat_var_run_dmesg_boot;  s   


rB  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.familyr0   zmachdep.cpu.featureszmachdep.cpu.leaf7_featureszmachdep.cpu.extfeaturesr   rH  r   r   r   r   r   r   r  r  r  r  r	  )r   r-   rU   rt   r@   r   r  r0  rl   r<   extendr  rW  r   r>  r3  r  r/   r=   )r   rC   rh  r   r3  r  r  r  r	  r   r1  r   rH   rN   r   r   r
   _get_cpu_info_from_sysctlS  sT   




rE  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)rH   r   r   r
   _get_cpu_info_from_sysinfo  s   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}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 )rF  z,Tying to get info from sysinfo version 1 ...$Failed to find sysinfo. Skipping ...Nr   *Failed to run "sysinfo -cpu". Skipping ...r0   	CPU #0: "r"   "
z, stepping r  z, model z	, family r2   		rC  )r   r-   rU   rz   r@   r   r<   rk   r0  r  rl   r   r  rW  r>  r3  rG  r  r/   r=   )r   rC   rh  r   r3  r  r  r  r	  r,   r|  r   r1  r   rH   rN   r   r   r
   rG    sX   


   

rG  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 )rF  z,Tying to get info from sysinfo version 2 ...rK  Nr   rL  r0   rM  r"   rN  z
Signature:r2   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 )Nr2   r"   z                rO  r   )r<   r  rk   rl   r   )rC   r  r,   rP  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 r6  r5  r7  r   rC  )r   r-   rU   rz   r@   r   r<   rk   r0  r  rl   r'  r   r(  r>  r3  rG  r  r/   r=   )r   rC   rh  r   r3  	signaturer  r  r  rP  r	  rx  Zraw_hzr   r   r1  rH   rN   r   r   r
   rI    sj   


   


rI  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 ...r2   c                 S   s"   g | ]}d |v r|  d qS rq  )r'  r<   r<  r   r   r
   r   D	  s   " z+_get_cpu_info_from_wmic.<locals>.<listcomp>c                 S   rv  r   r   r\  r   r   r
   r   E	  rs  z+_get_cpu_info_from_wmic.<locals>.<dictcomp>NameZCurrentClockSpeedr7  ZL2CacheSizerH  ZL3CacheSize)r0   r0   r0   DescriptionZCaptionr   Familyr"   r7  r8  ZManufacturer)r   r   r   r   r   r   r  r
  r  r  r  )r   r-   rU   r   r   r@   r   r<   r   rW  r   r0  r.  ra   r>  r3  r  r/   r=   )r   rC   r   r   r   Zscale_advertisedr   Zscale_actualr  r
  r  r  r  descriptionentriesr4  rH   rN   r   r   r
   _get_cpu_info_from_wmic0	  sp   













rW  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%  r7  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  rA   r  r  r  rW   r  r  r  r  r  r  r   Zsepamdr  r  r  r  r  r  r  r  r  r  r  r  rb  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   r\  r   r   r
   r   	  r  z/_get_cpu_info_from_registry.<locals>.<listcomp>)r   r   r   r   r   r   r	  N)r   r-   rU   r   r@   r   rk   r   r   r   r   r   rW  r   r   r  r>  r3  r  r/   r=   )r   rh  r   r   r   r   r   r1  r  r	  rH   rN   r   r   r
   _get_cpu_info_from_registry	  s   

	
$
rY  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"   r2   z	brand z
	stepping z	model z	family rB  r7  z	clock_MHz z	current_clock_Hz )
r   r   r   r   r   r   r  r  r  r	  )r   r-   rU   rv   rx   r@   r   r   r<   rk   r0  rl   r  r   r>  r3  r  r/   r=   )r   Zflag_outputrw   rh  r   r  r  r  r	  r1  r   r   rH   rN   r   r   r
   _get_cpu_info_from_kstat	  sX   



   
rZ  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   rT  r"   r7  r8  )r  r  r  )r   r-   rU   r   r<   r.  ra   r0  r  r/   r=   r@   )rm   r  r  r  rV  r4  rH   rN   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   rU   r   r   r  maxsizer   version_infoCPUINFO_VERSIONCPUINFO_VERSION_STRINGr   r  rW  rY  r5  r6  r:  rE  rZ  r;  rB  rA  rJ  r)  r[  )r   r   Zfriendly_maxsizeZfriendly_versionPYTHON_VERSIONrH   r   r   r
   _get_cpu_info_internalS
  sD   


rd  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  rd  r   r   r   r   r   
executable__file__r   r   r   )rg  rC   rH   r   r   r   r   r   r   r
   get_cpu_info_json
  s   


rk  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)rg  rk  r   r   )rg  rC   r   r   r
   get_cpu_info
  s   rm  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)rU  rf  
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 fileFr2   r"   zFailed to find cpu info
zPython Version: {0}r\  r0   zCpuinfo Version: {0}r^  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	  )argparsern  rg  add_argument
parse_argsr   r  r   r   r=   r  rM   r&   r   exitrd  printr   versionrb  r   r   r;   )rn  rg  parserr   rN   rH   r   r   r
   main
  s^   


 ry  __main__Fr  )<ra  r;   rb  rY   r  ri   r   r  r"  r   objectr   rU   rb   r   r   r   r   r   r   r  r  r  r   r3  r8  r>  rG  rR  rW  rn  r}  r   r  r  r  r  r  r  r  r)  r5  r6  r:  r;  rA  rB  rE  rJ  rG  rI  rW  rY  rZ  r[  rd  rk  rm  ry  rR   r   r   r   r
   <module>   s   { 

	"4_9$X    Kd`/a @
ARTiD"L 
9


