PMCNTENSET_EL0, /* Count Enable Set Register */
        PMINTENSET_EL1, /* Interrupt Enable Set Register */
        PMOVSSET_EL0,   /* Overflow Flag Status Set Register */
-       PMSWINC_EL0,    /* Software Increment Register */
        PMUSERENR_EL0,  /* User Enable Register */
 
        /* Pointer Authentication Registers in a strict increasing order. */
 
        return __set_id_reg(vcpu, rd, uaddr, true);
 }
 
+static int set_wi_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
+                     const struct kvm_one_reg *reg, void __user *uaddr)
+{
+       int err;
+       u64 val;
+
+       /* Perform the access even if we are going to ignore the value */
+       err = reg_from_user(&val, uaddr, sys_reg_to_index(rd));
+       if (err)
+               return err;
+
+       return 0;
+}
+
 static bool access_ctr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
                       const struct sys_reg_desc *r)
 {
          .access = access_pmcnten, .reg = PMCNTENSET_EL0 },
        { PMU_SYS_REG(SYS_PMOVSCLR_EL0),
          .access = access_pmovs, .reg = PMOVSSET_EL0 },
+       /*
+        * PM_SWINC_EL0 is exposed to userspace as RAZ/WI, as it was
+        * previously (and pointlessly) advertised in the past...
+        */
        { PMU_SYS_REG(SYS_PMSWINC_EL0),
-         .access = access_pmswinc, .reg = PMSWINC_EL0 },
+         .get_user = get_raz_id_reg, .set_user = set_wi_reg,
+         .access = access_pmswinc, .reset = NULL },
        { PMU_SYS_REG(SYS_PMSELR_EL0),
          .access = access_pmselr, .reset = reset_pmselr, .reg = PMSELR_EL0 },
        { PMU_SYS_REG(SYS_PMCEID0_EL0),