<?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_VMCR</reg_short_name>
        
        <reg_long_name>Interrupt Controller Virtual Machine Control Register</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_reset_value></reg_reset_value>

      <reg_mappings>
        



    
      
      <reg_mapping>
        
  

    

  

    <mapped_name filename="AArch64-ich_vmcr_el2.xml">ICH_VMCR_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>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>Enables the hypervisor to save and restore the virtual machine view of the GIC state.</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>

      </reg_configuration>
      
      
        
      <reg_attributes>
          
    
      <attributes_text>
        <para>ICH_VMCR 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_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">
    <field_name>VPMR</field_name>
    <field_msb>31</field_msb>
    <field_lsb>24</field_lsb>
    <rel_range>31:24</rel_range>
    <field_description order="before"><para>Virtual Priority Mask. The priority mask level for the virtual CPU interface. If the priority of a pending virtual interrupt is higher than the value indicated by this field, the interface signals the virtual interrupt to the PE.</para>
<para>This field is an alias of <register_link state="AArch32" id="AArch32-icv_pmr.xml">ICV_PMR</register_link>.Priority.</para></field_description>
    <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-23_21" 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>VBPR0</field_name>
    <field_msb>23</field_msb>
    <field_lsb>21</field_lsb>
    <rel_range>23:21</rel_range>
    <field_description order="before"><para>Virtual Binary Point Register, Group 0. Defines the point at which the priority value fields split into two parts, the group priority field and the subpriority field. The group priority field determines Group 0 interrupt preemption, and also determines Group 1 interrupt preemption if ICH_VMCR.VCBPR == 1.</para>
<para>This field is an alias of <register_link state="AArch32" id="AArch32-icv_bpr0.xml">ICV_BPR0</register_link>.BinaryPoint.</para></field_description>
    <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-20_18" 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>VBPR1</field_name>
    <field_msb>20</field_msb>
    <field_lsb>18</field_lsb>
    <rel_range>20:18</rel_range>
    <field_description order="before"><para>Virtual Binary Point Register, Group 1. Defines the point at which the priority value fields split into two parts, the group priority field and the subpriority field. The group priority field determines Group 1 interrupt preemption if <register_link state="AArch32" id="AArch32-ich_vmcr.xml">ICH_VMCR</register_link>.VCBPR == 0.</para>
<para>This field is an alias of <register_link state="AArch32" id="AArch32-icv_bpr1.xml">ICV_BPR1</register_link>.BinaryPoint.</para></field_description>
    <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-17_10" 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>17</field_msb>
    <field_lsb>10</field_lsb>
    <rel_range>17:10</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-9_9" 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>VEOIM</field_name>
    <field_msb>9</field_msb>
    <field_lsb>9</field_lsb>
    <rel_range>9</rel_range>
    <field_description order="before">
      <para>Virtual EOI mode. Controls whether a write to an End of Interrupt register also deactivates the virtual interrupt:</para>
    </field_description>
    <field_description order="after">
      <para>This bit is an alias of <register_link state="AArch32" id="AArch32-icv_ctlr.xml">ICV_CTLR</register_link>.EOImode.</para>
    </field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b0</field_value>
        <field_value_description>
          <para><register_link state="AArch32" id="AArch32-icv_eoir0.xml">ICV_EOIR0</register_link> and <register_link state="AArch32" id="AArch32-icv_eoir1.xml">ICV_EOIR1</register_link> provide both priority drop and interrupt deactivation functionality. Accesses to <register_link state="AArch32" id="AArch32-icv_dir.xml">ICV_DIR</register_link> are <arm-defined-word>UNPREDICTABLE</arm-defined-word>.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b1</field_value>
        <field_value_description>
          <para><register_link state="AArch32" id="AArch32-icv_eoir0.xml">ICV_EOIR0</register_link> and <register_link state="AArch32" id="AArch32-icv_eoir1.xml">ICV_EOIR1</register_link> provide priority drop functionality only. <register_link state="AArch32" id="AArch32-icv_dir.xml">ICV_DIR</register_link> provides interrupt deactivation functionality.</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-8_5" 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>8</field_msb>
    <field_lsb>5</field_lsb>
    <rel_range>8:5</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-4_4" 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>VCBPR</field_name>
    <field_msb>4</field_msb>
    <field_lsb>4</field_lsb>
    <rel_range>4</rel_range>
    <field_description order="before">
      <para>Virtual Common Binary Point Register. Possible values of this bit are:</para>
    </field_description>
    <field_description order="after">
      <para>This field is an alias of <register_link state="AArch32" id="AArch32-icv_ctlr.xml">ICV_CTLR</register_link>.CBPR.</para>
    </field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b0</field_value>
        <field_value_description><para><register_link state="AArch32" id="AArch32-icv_bpr0.xml">ICV_BPR0</register_link> determines the preemption group for virtual Group 0 interrupts only.</para>
