<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE register_page SYSTEM "registers.dtd">
<!-- Copyright (c) 2010-2026 Arm Limited or its affiliates. All rights reserved. -->
<!-- This document is Non-Confidential. This document may only be used and distributed in accordance with the terms of the agreement entered into by Arm and the party that Arm delivered this document to. -->
<!--The data contained in this document is preliminary and subject to change or correction following further review. -->
<?xml-stylesheet href="one_register.xsl" type="text/xsl" ?>







<register_page>
  <registers>
  
    <register execution_state="AArch64" is_register="True" is_internal="True" is_stub_entry="False">
      <reg_short_name>CNTHP_CTL_EL2</reg_short_name>
        
        <reg_long_name>Counter-timer Hypervisor Physical Timer Control Register</reg_long_name>



      
            <reg_condition otherwise="UNDEFINED">when (EL3 is implemented or (EL3 is not implemented, EL2 is implemented, and FEAT_SEL2 is not implemented)) and FEAT_AA64 is implemented</reg_condition>
      




          <reg_reset_value></reg_reset_value>

      <reg_mappings>
        



    
      
      <reg_mapping>
        
  

    

  

    <mapped_name filename="AArch32-cnthp_ctl.xml">CNTHP_CTL</mapped_name>
  <mapped_type>Architectural</mapped_type>
      <mapped_execution_state>AArch32</mapped_execution_state>
    <mapped_from_startbit>31</mapped_from_startbit>
    <mapped_from_endbit>0</mapped_from_endbit>
    <mapped_to_startbit>31</mapped_to_startbit>
    <mapped_to_endbit>0</mapped_to_endbit>
    <mapped_from_rangeset output="31:0">
      <range>
        <msb>31</msb>
        <lsb>0</lsb>
      </range>
    </mapped_from_rangeset>
    <mapped_to_rangeset output="31:0">
      <range>
        <msb>31</msb>
        <lsb>0</lsb>
      </range>
    </mapped_to_rangeset>

      </reg_mapping>

      </reg_mappings>

        <reg_purpose>
          
    
      <purpose_text>
        <para>Control register for the EL2 physical timer.</para>
      </purpose_text>

        </reg_purpose>

      <reg_groups>
            <reg_group>Virt</reg_group>
      </reg_groups>
      <reg_configuration>
        
    
      <configuration_text>
        <para>If EL2 is not implemented, this register is <arm-defined-word>RES0</arm-defined-word> from EL3.</para>
      </configuration_text>

      </reg_configuration>
      
      
        
      <reg_attributes>
          
    
      <attributes_text>
        <para>CNTHP_CTL_EL2 is a 64-bit register.</para>
      </attributes_text>

      </reg_attributes>
      <reg_fieldsets>
        






<fields id="fieldset_0" length="64">
  <text_before_fields/>
  <field id="fieldset_0-63_3" has_partial_fieldset="False" is_linked_to_partial_fieldset="False" is_access_restriction_possible="False" is_variable_length="False" is_constant_value="False" is_partial_field="False" is_conditional_field_name="False" rwtype="RES0">
    <field_msb>63</field_msb>
    <field_lsb>3</field_lsb>
    <rel_range>63:3</rel_range>
    <field_description order="before"/>
    <field_description order="before">
      <para>Reserved, <arm-defined-word>RES0</arm-defined-word>.</para>
    </field_description>
  </field>
  <field id="fieldset_0-2_2" has_partial_fieldset="False" is_linked_to_partial_fieldset="False" is_access_restriction_possible="False" is_variable_length="False" is_constant_value="False" is_partial_field="False" is_conditional_field_name="False">
    <field_name>ISTATUS</field_name>
    <field_msb>2</field_msb>
    <field_lsb>2</field_lsb>
    <rel_range>2</rel_range>
    <field_description order="before">
      <para>The status of the timer. This bit indicates whether the timer condition is met:</para>
    </field_description>
    <field_description order="after"><para>When the value of the ENABLE bit is 1, ISTATUS indicates whether the timer condition is met. ISTATUS takes no account of the value of the IMASK bit. If the value of ISTATUS is 1 and the value of IMASK is 0 then the timer interrupt is asserted.</para>
