o
    hI                    @   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   C/var/www/vscode/kcb/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_active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	tracebackr5   )r   r*   r"   r+   r,   r-   r5   
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 )Nr8   r1   c                 S   r6   )z			{0}
r9   r   r   r   r
   r   u   r:   z(Trace.command_output.<locals>.<listcomp>r3   )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   rF   rH   r   r
   r           z		{0}: {1}
r3   r%   )r   keysrI   rJ   r"   r+   r,   r-   changed_keysrG   new_keysr   rH   r
   rL   x   s*   

 z
Trace.keysc                 C   s(   | j sd S | j|d  | j  d S )Nr3   )r   r   r'   r(   )r   r*   r   r   r
   r'      s   
zTrace.writec                 C   s&   | j  | j | j || j|dS )N)rD   stdoutstderrrI   erris_fail)r   getvaluer   r   r   )r   rI   rR   r   r   r
   to_dict   s   zTrace.to_dictN)__name__
__module____qualname__r    r.   r0   rA   rC   rE   rL   r'   rT   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lowerr\   r]   r^   )unamer   r   r
   has_var_run_dmesg_boot   s    z!DataSource.has_var_run_dmesg_bootc                   C   ra   )Ncpufreq-infor   rc   r   r   r   r
   has_cpufreq_info   rg   zDataSource.has_cpufreq_infoc                   C   ra   )Nsestatusr   rc   r   r   r   r
   has_sestatus   rg   zDataSource.has_sestatusc                   C   ra   )Nsysctlr   rc   r   r   r   r
   
has_sysctl   rg   zDataSource.has_sysctlc                   C   ra   )Nisainfor   rc   r   r   r   r
   has_isainfo   rg   zDataSource.has_isainfoc                   C   ra   )Nkstatr   rc   r   r   r   r
   	has_kstat   rg   zDataSource.has_kstatc                  C   sD   t   dd  } d| v pd| v }|o!ttddkS )Nrh   ri   beoshaikusysinfor   )rl   rm   rn   ro   rd   re   )rp   is_beosr   r   r
   has_sysinfo   s    zDataSource.has_sysinfoc                   C   ra   )Nlscpur   rc   r   r   r   r
   	has_lscpu   rg   zDataSource.has_lscpuc                   C   ra   )Nlspropr   rc   r   r   r   r
   has_ibm_pa_features   rg   zDataSource.has_ibm_pa_featuresc                  C   s$   t g d\} }| dkot|dkS )N)wmicr\   getVersionr   )_run_and_get_stdoutrd   )
returncoderD   r   r   r
   has_wmic   s   zDataSource.has_wmicc                   C      t ddgS )Ncatr[   r   r   r   r   r
   cat_proc_cpuinfo   r`   zDataSource.cat_proc_cpuinfoc                   C   
   t dgS )Nrr   r   r   r   r   r
   cpufreq_info      
zDataSource.cpufreq_infoc                   C   r   )Nrt   z-br   r   r   r   r
   
sestatus_b   r`   zDataSource.sestatus_bc                   C   r   )Nrb   z-ar   r   r   r   r
   dmesg_a   r`   zDataSource.dmesg_ac                   C   r   )Nr   rk   r   r   r   r   r
   cat_var_run_dmesg_boot   r`   z!DataSource.cat_var_run_dmesg_bootc                   C      t g dS )N)rv   zmachdep.cpuhw.cpufrequencyr   r   r   r   r
   "sysctl_machdep_cpu_hw_cpufrequency   r`   z-DataSource.sysctl_machdep_cpu_hw_cpufrequencyc                   C   r   )Nrx   z-vbr   r   r   r   r
   
isainfo_vb   r`   zDataSource.isainfo_vbc                   C   r   )N)rz   z-mcpu_infor   r   r   r   r
   kstat_m_cpu_info   r`   zDataSource.kstat_m_cpu_infoc                   C   r   )Nr~   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   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\0ProcessorNameString)_read_windows_registry_keyrn   )processor_brandr   r   r
   winreg_processor_brand  s   
z!DataSource.winreg_processor_brandc                  C      t dd} | S )Nr   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   
FeatureSetr   feature_bitsr   r   r
   winreg_feature_bits*  r   zDataSource.winreg_feature_bitsN).rU   rV   rW   rl   architecturebitsmultiprocessing	cpu_countrm   ro   
is_windowsmachiner   rp   uname_string_raw	can_cpuidstaticmethodr_   rf   rq   rs   ru   rw   ry   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
   rX      s    



























