static bool s1pie_enabled(struct kvm_vcpu *vcpu, enum trans_regime regime)
 {
-       if (!kvm_has_feat(vcpu->kvm, ID_AA64MMFR3_EL1, S1PIE, IMP))
+       if (!kvm_has_s1pie(vcpu->kvm))
                return false;
 
        switch (regime) {
        write_sysreg_el1(vcpu_read_sys_reg(vcpu, MAIR_EL1),     SYS_MAIR);
        if (kvm_has_tcr2(vcpu->kvm)) {
                write_sysreg_el1(vcpu_read_sys_reg(vcpu, TCR2_EL1), SYS_TCR2);
-               if (kvm_has_feat(vcpu->kvm, ID_AA64MMFR3_EL1, S1PIE, IMP)) {
+               if (kvm_has_s1pie(vcpu->kvm)) {
                        write_sysreg_el1(vcpu_read_sys_reg(vcpu, PIR_EL1), SYS_PIR);
                        write_sysreg_el1(vcpu_read_sys_reg(vcpu, PIRE0_EL1), SYS_PIRE0);
                }
 
                res0 |= (HFGxTR_EL2_nSMPRI_EL1 | HFGxTR_EL2_nTPIDR2_EL0);
        if (!kvm_has_feat(kvm, ID_AA64PFR1_EL1, THE, IMP))
                res0 |= HFGxTR_EL2_nRCWMASK_EL1;
-       if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1PIE, IMP))
+       if (!kvm_has_s1pie(kvm))
                res0 |= (HFGxTR_EL2_nPIRE0_EL1 | HFGxTR_EL2_nPIR_EL1);
        if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1POE, IMP))
                res0 |= (HFGxTR_EL2_nPOR_EL0 | HFGxTR_EL2_nPOR_EL1);
                res0 |= TCR2_EL2_AIE;
        if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1POE, IMP))
                res0 |= TCR2_EL2_POE | TCR2_EL2_E0POE;
-       if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1PIE, IMP))
+       if (!kvm_has_s1pie(kvm))
                res0 |= TCR2_EL2_PIE;
        if (!kvm_has_feat(kvm, ID_AA64MMFR1_EL1, VH, IMP))
                res0 |= (TCR2_EL2_E0POE | TCR2_EL2_D128 |
 
                                  struct sys_reg_params *p,
                                  const struct sys_reg_desc *r)
 {
-       if (!kvm_has_feat(vcpu->kvm, ID_AA64MMFR3_EL1, S1PIE, IMP)) {
+       if (!kvm_has_s1pie(vcpu->kvm)) {
                kvm_inject_undefined(vcpu);
                return false;
        }
        return __el2_visibility(vcpu, rd, tcr2_visibility);
 }
 
+static unsigned int s1pie_visibility(const struct kvm_vcpu *vcpu,
+                                    const struct sys_reg_desc *rd)
+{
+       if (kvm_has_s1pie(vcpu->kvm))
+               return 0;
+
+       return REG_HIDDEN;
+}
+
+static unsigned int s1pie_el2_visibility(const struct kvm_vcpu *vcpu,
+                                        const struct sys_reg_desc *rd)
+{
+       return __el2_visibility(vcpu, rd, s1pie_visibility);
+}
+
 /*
  * Architected system registers.
  * Important: Must be sorted ascending by Op0, Op1, CRn, CRm, Op2
        { SYS_DESC(SYS_PMMIR_EL1), trap_raz_wi },
 
        { SYS_DESC(SYS_MAIR_EL1), access_vm_reg, reset_unknown, MAIR_EL1 },
-       { SYS_DESC(SYS_PIRE0_EL1), NULL, reset_unknown, PIRE0_EL1 },
-       { SYS_DESC(SYS_PIR_EL1), NULL, reset_unknown, PIR_EL1 },
+       { SYS_DESC(SYS_PIRE0_EL1), NULL, reset_unknown, PIRE0_EL1,
+         .visibility = s1pie_visibility },
+       { SYS_DESC(SYS_PIR_EL1), NULL, reset_unknown, PIR_EL1,
+         .visibility = s1pie_visibility },
        { SYS_DESC(SYS_POR_EL1), NULL, reset_unknown, POR_EL1,
          .visibility = s1poe_visibility },
        { SYS_DESC(SYS_AMAIR_EL1), access_vm_reg, reset_amair_el1, AMAIR_EL1 },
        EL2_REG(HPFAR_EL2, access_rw, reset_val, 0),
 
        EL2_REG(MAIR_EL2, access_rw, reset_val, 0),
-       EL2_REG(PIRE0_EL2, check_s1pie_access_rw, reset_val, 0),
-       EL2_REG(PIR_EL2, check_s1pie_access_rw, reset_val, 0),
+       EL2_REG_FILTERED(PIRE0_EL2, check_s1pie_access_rw, reset_val, 0,
+                        s1pie_el2_visibility),
+       EL2_REG_FILTERED(PIR_EL2, check_s1pie_access_rw, reset_val, 0,
+                        s1pie_el2_visibility),
        EL2_REG(AMAIR_EL2, access_rw, reset_val, 0),
 
        EL2_REG(VBAR_EL2, access_rw, reset_val, 0),
                kvm->arch.fgu[HFGITR_GROUP] |= (HFGITR_EL2_ATS1E1RP |
                                                HFGITR_EL2_ATS1E1WP);
 
-       if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1PIE, IMP))
+       if (!kvm_has_s1pie(kvm))
                kvm->arch.fgu[HFGxTR_GROUP] |= (HFGxTR_EL2_nPIRE0_EL1 |
                                                HFGxTR_EL2_nPIR_EL1);