<para>When the value of the ENABLE bit is 0, the ISTATUS field is <arm-defined-word>UNKNOWN</arm-defined-word>.</para></field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b0</field_value>
        <field_value_description>
          <para>Timer condition is not met.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b1</field_value>
        <field_value_description>
          <para>Timer condition is met.</para>
        </field_value_description>
      </field_value_instance>
    </field_values>
    <field_resets>
      <field_reset reset_type="Warm">
        <field_reset_standard_text>AU</field_reset_standard_text>
      </field_reset>
    </field_resets>
    <field_access>
      <field_access_state>
        <field_access_type>RO</field_access_type>
      </field_access_state>
    </field_access>
  </field>
  <field id="fieldset_0-1_1" has_partial_fieldset="False" is_linked_to_partial_fieldset="False" is_access_restriction_possible="False" is_variable_length="False" is_constant_value="False" is_partial_field="False" is_conditional_field_name="False">
    <field_name>IMASK</field_name>
    <field_msb>1</field_msb>
    <field_lsb>1</field_lsb>
    <rel_range>1</rel_range>
    <field_description order="before">
      <para>Timer interrupt mask bit. Permitted values are:</para>
    </field_description>
    <field_description order="after">
      <para>For more information, see the description of the ISTATUS bit.</para>
    </field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b0</field_value>
        <field_value_description>
          <para>Timer interrupt is not masked by the IMASK bit.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b1</field_value>
        <field_value_description>
          <para>Timer interrupt is masked by the IMASK bit.</para>
        </field_value_description>
      </field_value_instance>
    </field_values>
    <field_resets>
      <field_reset reset_type="Warm">
        <field_reset_standard_text>AU</field_reset_standard_text>
      </field_reset>
    </field_resets>
  </field>
  <field id="fieldset_0-0_0" has_partial_fieldset="False" is_linked_to_partial_fieldset="False" is_access_restriction_possible="False" is_variable_length="False" is_constant_value="False" is_partial_field="False" is_conditional_field_name="False">
    <field_name>ENABLE</field_name>
    <field_msb>0</field_msb>
    <field_lsb>0</field_lsb>
    <rel_range>0</rel_range>
    <field_description order="before">
      <para>Enables the timer. Permitted values are:</para>
    </field_description>
    <field_description order="after"><para>Setting this bit to 0 disables the timer output signal, but the timer value accessible from <register_link state="AArch64" id="AArch64-cnthp_tval_el2.xml">CNTHP_TVAL_EL2</register_link> continues to count down.</para>
<note><para>Disabling the output signal might be a power-saving option.</para></note></field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b0</field_value>
        <field_value_description>
          <para>Timer disabled.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b1</field_value>
        <field_value_description>
          <para>Timer enabled.</para>
        </field_value_description>
      </field_value_instance>
    </field_values>
    <field_resets>
      <field_reset reset_type="Warm">
        <field_reset_standard_text>AU</field_reset_standard_text>
      </field_reset>
    </field_resets>
  </field>
  <text_after_fields/>
</fields>




<reg_fieldset length="64">
  <fieldat id="fieldset_0-63_3" msb="63" lsb="3"/>
  <fieldat id="fieldset_0-2_2" msb="2" lsb="2"/>
  <fieldat id="fieldset_0-1_1" msb="1" lsb="1"/>
  <fieldat id="fieldset_0-0_0" msb="0" lsb="0"/>
</reg_fieldset>


      </reg_fieldsets>

      <access_mechanisms>
          


  
    
      <access_permission_text>
        <para>When the Effective value of <register_link state="AArch64" id="AArch64-hcr_el2.xml">HCR_EL2</register_link>.E2H is 1, without explicit synchronization, accesses from EL2 using the accessor name <value>CNTHP_CTL_EL2</value> or <value>CNTP_CTL_EL0</value> are not guaranteed to be ordered with respect to accesses using the other accessor name.</para>
      </access_permission_text>





    
        
        <access_mechanism accessor="MRS CNTHP_CTL_EL2" type="SystemAccessor">
            <encoding>
            <access_instruction>MRS &lt;Xt&gt;, CNTHP_CTL_EL2</access_instruction>
                
                <enc n="op0" v="0b11"/>
                
                <enc n="op1" v="0b100"/>
                
                <enc n="CRn" v="0b1110"/>
                
                <enc n="CRm" v="0b0010"/>
                
                <enc n="op2" v="0b001"/>
            </encoding>
            <access_permission>
                <ps name="MRS" sections="1" secttype="access_permission">
                <pstext>
if !((HaveEL(EL3) || (!HaveEL(EL3) &amp;&amp; HaveEL(EL2) &amp;&amp; !IsFeatureImplemented(FEAT_SEL2))) &amp;&amp; IsFeatureImplemented(FEAT_AA64)) then
    Undefined();
