PERFORCE change 133972 for review
Warner Losh
imp at FreeBSD.org
Wed Jan 23 22:13:32 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=133972
Change 133972 by imp at imp_paco-paco on 2008/01/24 06:12:39
Restore the 'oh no' checks just before userret(), per email
from John Baldwin. Don't understand his comments about ast()
completely yet, so put the rest of his email in as a comment.
I think need to track down where trap is called from and put
some code in there...
Affected files ...
.. //depot/projects/mips2-jnpr/src/sys/mips/mips/trap.c#7 edit
Differences ...
==== //depot/projects/mips2-jnpr/src/sys/mips/mips/trap.c#7 (text+ko) ====
@@ -291,9 +291,7 @@
static int emulate_unaligned_access(struct trapframe *frame);
-#ifdef WITNESS
extern char *syscallnames[];
-#endif
/*
* Handle an exception.
@@ -799,6 +797,22 @@
* of being done here under a special check for SYS_ptrace().
*/
done:
+ /*
+ * Check for misbehavior.
+ */
+ 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, trapframe);
#ifdef KTRACE
@@ -813,12 +827,48 @@
STOPEVENT(p, S_SCX, code);
PTRACESTOP_SC(p, td, S_PT_SCX);
+
#ifdef GONE_IN_7
- WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
- (code >= 0 && code < SYS_MAXSYSCALL) ?
- syscallnames[code] : "???");
- mtx_assert(&sched_lock, MA_NOTOWNED);
- mtx_assert(&Giant, MA_NOTOWNED);
+ /*
+ * XXX ast still need to happen
+ *
+ * Mail from jhb@:
+ *
+ * ast() is also still relevant in 7 as well. What
+ * normally happens is that you have the following in
+ * assembly:
+ *
+ * trap_entry:
+ * setup regs
+ * call trap
+ * jmp exittrap
+ *
+ * syscall_entry:
+ * setup regs
+ * call syscall
+ * jmp exittrap
+ *
+ * exittrap:
+ * get ready to return from trap
+ * disable interrupts
+ * if returning to kernel jmp kernel
+ * asts:
+ * if no ASTs are pending jmp kernel
+ * enable interrupts
+ * call ast
+ * disable interrupts
+ * jmp asts
+ * kernel:
+ * restore registers
+ * reti
+ *
+ * or some such. You could do it in C if you wanted,
+ * but the idea is you want to only return to userland
+ * once you've verified you have no ASTs with
+ * interrupts disabled. If you get any AST's while
+ * returning to userland it's due to SMP and you will
+ * get an IPI that will post with 'reti' finishes.
+ */
if (curthread->td_flags & (TDF_ASTPENDING|TDF_NEEDRESCHED)) {
ast(trapframe);
}
More information about the p4-projects
mailing list