On Tue, 6 Mar 2007, Roland McGrath wrote: > > > Yeah, I guess that's right. It should still return NOTIFY_STOP when > > > args->err has no other bits set, so notifiers aren't called with zero. > > > > In practice that might not work. On my machine, at least, reads of DR6 > > return ones in all the reserved bit positions. > > Does that mean asm("mov %1,%%dr6; mov %%dr6,%0" : "=r" (mask) : "r" (0)); > puts in mask the set of reserved bits? We could collect that value at CPU > startup and mask it off args->err, then OR it back into vdr6.
That sounds like a rather fragile approach to avoiding a minimal amount of work. Debug exceptions don't occur very often, and when they do it won't matter too much if we go through some extra notifier-chain callouts. Back to a previous topic: > > The actual guarantee I need is that nobody will switch_to() the task while > > my routines are running. > > You can't get that. It can always be woken for SIGKILL (which is a good > thing). What you are guaranteed is that if it does, it will never return > to user mode. So it has to be ok for switching in to use the bits in any > intermediate state you might get them, meaning any possible garbage state > is harmful only to user mode or is otherwise recoverable (worst case > perhaps the exception handler has to know to ignore some traps). This is > already true with ptrace and ->thread.debugreg, as well as the normal user > registers. In your case, if you wanted to be paranoid you could clear > TIF_DEBUG before you touch anything, and set it again only after you're > done (with memory barriers as needed). It turns out that this won't work correctly unless I use something stronger, like a spinlock or RCU. Either one seems like overkill. Is there any way to find out from within the switch_to_thread_hw_breakpoint routine whether the task is in this unusual state? (By which I mean the task is being debugged and the debugger hasn't told it to start running.) Would (tsk->exit_code == SIGKILL) work? If not, can we add a TIF_DEBUG_STOPPED flag? Or should I just go with a spinlock? Is SIGKILL the only way this can happen? In a similar vein, I need a reliable way to know whether a task has gone through exit_thread(). If it has, then its hw_breakpoint area has been deallocated and a new one must not be allocated. Will (tsk->flags & PF_EXITING) always be true once that happens? Alan Stern - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/