elsif PSTATE.EL == EL0 then
    Undefined();
elsif PSTATE.EL == EL1 then
    if EffectiveHCR_EL2_NVx() IN {'xx1'} then
        AArch64_SystemAccessTrap(EL2, 0x18);
    else
        Undefined();
    end;
elsif PSTATE.EL == EL2 then
    X{64}(t) = CNTHP_CTL_EL2();
elsif PSTATE.EL == EL3 then
    X{64}(t) = CNTHP_CTL_EL2();
end;
                </pstext>
                </ps>
            </access_permission>
        </access_mechanism>
    
        
        <access_mechanism accessor="MSRregister CNTHP_CTL_EL2" type="SystemAccessor">
            <encoding>
            <access_instruction>MSR CNTHP_CTL_EL2, &lt;Xt&gt;</access_instruction>
                
                <enc n="op0" v="0b11"/>
                
                <enc n="op1" v="0b100"/>
                
                <enc n="CRn" v="0b1110"/>
                
                <enc n="CRm" v="0b0010"/>
                
                <enc n="op2" v="0b001"/>
            </encoding>
            <access_permission>
                <ps name="MSRregister" sections="1" secttype="access_permission">
                <pstext>
if !((HaveEL(EL3) || (!HaveEL(EL3) &amp;&amp; HaveEL(EL2) &amp;&amp; !IsFeatureImplemented(FEAT_SEL2))) &amp;&amp; IsFeatureImplemented(FEAT_AA64)) then
    Undefined();
elsif PSTATE.EL == EL0 then
    Undefined();
elsif PSTATE.EL == EL1 then
    if EffectiveHCR_EL2_NVx() IN {'xx1'} then
        AArch64_SystemAccessTrap(EL2, 0x18);
    else
        Undefined();
    end;
elsif PSTATE.EL == EL2 then
    CNTHP_CTL_EL2() = X{64}(t);
elsif PSTATE.EL == EL3 then
    CNTHP_CTL_EL2() = X{64}(t);
end;
                </pstext>
                </ps>
            </access_permission>
        </access_mechanism>
    
        
        <access_mechanism accessor="MRS CNTP_CTL_EL0" type="SystemAccessor">
            <encoding>
            <access_instruction>MRS &lt;Xt&gt;, CNTP_CTL_EL0</access_instruction>
                
                <enc n="op0" v="0b11"/>
                
                <enc n="op1" v="0b011"/>
                
                <enc n="CRn" v="0b1110"/>
                
                <enc n="CRm" v="0b0010"/>
                
                <enc n="op2" v="0b001"/>
            </encoding>
            <access_permission>
                <ps name="MRS" sections="1" secttype="access_permission">
                <pstext>
if !IsFeatureImplemented(FEAT_AA64) then
    Undefined();
elsif PSTATE.EL == EL0 then
    if !ELIsInHost(EL0) &amp;&amp; CNTKCTL_EL1().EL0PTEN == '0' then
        if EL2Enabled() &amp;&amp; HCR_EL2().TGE == '1' then
            AArch64_SystemAccessTrap(EL2, 0x18);
        else
            AArch64_SystemAccessTrap(EL1, 0x18);
        end;
    elsif EL2Enabled() &amp;&amp; !ELIsInHost(EL2) &amp;&amp; CNTHCTL_EL2().EL1PCEN == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif ELIsInHost(EL2) &amp;&amp; HCR_EL2().TGE == '0' &amp;&amp; CNTHCTL_EL2().EL1PTEN == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif ELIsInHost(EL0) &amp;&amp; CNTHCTL_EL2().EL0PTEN == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif ELIsInHost(EL0) &amp;&amp; IsCurrentSecurityState(SS_Secure) &amp;&amp; IsFeatureImplemented(FEAT_SEL2) then
        X{64}(t) = CNTHPS_CTL_EL2();
    elsif ELIsInHost(EL0) &amp;&amp; !IsCurrentSecurityState(SS_Secure) then
        X{64}(t) = CNTHP_CTL_EL2();
    else
        X{64}(t) = CNTP_CTL_EL0();
    end;
elsif PSTATE.EL == EL1 then
    if EL2Enabled() &amp;&amp; !ELIsInHost(EL2) &amp;&amp; CNTHCTL_EL2().EL1PCEN == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif ELIsInHost(EL2) &amp;&amp; CNTHCTL_EL2().EL1PTEN == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif EffectiveHCR_EL2_NVx() IN {'111'} then
        X{64}(t) = NVMem(0x180);
    else
        X{64}(t) = CNTP_CTL_EL0();
    end;