rX   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PATHEXTr1   PATH)filterr\   environr   r=   pathsepr]   r<   accessX_OKappend)program_namepathsextspepextr   r   r
   re   0  s   

re   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" ...rO   rP   stdin)r   rO   rP   UTF-8encodingzreturn code:zstdout:)
subprocessr   r   g_tracerC   r<   rO   closecommunicatedecoderE   r   r   )commandpipe_commandr   r   p1p2stdout_output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   rC   r   _winregImportErrorwinregOpenKeyHKEY_LOCAL_MACHINEQueryValueExCloseKeyrE   r   )key_name
field_namer   rQ   rG   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_archrX   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   rG   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   rL   r   r   sort)rI   rJ   rL   rG   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   )
splitlinesro   r=   rn   rd   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'  
convert_todefault_valuer(  retvalr   r   r
   
_get_field  s   r0  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   r1   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<   rn   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 )Nr1  r8  r   r1   r#   {0}.{1}r   r   )	r=  r   lstripindexr:  ljustr=   intr>   )r>  scalehz	old_index	new_indexr)  r*  r   r   r
   _hz_short_to_full  s   



rI  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   rF  r   r1   c                 s   r3  r4  r5  r   r   r   r
   r6    r7  z'_hz_friendly_to_full.<locals>.<genexpr>r   z.0r@  )rn   ro   r<  r<   rI  r>   )	hz_stringrF  rE  r   r   r
   _hz_friendly_to_full  s"   



rO  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   r1   Hzr   r   GHzrM  MHzrB   KHzr#   z{0:.4f} {1}r8  z	0.0000 Hz)rI  r   rB  r:  r=  r;  r>   )r>  rE  r)  r*  result	dot_indexsymbolr   r   r
   _hz_short_to_friendly  s.   
(
rW  c                 C   sf   dd l }| s| S d| } ddddd}| D ]\}}||| r0d| d d	  |  S q| S )
Nr   r1  BKBMBGB)z	^[0-9]+B$z	^[0-9]+K$z	^[0-9]+M$z	^[0-9]+G$z{0} {1})rer   r  matchrn   )r  r]  formatspatternfriendly_sizer   r   r
   _to_friendly_bytes/  s   
rb  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 )Ngibi   @mibi   kib   gbmbkbgmkr   r#   r   )	ro   r  rL   valuesr<  rD  r=   rn   r>   )friendly_bytesr  r_  entryr`  
multiplierrQ   r   r   r
   _friendly_bytes_to_intC  s4   
 	
rq  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 )
NrF  r9  r   r   rL  rM  rK  r   @r#   )ro   r<  r=   rsplitr;  rn   r   )
cpu_stringrF  rE  r   r   r
   _parse_cpu_brand_stringa  s   

rv  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   rw  r   rx  rz  r   r   r
   r   |  r   z\)c                 S   s   i | ]\}}||qS r   r   r   rl  vr   r   r
   r
  }  r:   z._parse_cpu_brand_string_dx.<locals>.<dictcomp>c                    s    g | ]\}} |d  | qS )r#   r   )r   ry  endru  r   r
   r   ~  rK   )NNNNr2  c                 S   rw  r   )rn   r   r   r   r
   r     r   r#  r#   originrh   r  0x   r  famr  TFz({0})r9  )rQ  rR  rP  zCPU @ )r]  finditerzipr  r=   rd   rn   rD  rA  r   r<  rv  find)ru  r]  startsendsinsides	vendor_idr  r  r  insidepairnamer   brand
