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



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




          <reg_reset_value></reg_reset_value>

      <reg_mappings>
        



    
      
      <reg_mapping>
        
  

    

  

    <mapped_name filename="AArch32-ich_vmcr.xml">ICH_VMCR</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>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>
      <configuration_text>
        <para>This register has no effect if EL2 is not enabled in the current Security state.</para>
      </configuration_text>

      </reg_configuration>
      
      
        
      <reg_attributes>
          
    
      <attributes_text>
        <para>ICH_VMCR_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_32" 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>32</field_lsb>
    <rel_range>63:32</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-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="AArch64" id="AArch64-icv_pmr_el1.xml">ICV_PMR_EL1</register_link>.Priority.</para></field_description>
  </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_EL2.VCBPR == 1.</para>
<para>This field is an alias of <register_link state="AArch64" id="AArch64-icv_bpr0_el1.xml">ICV_BPR0_EL1</register_link>.BinaryPoint.</para>
<para>The minimum value of this field is determined by <register_link state="AArch64" id="AArch64-ich_vtr_el2.xml">ICH_VTR_EL2</register_link>.PREbits. An attempt to program the binary point field to a value less than the minimum value sets the field to the minimum value.</para></field_description>
  </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="AArch64" id="AArch64-ich_vmcr_el2.xml">ICH_VMCR_EL2</register_link>.VCBPR == 0.</para>
<para>This field is an alias of <register_link state="AArch64" id="AArch64-icv_bpr1_el1.xml">ICV_BPR1_EL1</register_link>.BinaryPoint.</para>
<para>This field is always accessible to EL2 accesses, regardless of the setting of the ICH_VMCR_EL2.VCBPR field.</para>
<para>For Non-secure writes, the minimum value of this field is the minimum value of ICH_VMCR_EL2.VBPR0 plus one.</para>
<para>For Secure writes, the minimum value of this field is the minimum value of ICH_VMCR_EL2.VBPR0.</para>
<para>An attempt to program the binary point field to a value less than the minimum value sets the field to the minimum value.</para></field_description>
  </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="AArch64" id="AArch64-icv_ctlr_el1.xml">ICV_CTLR_EL1</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="AArch64" id="AArch64-icv_eoir0_el1.xml">ICV_EOIR0_EL1</register_link> and <register_link state="AArch64" id="AArch64-icv_eoir1_el1.xml">ICV_EOIR1_EL1</register_link> provide both priority drop and interrupt deactivation functionality. Accesses to <register_link state="AArch64" id="AArch64-icv_dir_el1.xml">ICV_DIR_EL1</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="AArch64" id="AArch64-icv_eoir0_el1.xml">ICV_EOIR0_EL1</register_link> and <register_link state="AArch64" id="AArch64-icv_eoir1_el1.xml">ICV_EOIR1_EL1</register_link> provide priority drop functionality only. <register_link state="AArch64" id="AArch64-icv_dir_el1.xml">ICV_DIR_EL1</register_link> provides interrupt deactivation functionality.</para>
        </field_value_description>
      </field_value_instance>
    </field_values>
  </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="AArch64" id="AArch64-icv_ctlr_el1.xml">ICV_CTLR_EL1</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="AArch64" id="AArch64-icv_bpr1_el1.xml">ICV_BPR1_EL1</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="AArch64" id="AArch64-icv_bpr0_el1.xml">ICV_BPR0_EL1</register_link> determines the preemption group for virtual Group 1 interrupts.</para>
        </field_value_description>
      </field_value_instance>
    </field_values>
  </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="AArch64" id="AArch64-icc_sre_el1.xml">ICC_SRE_EL1</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>
  <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="AArch64" id="AArch64-icc_sre_el1.xml">ICC_SRE_EL1</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>
  <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="AArch64" id="AArch64-icv_igrpen1_el1.xml">ICV_IGRPEN1_EL1</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>
  <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="AArch64" id="AArch64-icv_igrpen0_el1.xml">ICV_IGRPEN0_EL1</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>
  <text_after_fields/>
</fields>




<reg_fieldset length="64">
  <fieldat id="fieldset_0-63_32" msb="63" lsb="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="MRS ICH_VMCR_EL2" type="SystemAccessor">
            <encoding>
            <access_instruction>MRS &lt;Xt&gt;, ICH_VMCR_EL2</access_instruction>
                
                <enc n="op0" v="0b11"/>
                
                <enc n="op1" v="0b100"/>
                
                <enc n="CRn" v="0b1100"/>
                
                <enc n="CRm" v="0b1011"/>
                
                <enc n="op2" v="0b111"/>
            </encoding>
            <access_permission>
                <ps name="MRS" sections="1" secttype="access_permission">
                <pstext>
if !(IsFeatureImplemented(FEAT_GICv3) &amp;&amp; (HaveEL(EL2) || HaveEL(EL3)) &amp;&amp; IsFeatureImplemented(FEAT_AA64)) then
    Undefined();
elsif PSTATE.EL == EL0 then
    Undefined();
elsif PSTATE.EL == EL1 then
    if EffectiveHCR_EL2_NVx() IN {'1x1'} then
        X{64}(t) = NVMem(0x4C8);
    elsif EffectiveHCR_EL2_NVx() IN {'xx1'} then
        AArch64_SystemAccessTrap(EL2, 0x18);
    else
        Undefined();
    end;
elsif PSTATE.EL == EL2 then
    if ICC_SRE_EL2().SRE == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    else
        X{64}(t) = ICH_VMCR_EL2();
    end;
elsif PSTATE.EL == EL3 then
    if ICC_SRE_EL3().SRE == '0' then
        AArch64_SystemAccessTrap(EL3, 0x18);
    else
        X{64}(t) = ICH_VMCR_EL2();
    end;
end;
                </pstext>
                </ps>
            </access_permission>
        </access_mechanism>
    
        
        <access_mechanism accessor="MSRregister ICH_VMCR_EL2" type="SystemAccessor">
            <encoding>
            <access_instruction>MSR ICH_VMCR_EL2, &lt;Xt&gt;</access_instruction>
                
                <enc n="op0" v="0b11"/>
                
                <enc n="op1" v="0b100"/>
                
                <enc n="CRn" v="0b1100"/>
                
                <enc n="CRm" v="0b1011"/>
                
                <enc n="op2" v="0b111"/>
            </encoding>
            <access_permission>
                <ps name="MSRregister" sections="1" secttype="access_permission">
                <pstext>
if !(IsFeatureImplemented(FEAT_GICv3) &amp;&amp; (HaveEL(EL2) || HaveEL(EL3)) &amp;&amp; IsFeatureImplemented(FEAT_AA64)) then
    Undefined();
elsif PSTATE.EL == EL0 then
    Undefined();
elsif PSTATE.EL == EL1 then
    if EffectiveHCR_EL2_NVx() IN {'1x1'} then
        NVMem(0x4C8) = X{64}(t);
    elsif EffectiveHCR_EL2_NVx() IN {'xx1'} then
        AArch64_SystemAccessTrap(EL2, 0x18);
    else
        Undefined();
    end;
elsif PSTATE.EL == EL2 then
    if ICC_SRE_EL2().SRE == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    else
        ICH_VMCR_EL2() = X{64}(t);
    end;
elsif PSTATE.EL == EL3 then
    if ICC_SRE_EL3().SRE == '0' then
        AArch64_SystemAccessTrap(EL3, 0x18);
    else
        ICH_VMCR_EL2() = X{64}(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>