<?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>HPFAR_EL2</reg_short_name>
        
        <reg_long_name>Hypervisor IPA Fault Address Register</reg_long_name>



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




          <reg_reset_value></reg_reset_value>

      <reg_mappings>
        



    
      
      <reg_mapping>
        
  

    

  

    <mapped_name filename="AArch32-hpfar.xml">HPFAR</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>Holds the faulting IPA for some aborts on a stage 2 translation taken to EL2 and GPC exceptions due to a fault on an access for a stage 2 translation.</para>
      </purpose_text>

        </reg_purpose>

      <reg_groups>
            <reg_group>Virt</reg_group>
            <reg_group>Exception</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>
      <configuration_text>
        <para>The HPFAR_EL2 is written for:</para>

      </configuration_text>
      <configuration_text>
        <list type="unordered">
<listitem><content>A Translation fault, Access Flag fault, or Address Size fault on a stage 2 translation not on a stage 1 translation table walk.</content>
</listitem><listitem><content>A Translation fault, Access Flag fault, Address Size fault, or Permission fault on stage 2 translation of an address accessed in a stage 1 translation table walk.</content>
</listitem><listitem><content>If <xref linkend="#FEAT_RME">FEAT_RME</xref> is implemented, a Granule Protection Check fault in the second stage of translation.</content>
</listitem></list>

      </configuration_text>
      <configuration_text>
        <para>For all other exceptions taken to EL2, this register is <arm-defined-word>UNKNOWN</arm-defined-word>.</para>

      </configuration_text>
      <configuration_text>
        <note><para>The address held in this register is an address accessed by the instruction fetch or data access that caused the exception that gave rise to the Instruction Abort exception or Data Abort exception. It is the lower address that gave rise to the fault that is reported. Where different faults from different addresses arise from the same instruction, such as for an instruction that loads or stores an unaligned address that crosses a page boundary, the architecture does not prioritize which fault is reported.</para></note>
      </configuration_text>

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

      </reg_attributes>
      <reg_fieldsets>
        






<fields id="fieldset_0" length="64">
  <text_before_fields>
    <para>Execution at EL1 or EL0 makes HPFAR_EL2 become <arm-defined-word>UNKNOWN</arm-defined-word>.</para>
  </text_before_fields>
  <field id="fieldset_0-63_63-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" reserved_type="RES0">
    <field_name>NS</field_name>
    <field_msb>63</field_msb>
    <field_lsb>63</field_lsb>
    <rel_range>0</rel_range>
    <field_description order="before">
      <para>Faulting IPA address space.</para>
    </field_description>
    <field_description order="after"><para>For Data Abort exceptions or Instruction Abort exceptions taken to Non-secure EL2:</para>
<list type="unordered">
<listitem><content>This field is <arm-defined-word>RES0</arm-defined-word>.</content>
</listitem><listitem><content>The address is from the Non-secure IPA space.</content>
</listitem></list>
<para>If <xref linkend="#FEAT_RME">FEAT_RME</xref> is implemented, for Data Abort exceptions or Instruction Abort exceptions taken to Realm EL2:</para>
<list type="unordered">
<listitem><content>This field is <arm-defined-word>RES0</arm-defined-word>.</content>
</listitem><listitem><content>The address is from the Realm IPA space.</content>
</listitem></list></field_description>
    <field_values impdef="False">
      <field_value_instance>
        <field_value>0b0</field_value>
        <field_value_description>
          <para>Faulting IPA is from the Secure IPA space.</para>
        </field_value_description>
      </field_value_instance>
      <field_value_instance>
        <field_value>0b1</field_value>
        <field_value_description>
          <para>Faulting IPA is from the Non-secure IPA space.</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>
    <fields_condition>When FEAT_SEL2 is implemented</fields_condition>
  </field>
  <field id="fieldset_0-63_63-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" rwtype="RES0">
    <field_msb>63</field_msb>
    <field_lsb>63</field_lsb>
    <rel_range>63</rel_range>
    <field_description order="before"/>
    <field_description order="before">
      <para>Reserved, <arm-defined-word>RES0</arm-defined-word>.</para>
    </field_description>
    <fields_condition>Otherwise</fields_condition>
  </field>
  <field id="fieldset_0-62_48" 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>62</field_msb>
    <field_lsb>48</field_lsb>
    <rel_range>62:48</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-47_4" has_partial_fieldset="True" 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>FIPA</field_name>
    <field_msb>47</field_msb>
    <field_lsb>4</field_lsb>
    <rel_range>47:4</rel_range>
    <field_description order="before"/>
    <partial_fieldset>
      <fields id="fieldset_0-47_4_0" length="44">
        <fields_condition>When FEAT_D128 is implemented</fields_condition>
        <text_before_fields/>
        <field id="fieldset_0-47_4_0-43_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>FIPA</field_name>
          <field_msb>43</field_msb>
          <field_lsb>0</field_lsb>
          <rel_range>43:0</rel_range>
          <field_description order="before"><para>Bits [55:12] of the Faulting Intermediate Physical Address.</para>