is_workingfullhz_brandrE  rF  ro  r   r~  r
   _parse_cpu_brand_string_dxw  sX   

	r  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 )r3   r   )r=   rn   r   lr   r   r
   r     s    z'_parse_dmesg_output.<locals>.<listcomp>c                 S   r   r   )r  r  r   r   r
   r     r   r   c                 S   s   g | ]}|d uqS r,  r   r   r   r   r
   r     r   z	  Origin=r3   c                 S   s   g | ]	}|  d qS =)rn   r=   r   r   r   r
   r         c                 S   s(   g | ]}|d     |d   iqS )r   r#   )rn   ro   r   r   r   r
   r     s   ( r  rh   r  r  r  r  r  )z  Features=z  Features2=z  AMD Features=z  AMD Features2=<>r2  r9  rM  )r   r  r  r  r  r  r  r  r  r   c                 S      i | ]	\}}|r||qS r   r   r{  r   r   r
   r
    r  z'_parse_dmesg_output.<locals>.<dictcomp>)r=   sumr  rn   r  rL   rm  rD  rA  r   ro   r   rv  r   rW  rI  r  r>   r   rA   )rD   linescpu_stringsbest_stringhighest_countru  r  r   rE  r   r  r  r  r  fieldsfieldr  r   
flag_linescategoryr  r-   flagr  rI   rQ   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   rJ  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$PPC_32z^powerpc$|^ppc64$|^ppc64le$r   z^sparc32$|^sparc$SPARC_32z^sparc64$|^sun4u$|^sun4v$SPARC_64z^s390x$r   mipsr   mips64r   z^riscv$|^riscv32$|^riscv32be$r   z^riscv64$|^riscv64be$r   )r]  ro   r^  )r   r]  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:	enforcingTallow_execheaponallow_execmemzcan_selinux_exec_heap:zcan_selinux_exec_memory:)
rX   ru   rA   r   r$  rn   ro   
startswithr<  rE   )tracer   rD   r-   can_selinux_exec_heap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\  r9  )typer   r  )rI   acceptable_valuesfiltered_inforG   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  prot)%bytesr<   r  ctypesc_size_trd   r  rX   r   c_ulongwindllkernel32VirtualAllocc_void_pr  r  r>   	CFUNCTYPE_memmove_addrVirtualProtectbyrefr  GetCurrentProcessFlushInstructionCacher  r  r  r  r  r  r  r'   	addressofc_intfrom_bufferr  r  )r   r  r  
MEM_COMMITPAGE_READWRITEpfnVirtualAllocmemmovePAGE_EXECUTEold_protectpfnVirtualProtectrespfnGetCurrentProcessr  r  r  r  r  r  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   )rX   r   r  r  r  r  VirtualFreer  r  r  r  r   r  r  r  )r   MEM_RELEASEr   r   r
   free  s   
"

zASM.free)rU   rV   rW   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        r1   )r  r   chrr<   )r   ebxecxedxr  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     rB   r     r  )r  )rM  r  )r  r  r  r  r  )	r   eaxstepping_idr  	family_idr  extended_model_id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$   pserB   tscr  msrrZ   paerM  mce   cx8r  apicr   sep   mtrrr  pge   mca   cmovr  patr  pse36   pn   clflush   dts   acpi   mmx   fxsrr  sse   sse2   ss   ht   tm   ia64   pbe   pni	pclmulqdqdtes64monitords_cplvmxsmxesttm2ssse3cid
   fmacx16xtprpdcmpciddcasse4_1sse4_2r  x2apicmovbe)	popcnttscdeadlineaesxsaveosxsaveavxf16crdrnd
hypervisorc                 S      g | ]\}}|r|qS r   r   r{  r   r   r
   r         z#CPUID.get_flags.<locals>.<listcomp>s   1s
      s
      sgxbmi1hleavx2smepbmi2ermsinvpcidrtmpqmmpxpqeavx512favx512dqrdseedadxsmap
avx512ifmapcommit
clflushoptclwbintel_ptavx512pfavx512eravx512cdshaavx512bwavx512vlprefetchwt1
avx512vbmiumippkuospkeavx512vbmi2)gfnivaes
vpclmulqdq
avx512vnniavx512bitalgavx512vpopcntdqrdpidsgx_lcc                 S   r`  r   r   r{  r   r   r
   r     ra  l       s
     s
     syscallmpnxmmxextfxsr_optpdpe1gprdtscplm3dnowext3dnowlahf_lm
cmp_legacysvmextapic
cr8_legacyabmsse4amisalignsse3dnowprefetchosvwibsxopskinitwdtlwpfma4tce
nodeid_msrtbmtopoextperfctr_core
perfctr_nbdbx)perftscpci_l2ic                 S   r`  r   r   r{  r   r   r
   r   V  ra  )r  r  r  r   )r   r  r  r  r  r  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 )Nr1   l       )s     s     s     s   r  r  r  r  r   )r  r   rn   )r   r  r   instructions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   r  l        )r  r  r  r   )highlowr/  old_funcr   r
   new_func  s
   

z&CPUID.get_ticks_func.<locals>.new_func64bitr   )	   Hr  r  r  r  s    r  s   	r  )rX   r   r  POINTERc_uintr  r  c_uint64)r   r/  r  r  get_ticks_x86_32r  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  ticks_fnry  r}  r>  r   r   r
   
