--- sys/dev/hwpmc/hwpmc_mod.c.orig
+++ sys/dev/hwpmc/hwpmc_mod.c
@@ -210,7 +210,6 @@
 static bool	pmc_can_allocate_row(int ri, enum pmc_mode mode);
 static bool	pmc_can_allocate_rowindex(struct proc *p, unsigned int ri,
     int cpu);
-static bool	pmc_can_attach(struct pmc *pm, struct proc *p);
 static void	pmc_capture_user_callchain(int cpu, int soft,
     struct trapframe *tf);
 static void	pmc_cleanup(void);
@@ -1023,60 +1022,6 @@
 	}
 }
 
-/*
- * Check if PMC 'pm' may be attached to target process 't'.
- */
-
-static bool
-pmc_can_attach(struct pmc *pm, struct proc *t)
-{
-	struct proc *o;		/* pmc owner */
-	struct ucred *oc, *tc;	/* owner, target credentials */
-	bool decline_attach;
-
-	/*
-	 * A PMC's owner can always attach that PMC to itself.
-	 */
-
-	if ((o = pm->pm_owner->po_owner) == t)
-		return (true);
-
-	PROC_LOCK(o);
-	oc = o->p_ucred;
-	crhold(oc);
-	PROC_UNLOCK(o);
-
-	PROC_LOCK(t);
-	tc = t->p_ucred;
-	crhold(tc);
-	PROC_UNLOCK(t);
-
-	/*
-	 * The effective uid of the PMC owner should match at least one
-	 * of the {effective,real,saved} uids of the target process.
-	 */
-
-	decline_attach = oc->cr_uid != tc->cr_uid &&
-	    oc->cr_uid != tc->cr_svuid &&
-	    oc->cr_uid != tc->cr_ruid;
-
-	/*
-	 * Every one of the target's group ids, must be in the owner's
-	 * group list.
-	 */
-	for (int i = 0; !decline_attach && i < tc->cr_ngroups; i++)
-		decline_attach = !groupmember(tc->cr_groups[i], oc);
-	if (!decline_attach)
-		decline_attach = !groupmember(tc->cr_gid, oc) ||
-		    !groupmember(tc->cr_rgid, oc) ||
-		    !groupmember(tc->cr_svgid, oc);
-
-	crfree(tc);
-	crfree(oc);
-
-	return (!decline_attach);
-}
-
 /*
  * Attach a process to a PMC.
  */
@@ -1409,10 +1354,19 @@
 	 */
 	for (ri = 0; ri < md->pmd_npmc; ri++) {
 		if ((pm = pp->pp_pmcs[ri].pp_pmc) != NULL) {
-			if (pmc_can_attach(pm, td->td_proc)) {
+			struct proc *owner;
+			struct ucred *cred;
+
+			owner = pm->pm_owner->po_owner;
+			PROC_LOCK(owner);
+			cred = crhold(owner->p_ucred);
+			PROC_UNLOCK(owner);
+
+			if (priv_check_cred(cred, PRIV_DEBUG_DIFFCRED) != 0)
 				pmc_detach_one_process(td->td_proc, pm,
 				    PMC_FLAG_NONE);
-			}
+
+			crfree(cred);
 		}
 	}
 
@@ -1425,10 +1379,8 @@
 	 * PMCs, we can remove the process entry and free
 	 * up space.
 	 */
-	if (pp->pp_refcnt == 0) {
-		pmc_remove_process_descriptor(pp);
+	if (pp->pp_refcnt == 0)
 		pmc_destroy_process_descriptor(pp);
-	}
 }
 
 /*
--- sys/kern/kern_exec.c.orig
+++ sys/kern/kern_exec.c
@@ -1008,7 +1008,7 @@
 	 */
 	if (PMC_SYSTEM_SAMPLING_ACTIVE() || PMC_PROC_IS_USING_PMCS(p)) {
 		VOP_UNLOCK(imgp->vp);
-		pe.pm_credentialschanged = credential_changing;
+		pe.pm_credentialschanged = imgp->credential_setid;
 		pe.pm_baseaddr = imgp->reloc_base;
 		pe.pm_dynaddr = imgp->et_dyn_addr;
 
