
    W'Fg>                        S SK Jr  S SKJrJrJr  S SKJr   " S S\5      r " S S\5      r	 " S S	\5      r
 " S
 S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)   )log)
XMLBuilderXMLPropertyXMLChildProperty)xmlutilc                   h    \ rS rSrSrSr/ SQr\" SSS9r\" SSS9r	\" S	SS9r
\" S
SS9rS rS rSrg)_CPUTopology   z;
Class for generating XML for <cpu> child node <topology>.
topologysocketsdiescoresthreadsz
./@socketsTis_intz./@diesz./@coresz
./@threadsc           
         U R                   (       d  XR                  5       -  U l         U R                  (       d  XR                  5       -  U l        U R                  (       d  SU l        U R                  (       d  XR                  5       -  U l        U R                  5       U:w  aT  [        [        S5      U R                  U R                  U R                   U R                  U R                  5       US.-  5      eg )N   zTotal CPUs implied by topology (sockets=%(sockets)d * dies=%(dies)d * cores=%(cores)d * threads=%(threads)d == %(total)d) does not match vCPU count %(vcpus)d)r   r   r   r   totalvcpus)r   total_vcpusr   r   r   
ValueError_)selfr   s     ./usr/share/virt-manager/virtinst/domain/cpu.pyset_defaults_from_vcpus$_CPUTopology.set_defaults_from_vcpus   s     zz"2"2"44DJ|| $4$4$66DLyyDI|| $4$4$66DL&Q  E F /3ll+/99,0JJ.2ll,0,<,<,>,1I!	! 	" 	" 	    c                     U R                   =(       d    SU R                  =(       d    S-  U R                  =(       d    S-  U R                  =(       d    S-  $ )z1
Determine the CPU count represented by topology
r   r   r   s    r   r   _CPUTopology.total_vcpusE   sH     "a!q" "$ 	%r   )r   r   r   r   N)__name__
__module____qualname____firstlineno____doc__XML_NAME_XML_PROP_ORDERr   r   r   r   r   r   r   __static_attributes__ r   r   r	   r	      sN     H=O,t4Gy.D
40E,t4G$L%r   r	   c                   B    \ rS rSrSrSrSS/r\" SSS9r\" S	5      r	S
r
g)	_CPUCacheS   z8
Class for generating XML for <cpu> child node <cache>.
cachelevelmode./@levelTr   ./@moder*   N)r"   r#   r$   r%   r&   r'   r(   r   r/   r0   r)   r*   r   r   r,   r,   S   s.     H'O
40Ey!Dr   r,   c                   D    \ rS rSrSrSrSS/r\" S5      r\" S5      r	Sr
g	)
_CPUFeature^   z;
Class for generating XML for <cpu> child nodes <feature>.
featurepolicynamez./@name	./@policyr*   N)r"   r#   r$   r%   r&   r'   r(   r   r8   r7   r)   r*   r   r   r4   r4   ^   s,     H(Oy!D%Fr   r4   c                   B    \ rS rSrSrSrSS/r\" S5      r\" SSS	9r	S
r
g)_CPUMaxphysaddri   z>
Class for generating XML for <cpu> child node <maxphysaddr>.
maxphysaddrr0   bitsr2   z./@bitsTr   r*   N)r"   r#   r$   r%   r&   r'   r(   r   r0   r>   r)   r*   r   r   r;   r;   i   s.     Hv&Oy!Dy.Dr   r;   c                   @    \ rS rSrSrSrSS/r\" SSS9r\" S	SS9r	S
r
g)_NUMACellSiblingx   z
Class for generating XML for <cpu><numa><cell><distances> child nodes
<sibling>, describing the distances to other NUMA cells.
siblingidvalue./@idTr   ./@valuer*   N)r"   r#   r$   r%   r&   r'   r(   r   rC   rD   r)   r*   r   r   r@   r@   x   s/     HWoO	WT	*B
40Er   r@   c                       \ rS rSrSrSr/ SQr\" SSS9r\" S5      r	\" S	5      r
\" S
SS9r\" S5      r\" SSS9r\" S5      rSrg)_NUMACellCache   zg
Class for generating XML for <cpu><numa><cell> child nodes <cache>,
describing caches for NUMA cells.
r.   )r/   associativityr7   
size_value	size_unit
line_value	line_unitr1   Tr   z./@associativityr9   z./size/@valuez./size/@unitz./line/@valuez./line/@unitr*   N)r"   r#   r$   r%   r&   r'   r(   r   r/   rJ   r7   rK   rL   rM   rN   r)   r*   r   r   rH   rH      se     HBO 
40E 23M%F_T:JN+I_T:JN+Ir   rH   c                       \ rS rSrSrSr/ SQr\" SSS9r\" S5      r	\" S	SS9r
\" S
5      r\" S5      r\" SSS9r\" \SS9r\" \5      rSrg)	_NUMACell   zY
Class for generating XML for <cpu><numa> child nodes <cell> XML, describing
NUMA cells.
cell)rC   cpusmemoryunit	memAccessdiscardsiblingscachesrE   Tr   z./@cpusz	./@memory./@unitz./@memAccessz
./@discard)is_yesnoz./distancesrelative_xpathr*   N)r"   r#   r$   r%   r&   r'   r(   r   rC   rS   rT   rU   rV   rW   r   r@   rX   rH   rY   r)   r*   r   r   rP   rP      sp     H"O 
WT	*By!DT2Fy!DN+I,6G 0OHn-Fr   rP   c                   |    \ rS rSrSrSr/ SQr\" SSS9r\" SSS9r	\" S	SS9r
\" S
5      r\" SSS9r\" S5      rSrg)_NUMALatency   z
Class for generating XML for <cpu><numa><cell><interconnects> child nodes
<latency>, describing latency between two NUMA memory nodes.
latency	initiatortargetr.   typerD   rU   ./@initiatorTr   	./@target./@cache./@typerF   rZ   r*   Nr"   r#   r$   r%   r&   r'   r(   r   rc   rd   r.   re   rD   rU   r)   r*   r   r   r_   r_      sY     HOO N48IT2F
40Ey!D
40Ey!Dr   r_   c                   |    \ rS rSrSrSr/ SQr\" SSS9r\" SSS9r	\" S	SS9r
\" S
5      r\" SSS9r\" S5      rSrg)_NUMABandwidth   z
Class for generating XML for <cpu><numa><cell><interconnects> child nodes
<bandwidth>, describing bandwidth between two NUMA memory nodes.
	bandwidthrb   rf   Tr   rg   rh   ri   rF   rZ   r*   Nrj   r*   r   r   rl   rl      sY     HOO N48IT2F
