<?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="AArch32" is_register="True" is_internal="True" is_stub_entry="False">
      <reg_short_name>CNTP_TVAL</reg_short_name>
        
        <reg_long_name>Counter-timer Physical Timer TimerValue register</reg_long_name>



      
            <reg_condition otherwise="UNDEFINED">when FEAT_AA32 is implemented</reg_condition>
      




          <reg_reset_value></reg_reset_value>

      <reg_mappings>
        



    
      
      <reg_mapping>
        
  

    

  

    <mapped_name filename="AArch64-cntp_tval_el0.xml">CNTP_TVAL_EL0</mapped_name>
  <mapped_type>Architectural</mapped_type>
      <mapped_execution_state>AArch64</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>Holds the timer value for the EL1 physical timer.</para>
      </purpose_text>

        </reg_purpose>

      <reg_groups>
          <reg_group>Timer</reg_group>
      </reg_groups>
      
      
        
        <reg_banking>
            <reg_bank>
                <bank_text>This register is banked between CNTP_TVAL and CNTP_TVAL_S and CNTP_TVAL_NS.</bank_text>
            </reg_bank>
        </reg_banking>
      <reg_attributes>
          
    
      <attributes_text>
        <para>CNTP_TVAL is a 32-bit register.</para>

      </attributes_text>
      <attributes_text>
        <para>This register has the following instances:</para>

      </attributes_text>
      <attributes_text>
        <list type="unordered">
<listitem><content>CNTP_TVAL, when EL3 is not implemented or FEAT_AA64 is implemented.</content>
</listitem><listitem><content>CNTP_TVAL_S, when FEAT_AA32EL3 is implemented.</content>
</listitem><listitem><content>CNTP_TVAL_NS, when FEAT_AA32EL3 is implemented.</content>
</listitem></list>
      </attributes_text>

      </reg_attributes>
      <reg_fieldsets>
        






<fields id="fieldset_0" length="32">
  <text_before_fields/>
  <field id="fieldset_0-31_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>TimerValue</field_name>
    <field_msb>31</field_msb>
    <field_lsb>0</field_lsb>
    <rel_range>31:0</rel_range>
    <field_description order="before"><para>The TimerValue view of the EL1 physical timer.</para>
<para>On a read of this register:</para>
<list type="unordered">
<listitem><content>If <register_link state="AArch32" id="AArch32-cntp_ctl.xml">CNTP_CTL</register_link>.ENABLE is 0, the value returned is <arm-defined-word>UNKNOWN</arm-defined-word>.</content>
</listitem><listitem><content>If <register_link state="AArch32" id="AArch32-cntp_ctl.xml">CNTP_CTL</register_link>.ENABLE is 1, the value returned is (<register_link state="AArch32" id="AArch32-cntp_cval.xml">CNTP_CVAL</register_link> - <register_link state="AArch32" id="AArch32-cntpct.xml">CNTPCT</register_link>).</content>
</listitem></list>
<para>On a write of this register, <register_link state="AArch32" id="AArch32-cntp_cval.xml">CNTP_CVAL</register_link> is set to (<register_link state="AArch32" id="AArch32-cntpct.xml">CNTPCT</register_link> + TimerValue), where TimerValue is treated as a signed 32-bit integer.</para>
<para>When <register_link state="AArch32" id="AArch32-cntp_ctl.xml">CNTP_CTL</register_link>.ENABLE is 1, the timer condition is met when (<register_link state="AArch32" id="AArch32-cntpct.xml">CNTPCT</register_link> - <register_link state="AArch32" id="AArch32-cntp_cval.xml">CNTP_CVAL</register_link>) is greater than or equal to zero. This means that TimerValue acts like a 32-bit downcounter timer. When the timer condition is met:</para>
<list type="unordered">
<listitem><content><register_link state="AArch32" id="AArch32-cntp_ctl.xml">CNTP_CTL</register_link>.ISTATUS is set to 1.</content>
</listitem><listitem><content>If <register_link state="AArch32" id="AArch32-cntp_ctl.xml">CNTP_CTL</register_link>.IMASK is 0, an interrupt is generated.</content>
</listitem></list>
<para>When <register_link state="AArch32" id="AArch32-cntp_ctl.xml">CNTP_CTL</register_link>.ENABLE is 0, the TimerValue cannot be read but continues to decrement. When the timer is enabled, the TimerValue represents the elapsed time whether that time was spent enabled or disabled.</para></field_description>
    <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="32">
  <fieldat id="fieldset_0-31_0" msb="31" lsb="0"/>
