diff options
author | jhb <jhb@FreeBSD.org> | 2006-07-27 22:32:30 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2006-07-27 22:32:30 +0000 |
commit | 12302c47d0774765f92ead9706c43dd6e9b1af80 (patch) | |
tree | 47879e45272c43d1dac6fed60572111e89f9a60b /sys/arm | |
parent | dc69447236a19f806729d1c133c456528b241db4 (diff) | |
download | FreeBSD-src-12302c47d0774765f92ead9706c43dd6e9b1af80.zip FreeBSD-src-12302c47d0774765f92ead9706c43dd6e9b1af80.tar.gz |
Unify the checking for lock misbehavior in the various syscall()
implementations and adjust some of the checks while I'm here:
- Add a new check to make sure we don't return from a syscall in a critical
section.
- Add a new explicit check before userret() to make sure we don't return
with any locks held. The advantage here is that we can include the
syscall number and name in syscall() whereas that info is not available
in userret().
- Drop the mtx_assert()'s of sched_lock and Giant. They are replaced by
the more general checks just added.
MFC after: 2 weeks
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/arm/trap.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/arm/arm/trap.c b/sys/arm/arm/trap.c index b1534fe..1cb53db 100644 --- a/sys/arm/arm/trap.c +++ b/sys/arm/arm/trap.c @@ -133,6 +133,7 @@ void undefinedinstruction(trapframe_t *); #include <machine/machdep.h> extern char fusubailout[]; +extern char *syscallnames[]; #ifdef DEBUG int last_fault_code; /* For the benefit of pmap_fault_fixup() */ @@ -979,8 +980,17 @@ bad: } if (locked && (callp->sy_narg & SYF_MPSAFE) == 0) mtx_unlock(&Giant); - - + + WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning", + (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"); + KASSERT(td->td_critnest == 0, + ("System call %s returning in a critical section", + (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???")); + KASSERT(td->td_locks == 0, + ("System call %s returning with %d locks held", + (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???", + td->td_locks)); + userret(td, frame); CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td, td->td_proc->p_pid, td->td_proc->p_comm, code); @@ -991,8 +1001,6 @@ bad: if (KTRPOINT(td, KTR_SYSRET)) ktrsysret(code, error, td->td_retval[0]); #endif - mtx_assert(&sched_lock, MA_NOTOWNED); - mtx_assert(&Giant, MA_NOTOWNED); } void |