o
    ebG=                     @   s   d dl mZ d dlmZmZmZ d dlmZ G dd deZG dd deZ	G dd	 d	eZ
G d
d deZG dd deZG dd deZG dd deZG dd deZG dd deZdS )   )log)
XMLBuilderXMLPropertyXMLChildProperty)xmlutilc                   @   s\   e Zd ZdZdZg dZedddZedddZedddZ	ed	ddZ
d
d Zdd ZdS )_CPUTopologyzC
    Class for generating XML for <cpu> child node <topology>.
    topologysocketsdiescoresthreadsz
./@socketsTis_intz./@diesz./@coresz
./@threadsc              	   C   s   | j s
||   | _ | js||   | _| jsd| _| js$||   | _|  |kr?ttd| j| j| j | j|  |d d S )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    r   ./usr/share/virt-manager/virtinst/domain/cpu.pyset_defaults_from_vcpus   s&   z$_CPUTopology.set_defaults_from_vcpusc                 C   s(   | j pd| jpd | jpd | jpd S )zA
        Determine the CPU count represented by topology
        r   r	   r   r   r   r   r   E   s   z_CPUTopology.total_vcpusN)__name__
__module____qualname____doc__XML_NAME_XML_PROP_ORDERr   r
   r   r   r   r   r   r   r   r   r   r      s    &r   c                   @   s0   e Zd ZdZdZddgZedddZedZd	S )
	_CPUCachez@
    Class for generating XML for <cpu> child node <cache>.
    cachelevelmode./@levelTr   ./@modeN)	r   r   r   r   r   r    r   r#   r$   r   r   r   r   r!   S   s    r!   c                   @   s,   e Zd ZdZdZddgZedZedZdS )_CPUFeaturezC
    Class for generating XML for <cpu> child nodes <feature>.
    featurepolicynamez./@name	./@policyN)	r   r   r   r   r   r    r   r*   r)   r   r   r   r   r'   ^   s    r'   c                   @   s4   e Zd ZdZdZddgZedddZedddZd	S )
