<?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>ICH_LRC&lt;n&gt;</reg_short_name>
        
        <reg_long_name>Interrupt Controller List Registers</reg_long_name>



      
            <reg_condition otherwise="UNDEFINED">when FEAT_AA32EL2 is implemented, GICv3 is implemented, and (EL2 is implemented or EL3 is implemented)</reg_condition>
          <reg_array>
              <reg_array_start>0</reg_array_start>
              <reg_array_end>15</reg_array_end>
         </reg_array>
      




          <reg_reset_value></reg_reset_value>

      <reg_mappings>
        



    
      
      <reg_mapping>
        
  

    

  

    <mapped_name filename="AArch64-ich_lrn_el2.xml">ICH_LR&lt;n&gt;_EL2</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>63</mapped_to_startbit>
    <mapped_to_endbit>32</mapped_to_endbit>
    <mapped_from_rangeset output="31:0">
      <range>
        <msb>31</msb>
        <lsb>0</lsb>
      </range>
    </mapped_from_rangeset>
    <mapped_to_rangeset output="63:32">
      <range>
        <msb>63</msb>
        <lsb>32</lsb>
      </range>
    </mapped_to_rangeset>

      </reg_mapping>

      </reg_mappings>

        <reg_purpose>
          
    
      <purpose_text>
        <para>Provides interrupt context information for the virtual CPU interface.</para>
      </purpose_text>

        </reg_purpose>

      <reg_groups>
            <reg_group>GIC</reg_group>
            <reg_group>GIC Host Interface Control Registers</reg_group>
            <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>
      <configuration_text>
        <para>If list register n is not implemented, then accesses to this register are <arm-defined-word>UNDEFINED</arm-defined-word>.</para>
      </configuration_text>

      </reg_configuration>
      
      
        
      <reg_attributes>
          
    
      <attributes_text>
        <para>ICH_LRC&lt;n&gt; is a 32-bit register.</para>
      </attributes_text>

      </reg_attributes>
      <reg_fieldsets>
        






<fields id="fieldset_0" length="32">
  <text_before_fields/>
  <field id="fieldset_0-31_30" 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>State</field_name>
    <field_msb>31</field_msb>
    <field_lsb>30</field_lsb>
    <rel_range>31:30</rel_range>
    <field_description order="before">
      <para>The state of the interrupt:</para>
    </field_description>
    <field_description order="after"><para>The GIC updates these state bits as virtual interrupts proceed through the interrupt life cycle. Entries in the invalid state are ignored, except for the purpose of generating virtual maintenance interrupts.</para>
<para>For hardware interrupts, the pending and active state is held in the physical Distributor rather than the virtual CPU interface. A hypervisor must only use the pending and active state for software originated interrupts, which are typically associated with virtual devices, or SGIs.</para></field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b00</field_value>
        <field_value_description>
          <para>Invalid (Inactive).</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b01</field_value>
        <field_value_description>
          <para>Pending.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b10</field_value>
        <field_value_description>
          <para>Active.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b11</field_value>
        <field_value_description>
          <para>Pending and active.</para>
        </field_value_description>
      </field_value_instance>
    </field_values>
    <field_resets>
      <field_reset reset_type="Warm">
        <field_reset_number>'00'</field_reset_number>
      </field_reset>
    </field_resets>
  </field>
  <field id="fieldset_0-29_29" 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>HW</field_name>
    <field_msb>29</field_msb>
    <field_lsb>29</field_lsb>
    <rel_range>29</rel_range>
    <field_description order="before">
      <para>Indicates whether this virtual interrupt maps directly to a hardware interrupt, meaning that it corresponds to a physical interrupt. Deactivation of the virtual interrupt also causes the deactivation of the physical interrupt with the INTID that the pINTID field indicates.</para>
    </field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b0</field_value>
        <field_value_description>
          <para>The interrupt is triggered entirely by software. No notification is sent to the Distributor when the virtual interrupt is deactivated.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b1</field_value>
        <field_value_description><para>The interrupt maps directly to a hardware interrupt. A deactivate interrupt request is sent to the Distributor when the virtual interrupt is deactivated, using the pINTID field from this register to indicate the physical INTID.</para>