<para><register_link state="AArch32" id="AArch32-icv_bpr1.xml">ICV_BPR1</register_link> determines the preemption group for virtual Group 1 interrupts.</para></field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b1</field_value>
        <field_value_description><para><register_link state="AArch32" id="AArch32-icv_bpr0.xml">ICV_BPR0</register_link> determines the preemption group for both virtual Group 0 and virtual Group 1 interrupts.</para>
<para>Reads of <register_link state="AArch32" id="AArch32-icv_bpr1.xml">ICV_BPR1</register_link> return <register_link state="AArch32" id="AArch32-icv_bpr0.xml">ICV_BPR0</register_link> plus one, saturated to <binarynumber>0b111</binarynumber>. Writes to <register_link state="AArch32" id="AArch32-icv_bpr1.xml">ICV_BPR1</register_link> are ignored.</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-3_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">
    <field_name>VFIQEn</field_name>
    <field_msb>3</field_msb>
    <field_lsb>3</field_lsb>
    <rel_range>3</rel_range>
    <field_description order="before">
      <para>Virtual FIQ enable. Possible values of this bit are:</para>
    </field_description>
    <field_description order="after"><para>This bit is an alias of <register_link state="ext" id="ext-gicv_ctlr.xml">GICV_CTLR</register_link>.FIQEn.</para>
<para>In implementations where the Non-secure copy of <register_link state="AArch32" id="AArch32-icc_sre.xml">ICC_SRE</register_link>.SRE is always 1, this bit is <arm-defined-word>RES1</arm-defined-word>.</para></field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b0</field_value>
        <field_value_description>
          <para>Group 0 virtual interrupts are presented as virtual IRQs.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b1</field_value>
        <field_value_description>
          <para>Group 0 virtual interrupts are presented as virtual FIQs.</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-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>VAckCtl</field_name>
    <field_msb>2</field_msb>
    <field_lsb>2</field_lsb>
    <rel_range>2</rel_range>
    <field_description order="before">
      <para>Virtual AckCtl. Possible values of this bit are:</para>
    </field_description>
    <field_description order="after"><para>This bit is an alias of <register_link state="ext" id="ext-gicv_ctlr.xml">GICV_CTLR</register_link>.AckCtl.</para>