<para>For implementations with fewer than 55 physical address bits, the corresponding upper bits in this field are <arm-defined-word>RES0</arm-defined-word>.</para>
<para>When <xref linkend="#FEAT_MOPS">FEAT_MOPS</xref> is implemented, the value presented in FIPA on a synchronous exception that set the HPFAR_EL2 from any of the Memory Copy and Memory Set instructions is within the address range of the current stage 2 translation granule, aligned to the size of the current stage 2 translation granule, of the address that generated the Data abort. In this case, bits[(n-1):0] of the value are <arm-defined-word>UNKNOWN</arm-defined-word>, where 2<sup>n</sup> is the current stage 2 translation granule size in bytes.</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="44">
        <fields_condition>When FEAT_D128 is implemented</fields_condition>
        <fieldat id="fieldset_0-47_4_0-43_0" msb="43" lsb="0"/>
      </reg_fieldset>
    </partial_fieldset>
    <partial_fieldset>
      <fields id="fieldset_0-47_4_1" length="44">
        <fields_condition>When FEAT_LPA is implemented and FEAT_D128 is not implemented</fields_condition>
        <text_before_fields/>
        <field id="fieldset_0-47_4_1-43_40" 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>43</field_msb>
          <field_lsb>40</field_lsb>
          <rel_range>43:40</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-47_4_1-39_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>FIPA</field_name>
          <field_msb>39</field_msb>
          <field_lsb>0</field_lsb>
          <rel_range>39:0</rel_range>
          <field_description order="before"><para>Bits [51:12] of the Faulting Intermediate Physical Address.</para>
<para>For implementations with fewer than 52 physical address bits, the corresponding upper bits in this field are <arm-defined-word>RES0</arm-defined-word>.</para>
<para>When <xref linkend="#FEAT_MOPS">FEAT_MOPS</xref> is implemented, the value presented in FIPA on a synchronous exception that set the HPFAR_EL2 from any of the Memory Copy and Memory Set instructions is within the address range of the current stage 2 translation granule, aligned to the size of the current stage 2 translation granule, of the address that generated the Data abort. In this case, bits[(n-1):0] of the value are <arm-defined-word>UNKNOWN</arm-defined-word>, where 2<sup>n</sup> is the current stage 2 translation granule size in bytes.</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="44">
        <fields_condition>When FEAT_LPA is implemented and FEAT_D128 is not implemented</fields_condition>
        <fieldat id="fieldset_0-47_4_1-43_40" msb="43" lsb="40"/>
        <fieldat id="fieldset_0-47_4_1-39_0" msb="39" lsb="0"/>
      </reg_fieldset>
    </partial_fieldset>
    <partial_fieldset>
      <fields id="fieldset_0-47_4_2" length="44">
        <fields_condition>When FEAT_LPA is not implemented</fields_condition>
        <text_before_fields/>
        <field id="fieldset_0-47_4_2-43_36" 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>43</field_msb>
          <field_lsb>36</field_lsb>
          <rel_range>43:36</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-47_4_2-35_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>FIPA</field_name>
          <field_msb>35</field_msb>
          <field_lsb>0</field_lsb>
          <rel_range>35:0</rel_range>
          <field_description order="before"><para>Bits[47:12] Faulting Intermediate Physical Address.</para>