<para>If <register_link state="AArch32" id="AArch32-ich_vmcr.xml">ICH_VMCR</register_link>.VEOIM is 0, this request corresponds to a write to <register_link state="AArch32" id="AArch32-icc_eoir0.xml">ICC_EOIR0</register_link> or <register_link state="AArch32" id="AArch32-icc_eoir1.xml">ICC_EOIR1</register_link>. Otherwise, it corresponds to a write to <register_link state="AArch32" id="AArch32-icc_dir.xml">ICC_DIR</register_link>.</para></field_value_description>
      </field_value_instance>
    </field_values>
    <field_resets>
      <field_reset reset_type="Warm">
        <field_reset_number>'0'</field_reset_number>
      </field_reset>
    </field_resets>
  </field>
  <field id="fieldset_0-28_28" 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>Group</field_name>
    <field_msb>28</field_msb>
    <field_lsb>28</field_lsb>
    <rel_range>28</rel_range>
    <field_description order="before">
      <para>Indicates the group for this virtual interrupt.</para>
    </field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b0</field_value>
        <field_value_description>
          <para>This is a Group 0 virtual interrupt. <register_link state="AArch32" id="AArch32-ich_vmcr.xml">ICH_VMCR</register_link>.VFIQEn determines whether it is signaled as a virtual IRQ or as a virtual FIQ, and <register_link state="AArch32" id="AArch32-ich_vmcr.xml">ICH_VMCR</register_link>.VENG0 enables signaling of this interrupt to the virtual machine.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b1</field_value>
        <field_value_description><para>This is a Group 1 virtual interrupt, signaled as a virtual IRQ. <register_link state="AArch32" id="AArch32-ich_vmcr.xml">ICH_VMCR</register_link>.VENG1 enables the signaling of this interrupt to the virtual machine.</para>
<para>If <register_link state="AArch32" id="AArch32-ich_vmcr.xml">ICH_VMCR</register_link>.VCBPR is 0, then <register_link state="AArch32" id="AArch32-icc_bpr1.xml">ICC_BPR1</register_link> determines if a pending Group 1 interrupt has sufficient priority to preempt current execution. Otherwise, <register_link state="AArch32" id="AArch32-ich_lrn.xml">ICH_LR&lt;n&gt;</register_link> determines preemption.</para></field_value_description>
      </field_value_instance>
    </field_values>
    <field_resets>
      <field_reset reset_type="Warm">
        <field_reset_number>'0'</field_reset_number>
      </field_reset>
    </field_resets>
  </field>
  <field id="fieldset_0-27_24" 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>27</field_msb>
    <field_lsb>24</field_lsb>
    <rel_range>27:24</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-23_16" 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>Priority</field_name>
    <field_msb>23</field_msb>
    <field_lsb>16</field_lsb>
    <rel_range>23:16</rel_range>
    <field_description order="before"><para>The priority of this interrupt.</para>
<para>It is <arm-defined-word>IMPLEMENTATION DEFINED</arm-defined-word> how many bits of priority are implemented, though at least five bits must be implemented. Unimplemented bits are <arm-defined-word>RES0</arm-defined-word> and start from bit[16] up to bit[18]. The number of implemented bits can be discovered from <register_link state="AArch32" id="AArch32-ich_vtr.xml">ICH_VTR</register_link>.PRIbits.</para></field_description>
    <field_resets>
      <field_reset reset_type="Warm">
        <field_reset_expression>0x00</field_reset_expression>
      </field_reset>
    </field_resets>
  </field>
  <field id="fieldset_0-15_13" 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>15</field_msb>
    <field_lsb>13</field_lsb>
    <rel_range>15:13</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-12_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>pINTID</field_name>
    <field_msb>12</field_msb>
    <field_lsb>0</field_lsb>
    <rel_range>12:0</rel_range>
    <field_description order="before"><para>Physical INTID, for hardware interrupts.</para>
<para>When ICH_LRC&lt;n&gt;.HW is 0 (there is no corresponding physical interrupt), this field has the following meaning:</para>
<list type="unordered">
<listitem><content>Bits[12:10]: <arm-defined-word>RES0</arm-defined-word>.</content>
</listitem><listitem><content>Bit[9]: EOI. If this bit is 1, then when the interrupt identified by vINTID is deactivated, an EOI maintenance interrupt is asserted.</content>
</listitem><listitem><content>Bits[8:0]: Reserved, <arm-defined-word>RES0</arm-defined-word>.</content>
</listitem></list>
<para>When ICH_LRC&lt;n&gt;.HW is 1 (there is a corresponding physical interrupt):</para>
<list type="unordered">
<listitem><content>This field indicates the physical INTID. This field is only required to implement enough bits to hold a valid value for the implemented INTID size. Any unused higher order bits are <arm-defined-word>RES0</arm-defined-word>.</content>
</listitem><listitem><content>When <register_link state="AArch64" id="AArch64-icc_ctlr_el1.xml">ICC_CTLR_EL1</register_link>.ExtRange is 0, then bits[44:42] of this field are <arm-defined-word>RES0</arm-defined-word>.</content>
</listitem><listitem><content>If the value of pINTID is not a valid INTID, behavior is <arm-defined-word>UNPREDICTABLE</arm-defined-word>. If the value of pINTID indicates a PPI, this field applies to the PPI associated with this same physical PE ID as the virtual CPU interface requesting the deactivation.</content>
</listitem></list>
<para>A hardware physical identifier is only required in List Registers for interrupts that require deactivation. This means only 13 bits of Physical INTID are required, regardless of the number specified by <register_link state="AArch32" id="AArch32-icc_ctlr.xml">ICC_CTLR</register_link>.IDbits.</para></field_description>
    <field_resets>
      <field_reset reset_type="Warm">
        <field_reset_number>'0000000000000'</field_reset_number>
      </field_reset>
    </field_resets>
  </field>
  <text_after_fields/>
</fields>