<para>This field is supported for backward compatibility with GICv2. Arm deprecates the use of this field.</para>
<para>In implementations where the Non-secure copy of <register_link state="AArch32" id="AArch32-icc_sre.xml">ICC_SRE</register_link>.SRE is always 1, this bit is <arm-defined-word>RES0</arm-defined-word>.</para></field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b0</field_value>
        <field_value_description>
          <para>If the highest priority pending interrupt is Group 1, a read of <register_link state="ext" id="ext-gicv_iar.xml">GICV_IAR</register_link> or <register_link state="ext" id="ext-gicv_hppir.xml">GICV_HPPIR</register_link> returns an INTID of 1022.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b1</field_value>
        <field_value_description>
          <para>If the highest priority pending interrupt is Group 1, a read of <register_link state="ext" id="ext-gicv_iar.xml">GICV_IAR</register_link> or <register_link state="ext" id="ext-gicv_hppir.xml">GICV_HPPIR</register_link> returns the INTID of the corresponding interrupt.</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-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>VENG1</field_name>
    <field_msb>1</field_msb>
    <field_lsb>1</field_lsb>
    <rel_range>1</rel_range>
    <field_description order="before">
      <para>Virtual Group 1 interrupt enable. Possible values of this bit are:</para>
    </field_description>
    <field_description order="after">
      <para>This bit is an alias of <register_link state="AArch32" id="AArch32-icv_igrpen1.xml">ICV_IGRPEN1</register_link>.Enable.</para>
    </field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b0</field_value>
        <field_value_description>
          <para>Virtual Group 1 interrupts are disabled.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b1</field_value>
        <field_value_description>
          <para>Virtual Group 1 interrupts are 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>
  <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>VENG0</field_name>
    <field_msb>0</field_msb>
    <field_lsb>0</field_lsb>
    <rel_range>0</rel_range>
    <field_description order="before">
      <para>Virtual Group 0 interrupt enable. Possible values of this bit are:</para>
    </field_description>
    <field_description order="after">
      <para>This bit is an alias of <register_link state="AArch32" id="AArch32-icv_igrpen0.xml">ICV_IGRPEN0</register_link>.Enable.</para>
    </field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b0</field_value>
        <field_value_description>
          <para>Virtual Group 0 interrupts are disabled.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b1</field_value>
        <field_value_description>
          <para>Virtual Group 0 interrupts are 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="32">
  <fieldat id="fieldset_0-31_24" msb="31" lsb="24"/>
  <fieldat id="fieldset_0-23_21" msb="23" lsb="21"/>
  <fieldat id="fieldset_0-20_18" msb="20" lsb="18"/>
  <fieldat id="fieldset_0-17_10" msb="17" lsb="10"/>
  <fieldat id="fieldset_0-9_9" msb="9" lsb="9"/>
  <fieldat id="fieldset_0-8_5" msb="8" lsb="5"/>
  <fieldat id="fieldset_0-4_4" msb="4" lsb="4"/>
  <fieldat id="fieldset_0-3_3" msb="3" 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 EL2 is using System register access, EL1 using either System register or memory-mapped access must be supported.</para>
      </access_permission_text>





    
        
        <access_mechanism accessor="MRC ICH_VMCR" 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="0b100"/>
                
                <enc n="CRn" v="0b1100"/>
                
                <enc n="CRm" v="0b1011"/>
                
                <enc n="opc2" v="0b111"/>
            </encoding>
            <access_permission>
                <ps name="MRC" sections="1" secttype="access_permission">
                <pstext>
if !(IsFeatureImplemented(FEAT_AA32EL2) &amp;&amp; IsFeatureImplemented(FEAT_GICv3) &amp;&amp; (HaveEL(EL2) || HaveEL(EL3))) 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_VMCR();
    end;
elsif PSTATE.EL == EL3 then
    if ICC_MSRE().SRE == '0' then
        Undefined();
    else
        R(t) = ICH_VMCR();
    end;
end;
                </pstext>
                </ps>
            </access_permission>
        </access_mechanism>
    
        
        <access_mechanism accessor="MCR ICH_VMCR" 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="0b100"/>
                
                <enc n="CRn" v="0b1100"/>
                
                <enc n="CRm" v="0b1011"/>
                
                <enc n="opc2" v="0b111"/>
            </encoding>
            <access_permission>
                <ps name="MCR" sections="1" secttype="access_permission">
                <pstext>
if !(IsFeatureImplemented(FEAT_AA32EL2) &amp;&amp; IsFeatureImplemented(FEAT_GICv3) &amp;&amp; (HaveEL(EL2) || HaveEL(EL3))) 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_VMCR() = R(t);
    end;
elsif PSTATE.EL == EL3 then
    if ICC_MSRE().SRE == '0' then
        Undefined();
    else
        ICH_VMCR() = 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>