
    e                        d dl mZ d dlZd dlZd dlZd dlmZmZmZmZm	Z	m
Z
mZ g dZg dZg dZej                  dk(  Z ej"                  ej$                        dk(  Z G d	 d
ej(                        Z G d de      Zedk(  rad Z edj7                  d dD              j9                                 e       D ]'  \  ZZ edez  dj7                  d eD                     ) yy)    )print_functionN)c_uint32c_longc_ulongc_size_tc_void_pPOINTER	CFUNCTYPE)S         r            r      r   _      r   O      r   W      [      )r   r      I   r      D   r      r   r   A   r      r   r   Y   r   r   r   r   r   r   r   Q   r   r   r   )r   r      |   $   r   r#   r   r%      r#   L   r%      r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ntr   c                   ^    e Zd ZdZeD  cg c]
  }|t        f c}}} Zd Zd Zyc c}}} w )CPUID_struct)eaxebxecxedxc                 L    || j                   vrt        |      t        | |      S )N)_register_namesKeyErrorgetattr)selfitems     ;lib/python3.12/site-packages/archspec/vendor/cpuid/cpuid.py__getitem__zCPUID_struct.__getitem__L   s'    t+++4. tT""    c                 z    dj                  | j                  | j                  | j                  | j                        S )Nz.eax=0x{:x}, ebx=0x{:x}, ecx=0x{:x}, edx=0x{:x})formatr,   r-   r.   r/   r4   s    r6   __repr__zCPUID_struct.__repr__Q   s2    ?FFtxxQUQYQY[_[c[ceiememnnr8   N)__name__
__module____qualname__r1   r   _fields_r7   r<   ).0rr   s   000r6   r+   r+   H   s/    2O'67!H7H#
o 8s   (r+   c                   (    e Zd Zd ZddZddZd Zy)CPUIDc                    t        j                         dvrt        d      t        rMt        r!t        j                  d      | _        t        }n8t
        j                  j                  | _        t        }nt        rt        nt        }t        |      }t        j                  |z  | }t        rt        | j                  j                   _        t
        j                  t
        j$                  t
        j&                  t
        j&                  g| j                  j                   _        | j                  j!                  d |dd      | _        | j*                  st-        d      t        j.                  | j*                  ||       nddlm}m}m}m}m}m}	  |d	|||z  ||z  |	z  
      | _        | j<                  j?                  |       t        j@                  t
        jB                  jE                  | j<                              | _        tG        d tI        tJ              tL        tL              }
 |
| j*                        | _'        y )N)AMD64x86_64x86i686zOnly available for x86zkernel32.dlli   @   zCould not allocate RWX memoryr   )mmapMAP_PRIVATEMAP_ANONYMOUS
PROT_WRITE	PROT_READ	PROT_EXEC)flagsprot)(platformmachineSystemError
is_windowsis_64bitctypesCDLLwin_WINDOWS_64_OPCwindllkernel32_CDECL_32_OPC_POSIX_64_OPClenc_ubyter   VirtualAllocrestyper   r   argtypesaddrMemoryErrormemmoverK   rL   rM   rN   rO   rP   mmwrite	addressofc_intfrom_bufferr
   r	   r+   r   func_ptr)r4   opcsizecoderK   rL   rM   rN   rO   rP   	func_types              r6   __init__zCPUID.__init__V   s   %GG677 ";;~6%
 "==11##+-C3x%,,4DHH!!).4oovPVP^P^`f`n`n-oDHH!!*--dD&$GDI99!"ABBNN499dD1  !M1)+i7	DG GGMM$(()A)A$'')JKDIdGL$98XN	!$)),r8   c                     | j                  ||      }|j                  |j                  |j                  |j                  fS )N)r,   r.   )registers_forr,   r-   r.   r/   r4   r,   r.   structs       r6   __call__zCPUID.__call__   s6    ###5zz6::vzz6::==r8   c                 @    t               }| j                  |||       |S )zCalls cpuid with eax and ecx set as the input arguments, and returns a structure
        containing eax, ebx, ecx, and edx.
        )r+   rn   rv   s       r6   ru   zCPUID.registers_for   s      fc3'r8   c                 &   t         rqt        | j                  j                  _        t
        t        t        g| j                  j                  _        | j                  j                  | j                  dd       y | j                  j                          y )Nr   i   )rW   r   r[   VirtualFreerd   r   r   r   re   rf   ri   closer;   s    r6   __del__zCPUID.__del__   sW    +1DHH  (-5x,IDHH  )HH  Av6GGMMOr8   N)r   )r=   r>   r?   rs   rx   ru   r}    r8   r6   rD   rD   U   s    1-f>r8   rD   __main__c               #      K   t               } dD ].  } | |      \  }}}}||k  s | |      }||f |dz  }||k  r0 y w)N)r   l        r    )rD   )cpuidr,   highest_regss        r6   valid_inputsr      sU     $C$SzGQ1.SzDk!q . %s   "AAA c              #   >   K   | ]  }|j                  d         yw)r   N)ljust)rA   xs     r6   	<genexpr>r      s     E'D!1771:'Ds   )rD   ABCD%08xc              #   &   K   | ]	  }d |z    yw)r   Nr~   )rA   regs     r6   r   r      s     $BTcVc\Ts   )
__future__r   rT   osrY   r   r   r   r   r   r	   r
   r`   r\   r_   namerW   sizeofc_voidprX   	Structurer+   objectrD   r=   r   printjoinstripr,   r   r~   r8   r6   <module>r      s    &  	  T T T  WW_
6==(A-
o6## 
oFF FT z 
#((E'DE
E
K
K
MN!^	TfslCHH$BT$BBC $ r8   