40Ey!D
40Ey!Dr   rl   c                      \ rS rSrSrSr/ SQrSr\" S5      r	\" S5      r
\" S5      r\" S	SS
9r\" S5      r\" S5      r\" S5      r\" S5      r\" \SS9r\" \SS9r\" \5      r\" \SS9r\" \SS9r\" \SS9r\" \SS9rSr Sr!Sr"Sr#Sr$Sr%Sr&Sr'\!\"\#\$\%\&\'/r(S r)S r*S r+S r,S r-S  r.S*S! jr/S" r0S# r1S+S$ jr2S% r3S& r4S' r5S(r6g)),	DomainCpu   z 
Class for generating <cpu> XML
cpu)r0   matchcheck
migratablemodelmodel_fallbackmodel_vendor_idvendorr   r.   featurescells	latencies
bandwidthsr=   Tr2   z./@matchz./@checkz./@migratable)is_onoffz./modelz./model/@fallbackz./model/@vendor_idz./vendor)	is_singlez./numar\   z./numa/interconnectsFzhost-model-onlyz
hv-defaultz	host-copyz
host-modelzhost-passthroughcleardefaultc                    UR                  5       nUR                  5       (       a  U R                  $ [        R                  " S5        UR                  5       (       a  U R                  $ [        R                  " S5        U R                  $ )Nz&Safe host-passthrough is not availablez Safe host-model is not available)lookup_domcapssupports_safe_host_passthroughSPECIAL_MODE_HOST_PASSTHROUGHr   debugsupports_safe_host_modelSPECIAL_MODE_HOST_MODELSPECIAL_MODE_HOST_MODEL_ONLY)r   guestdomcapss      r   _get_app_default_modeDomainCpu._get_app_default_mode  sn     &&(1133555		:;++--///		45000r   c                    X R                   :X  a(  U R                  U5      n[        R                  " SU5        X R                  :X  d  X R
                  :X  aO  S U l        S U l        S U l        S U l	        S U l
        U R                   H  nU R                  U5        M     X l        GO#X R                  :X  d  X R                  :X  a  U R!                  5         OX R"                  :X  d  X R$                  :X  a  X R$                  :X  a!  [        R&                  " SX R"                  5        U R(                  R*                  R,                  R.                  R                  (       aS  U R!                  5         U R1                  XR(                  R*                  R,                  R.                  R                  5        O[2        R4                  " SU-  5      eSU l        g )NzUsing default cpu mode=%sz.CPU mode=%s no longer supported, using mode=%szunknown special cpu mode '%s'T)SPECIAL_MODE_APP_DEFAULTr   r   r   r   r   rv   ry   rw   ru   rt   rz   remove_childr0   SPECIAL_MODE_HV_DEFAULTSPECIAL_MODE_CLEARr   r   SPECIAL_MODE_HOST_COPYwarningconncapshostrr   	set_modelr   DevErrorspecial_mode_was_set)r   r   valfs       r   set_special_modeDomainCpu.set_special_mode$  sT   ///,,U3CII137///555DJDK"&D"DODJ]]!!!$ #I111,,,JJL666000111L>>@yy~~""&&,,

uiinn&9&9&=&=&C&CD""#BS#HII$(!r   c                     UR                  5       nUR                  5        HF  nSnU R                   H  nUR                  U:X  d  M  Sn  O   U(       a  M5  U R	                  U5        MH     g )NFT)r   get_cpu_security_featuresrz   r8   add_feature)r   r   r   r6   existsr   s         r   _add_security_features DomainCpu._add_security_featuresH  s_    &&(88:GF]]66W$!F # 6  ) ;r   c                    UR                  5       nUR                  5       n[        U5      S:X  a  SU l        gU R                   Vs/ s H   oDR
                  S:X  d  M  UR                  PM"     nnU R                  (       ab  U R                  R                  S5      (       a  UR                  S5        U R                  R                  S5      (       a  UR                  S5        [        U5      [        U5      :*  U l        gs  snf )	za
Since 'secure' property is not exported into the domain XML
we might need to refresh its state.
    FNrequireIBRSz	spec-ctrlIBPBibpb)r   r   lensecurerz   r7   r8   rv   endswithappendset)r   r   r   rz   r   guestFeaturess         r   check_security_features!DomainCpu.check_security_featuresS  s    
 &&(446x=ADK)-PA((i:OP::zz""6**$$[1zz""6**$$V,(ms='99 Qs   C?C?c                     UR                  5       nUR                  5        HL  nU R                   H9  nUR                  U:X  d  M  UR                  S:X  d  M'  U R                  U5          MJ     MN     g )Nr   )r   r   rz   r8   r7   r   )r   r   r   r6   r   s        r   _remove_security_features#DomainCpu._remove_security_featuresg  sY    &&(88:G]]66W$Y)>%%a( # ;r   c                     [         R                  " SU5        S U l        U(       aS  SU l        U R                  (       d  SU l        U R
                  (       a  U R                  U5        OU R                  U5        X l        g )Nzsetting cpu model %scustomexact)	r   r   ru   r0   rs   r   r   r   rv   )r   r   r   s      r   r   DomainCpu.set_modelt  sX    		(#. DI::$
{{++E2..u5
r   c                 P    U R                   R                  5       nXl        X#l        g N)rz   add_newr8   r7   )r   r8   r7   r6   s       r   r   DomainCpu.add_feature  s    --'')r   c                 6    U R                   R                  5       $ )zM
Determine the CPU count represented by topology, or 1 if
no topology is set
)r   r   r    s    r   vcpus_from_topologyDomainCpu.vcpus_from_topology  s    
 }}((**r   c                 H    [        U R                  R                  5       5      $ )z)
Return True if any topology info is set
)boolr   get_xmlr    s    r   has_topologyDomainCpu.has_topology  s     DMM))+,,r   c                 t    U R                  5       (       d  U(       d  gU R                  R                  U5        g)z
Fill in unset topology values, using the passed vcpus count.
If @create is False, this will not set topology from scratch,
just fill in missing topology values.
If @create is True, this will create topology from scratch.
N)r   r   r   )r   r   creates      r   set_topology_defaultsDomainCpu.set_topology_defaults  s*       ""6--e4r   c                 D   U R                   (       d  g UR                  5       nUR                  R                  S5      nU(       d  g UR	                  U R                   5      nU(       a  UR
                  S:w  a  g [        R                  " SU R                   5        S U l         g )Nr   nozaHost capabilities CPU '%s' is not supported according to domain capabilities. Unsetting CPU model)rv   r   rr   get_mode	get_modelusabler   r   )r   r   r   domcaps_mode	cpu_models        r   !_validate_default_host_model_only+DomainCpu._validate_default_host_model_only  s     zz&&({{++H5 **4::6	))T1		 DJJ	 
r   c                    UR                   R                  U R                  R                  R                  R
                  R                  :w  a  g UR                  nU R                  X5        X R                  :X  a  U R                  U5        g g r   )
osarchr   r   r   rr   x86_cpu_defaultr   r   r   )r   r   r0   s      r   _set_cpu_x86_kvm_default"DomainCpu._set_cpu_x86_kvm_default  sg    88==DIINN//33888$$e*4442259 5r   c                    U R                   R                  5       (       d   U R                   R                  5       (       d  g U R                  (       a  g U R                  (       d  U R
                  (       a  g UR                  R                  5       (       a"  UR                  S:X  a  U R                  U l        g UR                  R                  5       (       a2  UR                  R                  5       (       a  U R                  US5        g UR                  R                  5       (       a#  UR                  S:X  a  U R                  U5        g g g )Nkvmz
cortex-a57)r   is_testis_qemur   rv   r0   r   is_arm_machvirtre   r   is_arm64r   is_x86r   )r   r   s     r   set_defaultsDomainCpu.set_defaults  s    yy  ""499+<+<+>+>$$::88##%%%***=::DIXX  UXX%=%=%?%?NN5,/XX__5::#6))%0 $7r   )	rt   rs   ru   r0   rv   rw   r   r   ry   N)r   )F)7r"   r#   r$   r%   r&   r'   r(   r   r   r0   rs   rt   ru   rv   rw   rx   ry   r   r	   r   r,   r.   r4   rz   rP   r{   r_   r|   rl   r}   r;   r=   r   r   r   r   r   r   r   r   SPECIAL_MODESr   r   r   r   r   r   r   r   r   r   r   r   r   r)   r*   r   r   rp   rp      sV    H?O Fy!D
#E
#E_t<J	"E !45N!"67O$F=HY$7E,H Yx@E >TUI!.AWXJ"?dCK !#4 *(*$6! (13J+-D24F-/M
1)H	*:( 
+-	5 *:1r   rp   N)loggerr   
xmlbuilderr   r   r    r   r	   r,   r4   r;   r@   rH   rP   r_   rl   rp   r*   r   r   <module>r      s     B B ;%: ;%D"
 "&* &/j /	1z 	1,Z ,&.
 .0": "$"Z "0y1
 y1r   