<para>For implementations with fewer than 48 physical address bits, the corresponding upper bits in this field are <arm-defined-word>RES0</arm-defined-word>.</para>
<para>When <xref linkend="#FEAT_MOPS">FEAT_MOPS</xref> is implemented, the value presented in FIPA on a synchronous exception that set the HPFAR_EL2 from any of the Memory Copy and Memory Set instructions is within the address range of the current stage 2 translation granule, aligned to the size of the current stage 2 translation granule, of the address that generated the Data abort. In this case, bits[(n-1):0] of the value are <arm-defined-word>UNKNOWN</arm-defined-word>, where 2<sup>n</sup> is the current stage 2 translation granule size in bytes.</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="44">
        <fields_condition>When FEAT_LPA is not implemented</fields_condition>
        <fieldat id="fieldset_0-47_4_2-43_36" msb="43" lsb="36"/>
        <fieldat id="fieldset_0-47_4_2-35_0" msb="35" lsb="0"/>
      </reg_fieldset>
    </partial_fieldset>
  </field>
  <field id="fieldset_0-3_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" rwtype="RES0">
    <field_msb>3</field_msb>
    <field_lsb>0</field_lsb>
    <rel_range>3:0</rel_range>
    <field_description order="before"/>
    <field_description order="before">
      <para>Reserved, <arm-defined-word>RES0</arm-defined-word>.</para>
    </field_description>
  </field>
  <text_after_fields/>
</fields>




<reg_fieldset length="64">
  <fieldat id="fieldset_0-63_63-1" msb="63" lsb="63"/>
  <fieldat id="fieldset_0-62_48" msb="62" lsb="48"/>
  <fieldat id="fieldset_0-47_4" msb="47" lsb="4"/>
  <fieldat id="fieldset_0-3_0" msb="3" lsb="0"/>
</reg_fieldset>


      </reg_fieldsets>

      <access_mechanisms>
          






    
        
        <access_mechanism accessor="MRS HPFAR_EL2" type="SystemAccessor">
            <encoding>
            <access_instruction>MRS &lt;Xt&gt;, HPFAR_EL2</access_instruction>
                
                <enc n="op0" v="0b11"/>
                
                <enc n="op1" v="0b100"/>
                
                <enc n="CRn" v="0b0110"/>
                
                <enc n="CRm" v="0b0000"/>
                
                <enc n="op2" v="0b100"/>
            </encoding>
            <access_permission>
                <ps name="MRS" sections="1" secttype="access_permission">
                <pstext>
if !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) = HPFAR_EL2();
elsif PSTATE.EL == EL3 then
    X{64}(t) = HPFAR_EL2();
end;
                </pstext>
                </ps>
            </access_permission>
        </access_mechanism>
    
        
        <access_mechanism accessor="MSRregister HPFAR_EL2" type="SystemAccessor">
            <encoding>
            <access_instruction>MSR HPFAR_EL2, &lt;Xt&gt;</access_instruction>
                
                <enc n="op0" v="0b11"/>
                
                <enc n="op1" v="0b100"/>
                
                <enc n="CRn" v="0b0110"/>
                
                <enc n="CRm" v="0b0000"/>
                
                <enc n="op2" v="0b100"/>
            </encoding>
            <access_permission>
                <ps name="MSRregister" sections="1" secttype="access_permission">
                <pstext>
if !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
    HPFAR_EL2() = X{64}(t);
elsif PSTATE.EL == EL3 then
    HPFAR_EL2() = 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>