diff options
author | attilio <attilio@FreeBSD.org> | 2011-04-30 23:12:37 +0000 |
---|---|---|
committer | attilio <attilio@FreeBSD.org> | 2011-04-30 23:12:37 +0000 |
commit | 1ce93775ecf7328fdda6b30ca7461bec07e27812 (patch) | |
tree | 585e7bffe2f2f8a566e9cbc1448fb376ca47bcf9 /sys/amd64 | |
parent | 05a159a130624404fd72473d6a0b3fc99176ea86 (diff) | |
download | FreeBSD-src-1ce93775ecf7328fdda6b30ca7461bec07e27812.zip FreeBSD-src-1ce93775ecf7328fdda6b30ca7461bec07e27812.tar.gz |
Add the function md_assert_nopreempt(), which is a very consistent
function on the possibility of a thread to not preempt.
As this function is very tied to x86 (interrupts disabled checkings)
it is not intended to be used in MI code.
Diffstat (limited to 'sys/amd64')
-rw-r--r-- | sys/amd64/amd64/mp_machdep.c | 16 | ||||
-rw-r--r-- | sys/amd64/include/smp.h | 1 |
2 files changed, 17 insertions, 0 deletions
diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c index 8e8dc67..70ba466 100644 --- a/sys/amd64/amd64/mp_machdep.c +++ b/sys/amd64/amd64/mp_machdep.c @@ -1428,6 +1428,22 @@ cpususpend_handler(void) intr_restore(rf); } +void +md_assert_nopreempt(void) +{ +#ifdef INVARIANTS + struct thread *td; + register_t rflags; + + td = curthread; + rflags = read_rflags(); + + if ((rflags & PSL_I) != 0 && td->td_critnest <= 0) + panic("Preemption still allowed, thread %s\n", + (td->td_pinned <= 0) ? "not pinned" : "pinned"); +#endif +} + /* * This is called once the rest of the system is up and running and we're * ready to let the AP's out of the pen. diff --git a/sys/amd64/include/smp.h b/sys/amd64/include/smp.h index ec107f9..bafb349 100644 --- a/sys/amd64/include/smp.h +++ b/sys/amd64/include/smp.h @@ -64,6 +64,7 @@ void ipi_bitmap_handler(struct trapframe frame); void ipi_cpu(int cpu, u_int ipi); int ipi_nmi_handler(void); void ipi_selected(cpumask_t cpus, u_int ipi); +void md_assert_nopreempt(void); u_int mp_bootaddress(u_int); int mp_grab_cpu_hlt(void); void smp_cache_flush(void); |