? sys/arch/amd64/conf/KUBSAN ? sys/external/bsd/drm2/include/asm/bug.h.2 Index: sys/arch/amd64/conf/GENERIC =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/conf/GENERIC,v retrieving revision 1.535 diff -u -r1.535 GENERIC --- sys/arch/amd64/conf/GENERIC 14 Sep 2019 06:57:51 -0000 1.535 +++ sys/arch/amd64/conf/GENERIC 2 Oct 2019 23:25:59 -0000 @@ -104,7 +104,7 @@ # Because gcc omits the frame pointer for any -O level, the line below # is needed to make backtraces in DDB work. # -makeoptions COPTS="-O2 -fno-omit-frame-pointer" +makeoptions COPTS="-O0 -fno-inline -fno-omit-frame-pointer" options DDB # in-kernel debugger #options DDB_COMMANDONENTER="bt" # execute command when ddb is entered #options DDB_ONPANIC=1 # see also sysctl(7): `ddb.onpanic' Index: sys/compat/linux/common/linux_sched.c =================================================================== RCS file: /cvsroot/src/sys/compat/linux/common/linux_sched.c,v retrieving revision 1.71 diff -u -r1.71 linux_sched.c --- sys/compat/linux/common/linux_sched.c 16 Apr 2018 14:51:59 -0000 1.71 +++ sys/compat/linux/common/linux_sched.c 2 Oct 2019 23:26:02 -0000 @@ -255,7 +255,7 @@ mutex_enter(p->p_lock); lwp_lock(l2); spc = &l2->l_cpu->ci_schedstate; - if ((l->l_flag & (LW_WREBOOT | LW_WSUSPEND | LW_WEXIT)) == 0) { + if ((l->l_flag & (LW_WREBOOT | LW_DBGSUSPEND | LW_WSUSPEND | LW_WEXIT)) == 0) { if (p->p_stat == SSTOP || (p->p_sflag & PS_STOPPING) != 0) { KASSERT(l2->l_wchan == NULL); l2->l_stat = LSSTOP; Index: sys/kern/kern_exit.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_exit.c,v retrieving revision 1.276 diff -u -r1.276 kern_exit.c --- sys/kern/kern_exit.c 13 Jun 2019 20:20:18 -0000 1.276 +++ sys/kern/kern_exit.c 2 Oct 2019 23:26:05 -0000 @@ -617,6 +617,7 @@ l2->l_flag |= LW_WEXIT; if ((l2->l_stat == LSSLEEP && (l2->l_flag & LW_SINTR)) || l2->l_stat == LSSUSPENDED || l2->l_stat == LSSTOP) { + l2->l_flag &= ~LW_DBGSUSPEND; /* setrunnable() will release the lock. */ setrunnable(l2); continue; Index: sys/kern/kern_lwp.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_lwp.c,v retrieving revision 1.203 diff -u -r1.203 kern_lwp.c --- sys/kern/kern_lwp.c 30 Sep 2019 21:13:33 -0000 1.203 +++ sys/kern/kern_lwp.c 2 Oct 2019 23:26:05 -0000 @@ -408,6 +408,11 @@ return (EDEADLK); } + if ((t->l_flag & LW_DBGSUSPEND) != 0) { + lwp_unlock(t); + return 0; + } + error = 0; switch (t->l_stat) { @@ -472,7 +477,7 @@ l->l_flag &= ~LW_WSUSPEND; - if (l->l_stat != LSSUSPENDED) { + if (l->l_stat != LSSUSPENDED || (l->l_flag & LW_DBGSUSPEND) != 0) { lwp_unlock(l); return; } @@ -497,6 +502,8 @@ lwp_lock(l); + KASSERT((l->l_flag & LW_DBGSUSPEND) == 0); + /* If not stopped, then just bail out. */ if (l->l_stat != LSSTOP) { lwp_unlock(l); Index: sys/kern/kern_sig.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_sig.c,v retrieving revision 1.365 diff -u -r1.365 kern_sig.c --- sys/kern/kern_sig.c 30 Sep 2019 21:13:33 -0000 1.365 +++ sys/kern/kern_sig.c 2 Oct 2019 23:26:05 -0000 @@ -1108,11 +1108,20 @@ SDT_PROBE(proc, kernel, , signal__send, l, p, sig, 0, 0); + lwp_lock(l); + if (__predict_false((l->l_flag & LW_DBGSUSPEND) != 0)) { + if ((prop & SA_KILL) != 0) + l->l_flag &= ~LW_DBGSUSPEND; + else { + lwp_unlock(l); + return 0; + } + } + /* * Have the LWP check for signals. This ensures that even if no LWP * is found to take the signal immediately, it should be taken soon. */ - lwp_lock(l); l->l_flag |= LW_PENDSIG; /* @@ -2179,7 +2188,8 @@ LIST_FOREACH(t, &p->p_lwps, l_sibling) { lwp_lock(t); if (t == l) { - t->l_flag &= ~LW_WSUSPEND; + t->l_flag &= + ~(LW_WSUSPEND | LW_DBGSUSPEND); lwp_unlock(t); continue; } @@ -2376,7 +2386,7 @@ LIST_FOREACH(l, &p->p_lwps, l_sibling) { lwp_lock(l); - if (l->l_stat != LSSTOP) { + if (l->l_stat != LSSTOP || (l->l_flag & LW_DBGSUSPEND) != 0) { lwp_unlock(l); continue; } Index: sys/kern/kern_synch.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_synch.c,v retrieving revision 1.323 diff -u -r1.323 kern_synch.c --- sys/kern/kern_synch.c 3 Feb 2019 03:19:28 -0000 1.323 +++ sys/kern/kern_synch.c 2 Oct 2019 23:26:05 -0000 @@ -885,6 +885,7 @@ struct cpu_info *ci; KASSERT((l->l_flag & LW_IDLE) == 0); + KASSERT((l->l_flag & LW_DBGSUSPEND) == 0); KASSERT(mutex_owned(p->p_lock)); KASSERT(lwp_locked(l, NULL)); KASSERT(l->l_mutex != l->l_cpu->ci_schedstate.spc_mutex); Index: sys/kern/sys_ptrace_common.c =================================================================== RCS file: /cvsroot/src/sys/kern/sys_ptrace_common.c,v retrieving revision 1.61 diff -u -r1.61 sys_ptrace_common.c --- sys/kern/sys_ptrace_common.c 1 Oct 2019 21:49:50 -0000 1.61 +++ sys/kern/sys_ptrace_common.c 2 Oct 2019 23:26:05 -0000 @@ -787,9 +787,12 @@ DPRINTF(("%s: lwp=%d request=%d\n", __func__, (*lt)->l_lid, rq)); lwp_lock(*lt); if (rq == PT_SUSPEND) - (*lt)->l_flag |= LW_WSUSPEND; - else - (*lt)->l_flag &= ~LW_WSUSPEND; + (*lt)->l_flag |= LW_DBGSUSPEND; + else { + (*lt)->l_flag &= ~LW_DBGSUSPEND; + if ((*lt)->l_flag != LSSUSPENDED) + (*lt)->l_stat = LSSTOP; + } lwp_unlock(*lt); return 0; } @@ -1233,7 +1236,8 @@ if (resume_all) { #ifdef PT_STEP if (req == PT_STEP) { - if (lt->l_flag & LW_WSUSPEND) { + if (lt->l_flag & + (LW_WSUSPEND | LW_DBGSUSPEND)) { error = EDEADLK; break; } @@ -1242,7 +1246,9 @@ { error = EDEADLK; LIST_FOREACH(lt2, &t->p_lwps, l_sibling) { - if ((lt2->l_flag & LW_WSUSPEND) == 0) { + if ((lt2->l_flag & + (LW_WSUSPEND | LW_DBGSUSPEND)) == 0 + ) { error = 0; break; } @@ -1251,7 +1257,7 @@ break; } } else { - if (lt->l_flag & LW_WSUSPEND) { + if (lt->l_flag & (LW_WSUSPEND | LW_WSUSPEND)) { error = EDEADLK; break; } Index: sys/sys/lwp.h =================================================================== RCS file: /cvsroot/src/sys/sys/lwp.h,v retrieving revision 1.186 diff -u -r1.186 lwp.h --- sys/sys/lwp.h 19 Jun 2019 21:39:53 -0000 1.186 +++ sys/sys/lwp.h 2 Oct 2019 23:26:06 -0000 @@ -236,6 +236,7 @@ #define LW_CVLOCKDEBUG 0x00000004 /* Waker does lockdebug */ #define LW_SINTR 0x00000080 /* Sleep is interruptible. */ #define LW_SYSTEM 0x00000200 /* Kernel thread */ +#define LW_DBGSUSPEND 0x00010000 /* Suspend by debugger */ #define LW_WSUSPEND 0x00020000 /* Suspend before return to user */ #define LW_BATCH 0x00040000 /* LWP tends to hog CPU */ #define LW_WCORE 0x00080000 /* Stop for core dump on return to user */