<reg_fieldset length="32">
  <fieldat id="fieldset_0-31_30" msb="31" lsb="30"/>
  <fieldat id="fieldset_0-29_29" msb="29" lsb="29"/>
  <fieldat id="fieldset_0-28_28" msb="28" lsb="28"/>
  <fieldat id="fieldset_0-27_24" msb="27" lsb="24"/>
  <fieldat id="fieldset_0-23_16" msb="23" lsb="16"/>
  <fieldat id="fieldset_0-15_13" msb="15" lsb="13"/>
  <fieldat id="fieldset_0-12_0" msb="12" lsb="0"/>
</reg_fieldset>


      </reg_fieldsets>
        <reg_variables>
              <reg_variable variable="n" max="15"/>
        </reg_variables>

      <access_mechanisms>
          


  
    
      <access_permission_text>
        <para><register_link state="AArch32" id="AArch32-ich_lrn.xml">ICH_LR&lt;n&gt;</register_link> and ICH_LRC&lt;n&gt; can be updated independently.</para>
      </access_permission_text>





    
        
        <access_mechanism accessor="MRC ICH_LRC&lt;m&gt;" type="SystemAccessor">
            <encoding>
                
                <acc_array var="m">
                    <acc_array_range>0-15</acc_array_range>
                </acc_array>
            <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="0b100"/>
                
                <enc n="CRn" v="0b1100"/>
                
                <enc n="CRm" v="0b111:m[3]"/>
                
                <enc n="opc2" v="m[2:0]"/>
            </encoding>
            <access_permission>
                <ps name="MRC" sections="1" secttype="access_permission">
                <pstext>
let m:integer = UInt(CRm[0] :: opc2[2:0]);

if !(IsFeatureImplemented(FEAT_AA32EL2) &amp;&amp; IsFeatureImplemented(FEAT_GICv3) &amp;&amp; (HaveEL(EL2) || HaveEL(EL3))) then
    Undefined();
elsif m &gt;= NUM_GIC_LIST_REGS then
    Undefined();
elsif PSTATE.EL == EL0 then
    Undefined();
elsif PSTATE.EL == EL1 then
    if EL2Enabled() &amp;&amp; IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2) &amp;&amp; HSTR_EL2().T12 == '1' then
        AArch64_AArch32SystemAccessTrap(EL2, 0x03);
    elsif EL2Enabled() &amp;&amp; IsFeatureImplemented(FEAT_AA32EL2) &amp;&amp; ELUsingAArch32(EL2) &amp;&amp; HSTR().T12 == '1' then
        AArch32_TakeHypTrapException(0x03);
    else
        Undefined();
    end;
elsif PSTATE.EL == EL2 then
    if ICC_HSRE().SRE == '0' then
        Undefined();
    else
        R(t) = ICH_LRC(m);
    end;
elsif PSTATE.EL == EL3 then
    if ICC_MSRE().SRE == '0' then
        Undefined();
    else
        R(t) = ICH_LRC(m);
    end;
end;
                </pstext>
                </ps>
            </access_permission>
        </access_mechanism>
    
        
        <access_mechanism accessor="MCR ICH_LRC&lt;m&gt;" type="SystemAccessor">
            <encoding>
                
                <acc_array var="m">
                    <acc_array_range>0-15</acc_array_range>
                </acc_array>
            <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="0b100"/>
                
                <enc n="CRn" v="0b1100"/>
                
                <enc n="CRm" v="0b111:m[3]"/>
                
                <enc n="opc2" v="m[2:0]"/>
            </encoding>
            <access_permission>
                <ps name="MCR" sections="1" secttype="access_permission">
                <pstext>
let m:integer = UInt(CRm[0] :: opc2[2:0]);

if !(IsFeatureImplemented(FEAT_AA32EL2) &amp;&amp; IsFeatureImplemented(FEAT_GICv3) &amp;&amp; (HaveEL(EL2) || HaveEL(EL3))) then
    Undefined();
elsif m &gt;= NUM_GIC_LIST_REGS then
    Undefined();
elsif PSTATE.EL == EL0 then
    Undefined();
elsif PSTATE.EL == EL1 then
    if EL2Enabled() &amp;&amp; IsFeatureImplemented(FEAT_AA64EL2) &amp;&amp; !ELUsingAArch32(EL2) &amp;&amp; HSTR_EL2().T12 == '1' then
        AArch64_AArch32SystemAccessTrap(EL2, 0x03);
    elsif EL2Enabled() &amp;&amp; IsFeatureImplemented(FEAT_AA32EL2) &amp;&amp; ELUsingAArch32(EL2) &amp;&amp; HSTR().T12 == '1' then
        AArch32_TakeHypTrapException(0x03);
    else
        Undefined();
    end;
elsif PSTATE.EL == EL2 then
    if ICC_HSRE().SRE == '0' then
        Undefined();
    else
        ICH_LRC(m) = R(t);
    end;
elsif PSTATE.EL == EL3 then
    if ICC_MSRE().SRE == '0' then
        Undefined();
    else
        ICH_LRC(m) = R(t);
    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>