</reg_fieldset>


      </reg_fieldsets>

      <access_mechanisms>
          






    
        
        <access_mechanism accessor="MRC CNTP_TVAL" type="SystemAccessor">
            <encoding>
            <access_instruction>MRC{&lt;c&gt;}{&lt;q&gt;} &lt;coproc&gt;, {#}&lt;opc1&gt;, &lt;Rt&gt;, &lt;CRn&gt;, &lt;CRm&gt;{, {#}&lt;opc2&gt;}</access_instruction>
                
                <enc n="coproc" v="0b1111"/>
                
                <enc n="opc1" v="0b000"/>
                
                <enc n="CRn" v="0b1110"/>
                
                <enc n="CRm" v="0b0010"/>
                
                <enc n="opc2" v="0b000"/>
            </encoding>
            <access_permission>
                <ps name="MRC" sections="1" secttype="access_permission">
                <pstext>
if !IsFeatureImplemented(FEAT_AA32) then
    Undefined();
elsif PSTATE.EL == EL0 then
    if IsFeatureImplemented(FEAT_AA64EL1) &amp;&amp; !ELUsingAArch32(EL1) &amp;&amp; !ELIsInHost(EL0) &amp;&amp; CNTKCTL_EL1().EL0PTEN == '0' then
        if EL2Enabled() &amp;&amp; (IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2)) &amp;&amp; HCR_EL2().TGE == '1' then
            AArch64_AArch32SystemAccessTrap(EL2, 0x03);
        else
            AArch64_AArch32SystemAccessTrap(EL1, 0x03);
        end;
    elsif IsFeatureImplemented(FEAT_AA32EL1) &amp;&amp; ELUsingAArch32(EL1) &amp;&amp; CNTKCTL().PL0PTEN == '0' then
        if EL2Enabled() &amp;&amp; (IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2)) &amp;&amp; HCR_EL2().TGE == '1' then
            AArch64_AArch32SystemAccessTrap(EL2, 0x03);
        elsif EL2Enabled() &amp;&amp; (IsFeatureImplemented(FEAT_AA32EL2) &amp;&amp; ELUsingAArch32(EL2)) &amp;&amp; HCR().TGE == '1' then
            AArch32_TakeHypTrapException(0x00);
        else
            Undefined();
        end;
    elsif EL2Enabled() &amp;&amp; (IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2)) &amp;&amp; !ELIsInHost(EL2) &amp;&amp; CNTHCTL_EL2().EL1PCEN == '0' then
        AArch64_AArch32SystemAccessTrap(EL2, 0x03);
    elsif ELIsInHost(EL2) &amp;&amp; (IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2)) &amp;&amp; HCR_EL2().TGE == '0' &amp;&amp; CNTHCTL_EL2().EL1PTEN == '0' then
        AArch64_AArch32SystemAccessTrap(EL2, 0x03);
    elsif ELIsInHost(EL0) &amp;&amp; (IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2)) &amp;&amp; CNTHCTL_EL2().EL0PTEN == '0' then
        AArch64_AArch32SystemAccessTrap(EL2, 0x03);
    elsif EL2Enabled() &amp;&amp; (IsFeatureImplemented(FEAT_AA32EL2) &amp;&amp; ELUsingAArch32(EL2)) &amp;&amp; CNTHCTL().PL1PCEN == '0' then
        AArch32_TakeHypTrapException(0x03);
    elsif ELIsInHost(EL0) &amp;&amp; IsCurrentSecurityState(SS_Secure) &amp;&amp; IsFeatureImplemented(FEAT_SEL2) then
        if CNTHPS_CTL_EL2().ENABLE == '0' then
            R(t) = ARBITRARY:bits(32);
        else
            R(t) = (CNTHPS_CVAL_EL2() - PhysicalCountInt())[31:0];
        end;
    elsif ELIsInHost(EL0) &amp;&amp; !IsCurrentSecurityState(SS_Secure) then
        if CNTHP_CTL_EL2().ENABLE == '0' then
            R(t) = ARBITRARY:bits(32);
        else
            R(t) = (CNTHP_CVAL_EL2() - PhysicalCountInt())[31:0];
        end;
    elsif IsFeatureImplemented(FEAT_ECV_POFF) &amp;&amp; EL2Enabled() &amp;&amp; (IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2)) &amp;&amp; (!HaveEL(EL3) || SCR_EL3().ECVEn == '1') &amp;&amp; CNTHCTL_EL2().ECV == '1' &amp;&amp; !ELIsInHost(EL0) then
        if CNTP_CTL().ENABLE == '0' then
            R(t) = ARBITRARY:bits(32);
        else
            R(t) = (CNTP_CVAL() - (PhysicalCountInt() - CNTPOFF_EL2()))[31:0];
        end;
    elsif HaveEL(EL3) &amp;&amp; IsFeatureImplemented(FEAT_AA32EL3) &amp;&amp; ELUsingAArch32(EL3) then
        if SCR().NS == '1' then
            if CNTP_CTL_NS().ENABLE == '0' then
                R(t) = ARBITRARY:bits(32);
            else
                R(t) = (CNTP_CVAL_NS() - PhysicalCountInt())[31:0];
            end;
        else
            if CNTP_CTL_S().ENABLE == '0' then
                R(t) = ARBITRARY:bits(32);
            else
                R(t) = (CNTP_CVAL_S() - PhysicalCountInt())[31:0];
            end;
        end;
    else
        if CNTP_CTL().ENABLE == '0' then
            R(t) = ARBITRARY:bits(32);
        else
            R(t) = (CNTP_CVAL() - PhysicalCountInt())[31:0];
        end;
    end;