_NUMACellSiblingz
    Class for generating XML for <cpu><numa><cell><distances> child nodes
    <sibling>, describing the distances to other NUMA cells.
    siblingidvalue./@idTr   ./@valueN)	r   r   r   r   r   r    r   r.   r/   r   r   r   r   r,   m   s    r,   c                   @   s`   e Zd ZdZdZg dZedddZedZedZ	ed	ddZ
ed
ZedddZedZdS )_NUMACellCachezs
    Class for generating XML for <cpu><numa><cell> child nodes <cache>,
    describing caches for NUMA cells.
    r"   )r#   associativityr)   
size_value	size_unit
line_value	line_unitr%   Tr   z./@associativityr+   z./size/@valuez./size/@unitz./line/@valuez./line/@unitN)r   r   r   r   r   r    r   r#   r3   r)   r4   r5   r6   r7   r   r   r   r   r2   y   s    r2   c                   @   sl   e Zd ZdZdZg dZedddZedZedddZ	ed	Z
ed
ZedddZeeddZeeZdS )	_NUMACellze
    Class for generating XML for <cpu><numa> child nodes <cell> XML, describing
    NUMA cells.
    cell)r.   cpusmemoryunit	memAccessdiscardsiblingscachesr0   Tr   z./@cpusz	./@memory./@unitz./@memAccessz
./@discard)is_yesnoz./distancesrelative_xpathN)r   r   r   r   r   r    r   r.   r:   r;   r<   r=   r>   r   r,   r?   r2   r@   r   r   r   r   r8      s    r8   c                   @   \   e Zd ZdZdZg dZedddZedddZedddZ	ed	Z
ed
ddZedZdS )_NUMALatencyz
    Class for generating XML for <cpu><numa><cell><interconnects> child nodes
    <latency>, describing latency between two NUMA memory nodes.
    latency	initiatortargetr"   typer/   r<   ./@initiatorTr   	./@target./@cache./@typer1   rA   Nr   r   r   r   r   r    r   rI   rJ   r"   rK   r/   r<   r   r   r   r   rF      s    rF   c                   @   rE   )_NUMABandwidthz
    Class for generating XML for <cpu><numa><cell><interconnects> child nodes
    <bandwidth>, describing bandwidth between two NUMA memory nodes.
    	bandwidthrH   rL   Tr   rM   rN   rO   r1   rA   NrP   r   r   r   r   rQ      s    rQ   c                   @   sF  e Zd ZdZdZg dZdZedZedZ	edZ
eddd	Zed
ZedZedZedZeeddZeeddZeeZeeddZeeddZeeddZdZdZdZdZ dZ!dZ"dZ#dZ$eee e!e"e#e$gZ%dd Z&dd Z'dd Z(d d! Z)d"d# Z*d$d% Z+d6d'd(Z,d)d* Z-d+d, Z.d7d-d.Z/d/d0 Z0d1d2 Z1d3d4 Z2d5S )8	DomainCpuz(
    Class for generating <cpu> XML
    cpu)r$   matchcheck
migratablemodelmodel_fallbackmodel_vendor_idvendorr   r"   featurescells	latencies
bandwidthsTr&   z./@matchz./@checkz./@migratable)is_onoffz./modelz./model/@fallbackz./model/@vendor_idz./vendor)	is_singlez./numarC   z./numa/interconnectsFzhost-model-onlyz
hv-defaultz	host-copyz
host-modelzhost-passthroughcleardefaultc                 C   s>   |  }| r| jS td | r| jS td | jS )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domcapsr   r   r   _get_app_default_mode  s   

zDomainCpu._get_app_default_modec                 C   s  || j kr| |}td| || jks|| jkr8d | _d | _d | _d | _	d | _
| jD ]}| | q,|| _nD|| jksB|| jkrG|   n5|| jksQ|| jkru|| jkr^td|| j | jjjjjrt|   | || jjjjj ntd| d| _d S )NzUsing default cpu mode=%sz.CPU mode=%s no longer supported, using mode=%szunknown special cpu mode '%s'T)SPECIAL_MODE_APP_DEFAULTrm   r   rg   ri   rf   rX   r[   rY   rW   rV   r\   remove_childr$   SPECIAL_MODE_HV_DEFAULTSPECIAL_MODE_CLEARrb   rj   SPECIAL_MODE_HOST_COPYwarningconncapshostrT   	set_modelr   DevErrorspecial_mode_was_set)r   rk   valfr   r   r   set_special_mode  s8   











zDomainCpu.set_special_modec                 C   sJ   |  }| D ]}d}| jD ]}|j|krd} nq|s"| | qd S )NFT)rd   get_cpu_security_featuresr\   r*   add_feature)r   rk   rl   r(   existsr{   r   r   r   _add_security_features;  s   


z DomainCpu._add_security_featuresc                 C   s~   |  }| }t|dkrd| _dS dd | jD }| jr4| jdr)|d | jdr4|d	 t|t|k| _dS )
zy
        Since 'secure' property is not exported into the domain XML
        we might need to refresh its state.
            FNc                 S   s   g | ]
}|j d kr|jqS require)r)   r*   ).0r{   r   r   r   
<listcomp>Q  s    z5DomainCpu.check_security_features.<locals>.<listcomp>IBRSz	spec-ctrlIBPBibpb)	rd   r}   lensecurer\   rX   endswithappendset)r   rk   rl   r\   guestFeaturesr   r   r   check_security_featuresF  s   

z!DomainCpu.check_security_featuresc                 C   sH   |  }| D ]}| jD ]}|j|kr |jdkr | |  nqqd S )Nr   )rd   r}   r\   r*   r)   ro   )r   rk   rl   r(   r{   r   r   r   _remove_security_featuresZ  s   

z#DomainCpu._remove_security_featuresc                 C   sH   t d| |rd| _| jsd| _| jr| | n| | || _d S )Nzsetting cpu model %scustomexact)r   rg   r$   rU   r   r   r   rX   )r   rk   rz   r   r   r   rw   g  s   

zDomainCpu.set_modelr   c                 C   s   | j  }||_||_d S N)r\   add_newr*   r)   )r   r*   r)   r(   r   r   r   r~   s  s   

zDomainCpu.add_featurec                 C   s
   | j  S )ze
        Determine the CPU count represented by topology, or 1 if
        no topology is set
        )r   r   r   r   r   r   vcpus_from_topologyx  s   
zDomainCpu.vcpus_from_topologyc                 C   s   t | j S )z9
        Return True if any topology info is set
        )boolr   get_xmlr   r   r   r   has_topology  s   zDomainCpu.has_topologyc                 C   s    |   s|sdS | j| dS )a  
        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   creater   r   r   set_topology_defaults  s   zDomainCpu.set_topology_defaultsc                 C   s\   | j sd S | }|jd}|sd S || j }|r"|jdkr"d S td| j  d | _ d S )Nr   nozaHost capabilities CPU '%s' is not supported according to domain capabilities. Unsetting CPU model)rX   rd   rT   get_mode	get_modelusabler   rg   )r   rk   rl   domcaps_mode	cpu_modelr   r   r   !_validate_default_host_model_only  s   
z+DomainCpu._validate_default_host_model_onlyc                 C   sH   |j j| jjjjjkrd S |j}| || || jkr"| 	| d S d S r   )
osarchrt   ru   rv   rT   x86_cpu_defaultr|   rj   r   )r   rk   r$   r   r   r   _set_cpu_x86_kvm_default  s   
z"DomainCpu._set_cpu_x86_kvm_defaultc                 C   s   | j  s| j  sd S |   s| jrd S |j r'|jdkr'| j	| _
d S |j r9|j r9| |d d S |j rJ|jdkrL| | d S d S d S )Nkvmz
cortex-a57)rt   is_testis_qemur   stripry   r   is_arm_machvirtrK   rf   r$   is_arm64rw   is_x86r   )r   rk   r   r   r   set_defaults  s   zDomainCpu.set_defaultsNr   )F)3r   r   r   r   r   r    r   r   r$   rU   rV   rW   rX   rY   rZ   r[   r   r   r   r!   r"   r'   r\   r8   r]   rF   r^   rQ   r_   ry   rj   rp   rr   ri   rf   rq   rn   SPECIAL_MODESrm   r|   r   r   r   rw   r~   r   r   r   r   r   r   r   r   r   r   rS      sZ    $


rS   N)loggerr   
xmlbuilderr   r   r    r   r   r!   r'   r,   r2   r8   rF   rQ   rS   r   r   r   r   <module>   s   B