elsif PSTATE.EL == EL2 then
    if ELIsInHost(EL2) &amp;&amp; IsCurrentSecurityState(SS_Secure) &amp;&amp; IsFeatureImplemented(FEAT_SEL2) then
        X{64}(t) = CNTHPS_CTL_EL2();
    elsif ELIsInHost(EL2) &amp;&amp; !IsCurrentSecurityState(SS_Secure) then
        X{64}(t) = CNTHP_CTL_EL2();
    else
        X{64}(t) = CNTP_CTL_EL0();
    end;
elsif PSTATE.EL == EL3 then
    X{64}(t) = CNTP_CTL_EL0();
end;
                </pstext>
                </ps>
            </access_permission>
        </access_mechanism>
    
        
        <access_mechanism accessor="MSRregister CNTP_CTL_EL0" type="SystemAccessor">
            <encoding>
            <access_instruction>MSR CNTP_CTL_EL0, &lt;Xt&gt;</access_instruction>
                
                <enc n="op0" v="0b11"/>
                
                <enc n="op1" v="0b011"/>
                
                <enc n="CRn" v="0b1110"/>
                
                <enc n="CRm" v="0b0010"/>
                
                <enc n="op2" v="0b001"/>
            </encoding>
            <access_permission>
                <ps name="MSRregister" sections="1" secttype="access_permission">
                <pstext>
if !IsFeatureImplemented(FEAT_AA64) then
    Undefined();
elsif PSTATE.EL == EL0 then
    if !ELIsInHost(EL0) &amp;&amp; CNTKCTL_EL1().EL0PTEN == '0' then
        if EL2Enabled() &amp;&amp; HCR_EL2().TGE == '1' then
            AArch64_SystemAccessTrap(EL2, 0x18);
        else
            AArch64_SystemAccessTrap(EL1, 0x18);
        end;
    elsif EL2Enabled() &amp;&amp; !ELIsInHost(EL2) &amp;&amp; CNTHCTL_EL2().EL1PCEN == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif ELIsInHost(EL2) &amp;&amp; HCR_EL2().TGE == '0' &amp;&amp; CNTHCTL_EL2().EL1PTEN == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif ELIsInHost(EL0) &amp;&amp; CNTHCTL_EL2().EL0PTEN == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif ELIsInHost(EL0) &amp;&amp; IsCurrentSecurityState(SS_Secure) &amp;&amp; IsFeatureImplemented(FEAT_SEL2) then
        CNTHPS_CTL_EL2() = X{64}(t);
    elsif ELIsInHost(EL0) &amp;&amp; !IsCurrentSecurityState(SS_Secure) then
        CNTHP_CTL_EL2() = X{64}(t);
    else
        CNTP_CTL_EL0() = X{64}(t);
    end;
elsif PSTATE.EL == EL1 then
    if EL2Enabled() &amp;&amp; !ELIsInHost(EL2) &amp;&amp; CNTHCTL_EL2().EL1PCEN == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif ELIsInHost(EL2) &amp;&amp; CNTHCTL_EL2().EL1PTEN == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif EffectiveHCR_EL2_NVx() IN {'111'} then
        NVMem(0x180) = X{64}(t);
    else
        CNTP_CTL_EL0() = X{64}(t);
    end;
elsif PSTATE.EL == EL2 then
    if ELIsInHost(EL2) &amp;&amp; IsCurrentSecurityState(SS_Secure) &amp;&amp; IsFeatureImplemented(FEAT_SEL2) then
        CNTHPS_CTL_EL2() = X{64}(t);
    elsif ELIsInHost(EL2) &amp;&amp; !IsCurrentSecurityState(SS_Secure) then
        CNTHP_CTL_EL2() = X{64}(t);
    else
        CNTP_CTL_EL0() = X{64}(t);
    end;
elsif PSTATE.EL == EL3 then
    CNTP_CTL_EL0() = X{64}(t);
end;
                </pstext>
                </ps>
            </access_permission>
        </access_mechanism>

      </access_mechanisms>

      <arch_variants>
      </arch_variants>
  </register>
</registers>
<timestamp>2026-03-26 20:27:25</timestamp>
<commit_id>2026-03_rel</commit_id>
</register_page>