elsif PSTATE.EL == EL1 then
    if EL2Enabled() &amp;&amp; IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2) &amp;&amp; !ELIsInHost(EL2) &amp;&amp; CNTHCTL_EL2().EL1PCEN == '0' then
        AArch64_AArch32SystemAccessTrap(EL2, 0x03);
    elsif ELIsInHost(EL2) &amp;&amp; IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2) &amp;&amp; CNTHCTL_EL2().EL1PTEN == '0' then
        AArch64_AArch32SystemAccessTrap(EL2, 0x03);
    elsif EL2Enabled() &amp;&amp; IsFeatureImplemented(FEAT_AA32EL2) &amp;&amp; ELUsingAArch32(EL2) &amp;&amp; CNTHCTL().PL1PCEN == '0' then
        AArch32_TakeHypTrapException(0x03);
    elsif IsFeatureImplemented(FEAT_ECV_POFF) &amp;&amp; EL2Enabled() &amp;&amp; IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2) &amp;&amp; (!HaveEL(EL3) || SCR_EL3().ECVEn == '1') &amp;&amp; CNTHCTL_EL2().ECV == '1' then
        if CNTP_CTL().ENABLE == '0' then
            R(t) = ARBITRARY:bits(32);
        else
            R(t) = (CNTP_CVAL() - (PhysicalCountInt() - CNTPOFF_EL2()))[31:0];
        end;
    elsif HaveEL(EL3) &amp;&amp; IsFeatureImplemented(FEAT_AA32EL3) &amp;&amp; ELUsingAArch32(EL3) then
        if CNTP_CTL_NS().ENABLE == '0' then
            R(t) = ARBITRARY:bits(32);
        else
            R(t) = (CNTP_CVAL_NS() - PhysicalCountInt())[31:0];
        end;
    else
        if CNTP_CTL().ENABLE == '0' then
            R(t) = ARBITRARY:bits(32);
        else
            R(t) = (CNTP_CVAL() - PhysicalCountInt())[31:0];
        end;
    end;
