CGT_MDCR_E2TB,
        CGT_MDCR_TDCC,
  
 +      CGT_CPACR_E0POE,
 +      CGT_CPTR_TAM,
 +      CGT_CPTR_TCPAC,
 +
+       CGT_HCRX_TCR2En,
+ 
        /*
         * Anything after this point is a combination of coarse trap
         * controls, which must all be evaluated to decide what to do.
                .mask           = MDCR_EL2_TDCC,
                .behaviour      = BEHAVE_FORWARD_ANY,
        },
 +      [CGT_CPACR_E0POE] = {
 +              .index          = CPTR_EL2,
 +              .value          = CPACR_ELx_E0POE,
 +              .mask           = CPACR_ELx_E0POE,
 +              .behaviour      = BEHAVE_FORWARD_ANY,
 +      },
 +      [CGT_CPTR_TAM] = {
 +              .index          = CPTR_EL2,
 +              .value          = CPTR_EL2_TAM,
 +              .mask           = CPTR_EL2_TAM,
 +              .behaviour      = BEHAVE_FORWARD_ANY,
 +      },
 +      [CGT_CPTR_TCPAC] = {
 +              .index          = CPTR_EL2,
 +              .value          = CPTR_EL2_TCPAC,
 +              .mask           = CPTR_EL2_TCPAC,
 +              .behaviour      = BEHAVE_FORWARD_ANY,
 +      },
+       [CGT_HCRX_TCR2En] = {
+               .index          = HCRX_EL2,
+               .value          = 0,
+               .mask           = HCRX_EL2_TCR2En,
+               .behaviour      = BEHAVE_FORWARD_ANY,
+       },
  };
  
  #define MCB(id, ...)                                          \
 
         */
        if (!kvm_has_feat(kvm, ID_AA64ISAR0_EL1, TLB, OS))
                vcpu->arch.hcr_el2 |= HCR_TTLBOS;
 +}
 +
 +void kvm_calculate_traps(struct kvm_vcpu *vcpu)
 +{
 +      struct kvm *kvm = vcpu->kvm;
 +
 +      mutex_lock(&kvm->arch.config_lock);
 +      vcpu_set_hcr(vcpu);
  
        if (cpus_have_final_cap(ARM64_HAS_HCX)) {
-               vcpu->arch.hcrx_el2 = HCRX_GUEST_FLAGS;
+               /*
+                * In general, all HCRX_EL2 bits are gated by a feature.
+                * The only reason we can set SMPME without checking any
+                * feature is that its effects are not directly observable
+                * from the guest.
+                */
+               vcpu->arch.hcrx_el2 = HCRX_EL2_SMPME;
  
                if (kvm_has_feat(kvm, ID_AA64ISAR2_EL1, MOPS, IMP))
                        vcpu->arch.hcrx_el2 |= (HCRX_EL2_MSCEn | HCRX_EL2_MCE2);