get_raw_hz  s   zCPUID.get_raw_hzr,  )rU   rV   rW   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 ...r1   r  r  r  r  r  r  r  )r   r  r  r  r  r  r   r  r  r  r  r  r  r  r  r4   c                 S   r6   r7   r9   r   r   r   r
   r   8  r:   z3_get_cpu_info_from_cpuid_actual.<locals>.<listcomp>r3   NF)"r   r   r   r   sysrO   r   rP   r   rX   r   rA   rT   r  r  r  r  r  r  r  r   rv  r  rW  rI  r  r  r0   r>   r?   r5   r<   r=   r   )r   r  rI   r   r   cpuidr  r  r   r   r  rE  rQ   r5   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  rO   rP   r  putr  )queueorig_stdoutorig_stderrrD   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  )indentrD   rO   z{0}
rP   rR   z6Failed to get is_fail from CPUID process. Skipping ...rQ   z
Failed ...rI   z:Failed to get return info from CPUID process. Skipping ...)r   r.   r   r  r  rX   r   rA   r   r   CAN_CALL_CPUID_IN_SUBPROCESSr  ry  is_aliver<   exitcodeemptyr  r   pprintPrettyPrinterr'   r  rO   r   r(   rP   r  r0   r>   )r  r  r   r   r  r   rD   r  ppr  r  rQ   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 ...FNr1   r  z	vendor idvendorTz
model namer   	processoruarchz
cache sizer\  r  r  z
cpu familyHardwarer  FeaturesASEs implementedrL  zcache{0}c                 S   s   g | ]}| d qS r  )r=   )r   ro  r   r   r
   r     r:   z3_get_cpu_info_from_proc_cpuinfo.<locals>.<listcomp>r   level3r  zcpu MHzz	cpu speedclockzcpu MHz dynamiczcpu MHz staticrL  r  )r  r  r  r  r   r  r  r  r9  rM  r@  r  r  r  r   r  r  r  )r   r.   rX   r_   rA   r   r0  rD  r=   r   ranger   r  r>   ro   r;  rn   r   rv  rq  rI  rW  r  r0   )r   rD   r  r   
cache_sizer  r  r  hardwarer  ir  r   r   r  rE  rI   rQ   r   r   r
   _get_cpu_info_from_proc_cpuinfo  s   




r  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 ...rr  z)Failed to find cpufreq-info. Skipping ...r   z(Failed to run cpufreq-info. Skipping ...zcurrent CPU frequency isr#   r3   rP  r\  r$   rL  rM  rK  r   )r  r  r  r   N)r   r.   rX   rs   rA   r   r=   r  rn   ro   r<  r;  r   rW  rI  r  r0   r>   )r  rE  r   rD   r  rI   rQ   r   r   r
   _get_cpu_info_from_cpufreq_info  sB   






r  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 MHzrM  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  r  )r   r.   rX   r   rA   r   r0  r   rW  rI  r%  rD  r=   rn   rq  r   r  r0   r>   )r   rD   rI   new_hzrE  r  r  r  r  r  r  r  r  r  r  rQ   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   rX   r   rA   rf   r   r  r0   )r   r   r   rD   rI   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 )0123456789abcfed)r  r   sr   r   r
   r     s    z6_get_cpu_info_from_ibm_pa_features.<locals>.<listcomp>r1   r  r  mmur  slbr$   r  rB   dabrrZ   nerM  wtrr  mcrdsisrr   lprL  rir  dabrxr  sprg3r!  rislbr#  r  r  vpmzdss_2.05r'  r+  r-  r/  r1  r  r4  )darpprzdss_2.02zdss_2.06lsd_in_dscrugr_in_dscrzsso_2.06lecfarebzlsq_2.07zdss_2.07c                 S   r`  r   r   r{  r   r   r
   r   -  ra  r  )r   r.   rX   r   rA   r   r=   ro   r<   rD  r  r  r   r  r0   r>   )r   rD   r   r)  r*  r  rI   rQ   r   r   r
   "_get_cpu_info_from_ibm_pa_features  s   










	









	
S
r  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.   rX   rq   rA   r   r  r0   )r   rD   rI   r   r   r
   )_get_cpu_info_from_cat_var_run_dmesg_boot;  s   


r  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.familyr1   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.   rX   rw   rA   r   r0  rD  ro   r=   extendr   rv  r   rW  rI  r  r0   r>   )r   rD   r  r   r  r  r  r  r  r  rE  r   rI   rQ   r   r   r
   _get_cpu_info_from_sysctlS  sT   




r  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)rI   r   r   r
   _get_cpu_info_from_sysinfo  s   r  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 )r  z,Tying to get info from sysinfo version 1 ...$Failed to find sysinfo. Skipping ...Nr   *Failed to run "sysinfo -cpu". Skipping ...r1   	CPU #0: "r#   "
z, stepping r2  z, model z	, family r3   		r  )r   r.   rX   r   rA   r   r=   rn   rD  r  ro   r   r   rv  rW  rI  rb  r  r0   r>   )r   rD   r  r   r  r  r  r  r  r-   r  r  rE  r   rI   rQ   r   r   r
   r    sX   


   