elsif PSTATE.EL == EL2 then
    if HaveEL(EL3) &amp;&amp; IsFeatureImplemented(FEAT_AA32EL3) &amp;&amp; ELUsingAArch32(EL3) then
        if CNTP_CTL_NS().ENABLE == '0' then
            R(t) = ARBITRARY:bits(32);
        else
            R(t) = (CNTP_CVAL_NS() - PhysicalCountInt())[31:0];
        end;
    else
        if CNTP_CTL().ENABLE == '0' then
            R(t) = ARBITRARY:bits(32);
        else
            R(t) = (CNTP_CVAL() - PhysicalCountInt())[31:0];
        end;
    end;
elsif PSTATE.EL == EL3 then
    if SCR().NS == '0' then
        if CNTP_CTL_S().ENABLE == '0' then
            R(t) = ARBITRARY:bits(32);
        else
            R(t) = (CNTP_CVAL_S() - PhysicalCountInt())[31:0];
        end;
    else
        if CNTP_CTL_NS().ENABLE == '0' then
            R(t) = ARBITRARY:bits(32);
        else
            R(t) = (CNTP_CVAL_NS() - PhysicalCountInt())[31:0];
        end;
    end;
end;
                </pstext>
                </ps>
            </access_permission>
        </access_mechanism>
    
        
        <access_mechanism accessor="MCR CNTP_TVAL" type="SystemAccessor">
            <encoding>
            <access_instruction>MCR{&lt;c&gt;}{&lt;q&gt;} &lt;coproc&gt;, {#}&lt;opc1&gt;, &lt;Rt&gt;, &lt;CRn&gt;, &lt;CRm&gt;{, {#}&lt;opc2&gt;}</access_instruction>
                
                <enc n="coproc" v="0b1111"/>
                
                <enc n="opc1" v="0b000"/>
                
                <enc n="CRn" v="0b1110"/>
                
                <enc n="CRm" v="0b0010"/>
                
                <enc n="opc2" v="0b000"/>
            </encoding>
            <access_permission>
                <ps name="MCR" sections="1" secttype="access_permission">
                <pstext>
if !IsFeatureImplemented(FEAT_AA32) then
    Undefined();
elsif PSTATE.EL == EL0 then
    if IsFeatureImplemented(FEAT_AA64EL1) &amp;&amp; !ELUsingAArch32(EL1) &amp;&amp; !ELIsInHost(EL0) &amp;&amp; CNTKCTL_EL1().EL0PTEN == '0' then
        if EL2Enabled() &amp;&amp; (IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2)) &amp;&amp; HCR_EL2().TGE == '1' then
            AArch64_AArch32SystemAccessTrap(EL2, 0x03);
        else
            AArch64_AArch32SystemAccessTrap(EL1, 0x03);
        end;
    elsif IsFeatureImplemented(FEAT_AA32EL1) &amp;&amp; ELUsingAArch32(EL1) &amp;&amp; CNTKCTL().PL0PTEN == '0' then
        if EL2Enabled() &amp;&amp; (IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2)) &amp;&amp; HCR_EL2().TGE == '1' then
            AArch64_AArch32SystemAccessTrap(EL2, 0x03);
        elsif EL2Enabled() &amp;&amp; (IsFeatureImplemented(FEAT_AA32EL2) &amp;&amp; ELUsingAArch32(EL2)) &amp;&amp; HCR().TGE == '1' then
            AArch32_TakeHypTrapException(0x00);
        else
            Undefined();
        end;
    elsif EL2Enabled() &amp;&amp; (IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2)) &amp;&amp; !ELIsInHost(EL2) &amp;&amp; CNTHCTL_EL2().EL1PCEN == '0' then
        AArch64_AArch32SystemAccessTrap(EL2, 0x03);
    elsif ELIsInHost(EL2) &amp;&amp; (IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2)) &amp;&amp; HCR_EL2().TGE == '0' &amp;&amp; CNTHCTL_EL2().EL1PTEN == '0' then
        AArch64_AArch32SystemAccessTrap(EL2, 0x03);
    elsif ELIsInHost(EL0) &amp;&amp; (IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2)) &amp;&amp; CNTHCTL_EL2().EL0PTEN == '0' then
        AArch64_AArch32SystemAccessTrap(EL2, 0x03);
    elsif EL2Enabled() &amp;&amp; (IsFeatureImplemented(FEAT_AA32EL2) &amp;&amp; ELUsingAArch32(EL2)) &amp;&amp; CNTHCTL().PL1PCEN == '0' then
        AArch32_TakeHypTrapException(0x03);
    elsif ELIsInHost(EL0) &amp;&amp; IsCurrentSecurityState(SS_Secure) &amp;&amp; IsFeatureImplemented(FEAT_SEL2) then
        CNTHPS_CVAL_EL2() = SignExtend{64}(R(t)) + PhysicalCountInt();
    elsif ELIsInHost(EL0) &amp;&amp; !IsCurrentSecurityState(SS_Secure) then
        CNTHP_CVAL_EL2() = SignExtend{64}(R(t)) + PhysicalCountInt();
    elsif IsFeatureImplemented(FEAT_ECV_POFF) &amp;&amp; EL2Enabled() &amp;&amp; (IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2)) &amp;&amp; (!HaveEL(EL3) || SCR_EL3().ECVEn == '1') &amp;&amp; CNTHCTL_EL2().ECV == '1' &amp;&amp; !ELIsInHost(EL0) then
        CNTP_CVAL() = (SignExtend{64}(R(t)) + PhysicalCountInt()) - CNTPOFF_EL2();
    elsif HaveEL(EL3) &amp;&amp; IsFeatureImplemented(FEAT_AA32EL3) &amp;&amp; ELUsingAArch32(EL3) then
        if SCR().NS == '1' then
            CNTP_CVAL_NS() = SignExtend{64}(R(t)) + PhysicalCountInt();
        else
            CNTP_CVAL_S() = SignExtend{64}(R(t)) + PhysicalCountInt();
        end;
    else
        CNTP_CVAL() = SignExtend{64}(R(t)) + PhysicalCountInt();
    end;
