res0 |= ICH_HCR_EL2_DVIM | ICH_HCR_EL2_vSGIEOICount;
        set_sysreg_masks(kvm, ICH_HCR_EL2, res0, res1);
 
+       /* VNCR_EL2 */
+       set_sysreg_masks(kvm, VNCR_EL2, VNCR_EL2_RES0, VNCR_EL2_RES1);
+
 out:
        for (enum vcpu_sysreg sr = __SANITISED_REG_START__; sr < NR_SYS_REGS; sr++)
                (void)__vcpu_sys_reg(vcpu, sr);
 
                        "trap of EL2 register redirected to EL1");
 }
 
-#define EL2_REG(name, acc, rst, v) {           \
-       SYS_DESC(SYS_##name),                   \
-       .access = acc,                          \
-       .reset = rst,                           \
-       .reg = name,                            \
-       .visibility = el2_visibility,           \
-       .val = v,                               \
-}
-
 #define EL2_REG_FILTERED(name, acc, rst, v, filter) {  \
        SYS_DESC(SYS_##name),                   \
        .access = acc,                          \
        .val = v,                               \
 }
 
+#define EL2_REG(name, acc, rst, v)                     \
+       EL2_REG_FILTERED(name, acc, rst, v, el2_visibility)
+
 #define EL2_REG_VNCR(name, rst, v)     EL2_REG(name, bad_vncr_trap, rst, v)
 #define EL2_REG_REDIR(name, rst, v)    EL2_REG(name, bad_redir_trap, rst, v)
 
        return __el2_visibility(vcpu, rd, sve_visibility);
 }
 
+static unsigned int vncr_el2_visibility(const struct kvm_vcpu *vcpu,
+                                       const struct sys_reg_desc *rd)
+{
+       if (el2_visibility(vcpu, rd) == 0 &&
+           kvm_has_feat(vcpu->kvm, ID_AA64MMFR4_EL1, NV_frac, NV2_ONLY))
+               return 0;
+
+       return REG_HIDDEN;
+}
+
 static bool access_zcr_el2(struct kvm_vcpu *vcpu,
                           struct sys_reg_params *p,
                           const struct sys_reg_desc *r)
                         tcr2_el2_visibility),
        EL2_REG_VNCR(VTTBR_EL2, reset_val, 0),
        EL2_REG_VNCR(VTCR_EL2, reset_val, 0),
+       EL2_REG_FILTERED(VNCR_EL2, bad_vncr_trap, reset_val, 0,
+                        vncr_el2_visibility),
 
        { SYS_DESC(SYS_DACR32_EL2), undef_access, reset_unknown, DACR32_EL2 },
        EL2_REG_VNCR(HDFGRTR_EL2, reset_val, 0),