r  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 )r  z,Tying to get info from sysinfo version 2 ...r  Nr   r   r1   r!  r#   r"  z
Signature:r3   z	stepping r2  zmodel zfamily c                 S   s\   g }|  ddd  D ] }|ds|ds |S |   dD ]}|| q#q|S )Nr3   r#   z                r#  r   )r=   r  rn   ro   r   )rD   r/  r-   ro  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 rL  rK  rM  r   r  )r   r.   rX   r   rA   r   r=   rn   rD  r   ro   r;  r   r<  rW  rI  rb  r  r0   r>   )r   rD   r  r   r  	signaturer  r  r  r$  r  r  raw_hzr  r   rE  rI   rQ   r   r   r
   r    sj   


   


r  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 ...r3   c                 S   s"   g | ]}d |v r|  d qS r  )r;  r=   r  r   r   r
   r   D	  s   " z+_get_cpu_info_from_wmic.<locals>.<listcomp>c                 S   r  r   r   r{  r   r   r
   r
  E	  r  z+_get_cpu_info_from_wmic.<locals>.<dictcomp>NameCurrentClockSpeedrM  L2CacheSizerf  L3CacheSize)r1   r1   r1   DescriptionCaptionr   Familyr#   r  r  Manufacturer)r   r  r  r  r  r   r  r  r  r  r  )r   r.   rX   r   r   rA   r   r=   r   rv  r   rD  rB  rd   rW  rI  r  r0   r>   )r   rD   r   r   r  scale_advertisedr   scale_actualr  r  r  r  r  descriptionentriesr  rI   rQ   r   r   r
   _get_cpu_info_from_wmic0	  sp   













r3  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 ...r9  rM  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  rB   r  r  r  rZ   r  r  r  r  r  r  r   sepamdrL  r  r  r  r  r   r!  r"  r#  r$  r  r%  r  r'  r)  r+  r-  r/  r1  r  r4  r6  r8  r<  r>  r@  )r&  serialr*  r,  r.  r0  r2  r3  r5  r7  r;  r=  r  c                 S   r`  r   r   r{  r   r   r
   r   	  ra  z/_get_cpu_info_from_registry.<locals>.<listcomp>)r   r  r  r  r  r   r  N)r   r.   rX   r   rA   r   rn   r   r   r   r   r   rv  r   r  r   rW  rI  r  r0   r>   )r   r  r   r   r   r   r  rE  r  r  rI   rQ   r   r   r
   _get_cpu_info_from_registry	  s   

	
$
r6  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#   r3   z	brand z
	stepping z	model z	family r\  rM  z	clock_MHz z	current_clock_Hz )
r   r  r  r  r  r   r  r  r  r  )r   r.   rX   ry   r{   rA   r   r   r=   rn   rD  ro   r   r   rW  rI  r  r0   r>   )r   flag_outputrz   r  r   r  r  r  r  rE  r  r   rI   rQ   r   r   r
   _get_cpu_info_from_kstat	  sX   



   
r8  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 ...r2  r   )NNNr   r-  r#   r  r  )r  r  r  )r   r.   rX   r   r=   rB  rd   rD  r  r0   r>   rA   )rp   r  r  r  r2  r  rI   rQ   r   r   r
   !_get_cpu_info_from_platform_uname1
  s4   






r9  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   rX   r   r   r  maxsizer   version_infoCPUINFO_VERSIONCPUINFO_VERSION_STRINGr   r"  r3  r6  r  r  r  r  r8  r  r  r  r  r  r9  )r   r   friendly_maxsizefriendly_versionPYTHON_VERSIONrI   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frozenFr1  r   --jsonr   z{}r   r   )jsongetattrr  rD  r   r   r   r   r   
executable__file__r   r   r   )rG  rD   rI   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  rD   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)r1  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 fileFr3   r#   zFailed to find cpu info
zPython Version: {0}r:  r1   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  rP   r'   r   exitrD  printr   versionr@  r   r   r<   )rN  rG  parserr  rQ   rI   r   r   r
   main
  s^   


 rY  __main__Fr,  )<r?  r<   r@  r\   r  rl   r   r  r  r   objectr   rX   re   r   r   r   r  r  r  r"  r+  r0  r   rI  rO  rW  rb  rq  rv  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r3  r6  r8  r9  rD  rK  rM  rY  rU   r   r   r   r
   <module>   s   { 

	"4_9$X    Kd`/a @
ARTiD"L 
9