elsif PSTATE.EL == EL1 then
    if EL2Enabled() &amp;&amp; IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2) &amp;&amp; !ELIsInHost(EL2) &amp;&amp; CNTHCTL_EL2().EL1PCEN == '0' then
        AArch64_AArch32SystemAccessTrap(EL2, 0x03);
    elsif ELIsInHost(EL2) &amp;&amp; IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2) &amp;&amp; CNTHCTL_EL2().EL1PTEN == '0' then
        AArch64_AArch32SystemAccessTrap(EL2, 0x03);
    elsif EL2Enabled() &amp;&amp; IsFeatureImplemented(FEAT_AA32EL2) &amp;&amp; ELUsingAArch32(EL2) &amp;&amp; CNTHCTL().PL1PCEN == '0' then
        AArch32_TakeHypTrapException(0x03);
    elsif IsFeatureImplemented(FEAT_ECV_POFF) &amp;&amp; EL2Enabled() &amp;&amp; IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2) &amp;&amp; (!HaveEL(EL3) || SCR_EL3().ECVEn == '1') &amp;&amp; CNTHCTL_EL2().ECV == '1' then
        CNTP_CVAL() = (SignExtend{64}(R(t)) + PhysicalCountInt()) - CNTPOFF_EL2();
    elsif HaveEL(EL3) &amp;&amp; IsFeatureImplemented(FEAT_AA32EL3) &amp;&amp; ELUsingAArch32(EL3) then
        CNTP_CVAL_NS() = SignExtend{64}(R(t)) + PhysicalCountInt();
    else
        CNTP_CVAL() = SignExtend{64}(R(t)) + PhysicalCountInt();
    end;
elsif PSTATE.EL == EL2 then
    if HaveEL(EL3) &amp;&amp; IsFeatureImplemented(FEAT_AA32EL3) &amp;&amp; ELUsingAArch32(EL3) then
        CNTP_CVAL_NS() = SignExtend{64}(R(t)) + PhysicalCountInt();
    else
        CNTP_CVAL() = SignExtend{64}(R(t)) + PhysicalCountInt();
    end;
elsif PSTATE.EL == EL3 then
    if SCR().NS == '0' then
        CNTP_CVAL_S() = SignExtend{64}(R(t)) + PhysicalCountInt();
    else
        CNTP_CVAL_NS() = SignExtend{64}(R(t)) + PhysicalCountInt();
    end;
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>