summaryrefslogtreecommitdiffstats
path: root/sys/i386/include/mutex.h
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2000-09-24 23:34:21 +0000
committerjhb <jhb@FreeBSD.org>2000-09-24 23:34:21 +0000
commitb996fd3a9d272c435ab055667086311e1c001e85 (patch)
tree11b35ba859949d139c46097e5939a1782e59c9a8 /sys/i386/include/mutex.h
parent1e62854c841a85648caea4331197b7f2ca19b862 (diff)
downloadFreeBSD-src-b996fd3a9d272c435ab055667086311e1c001e85.zip
FreeBSD-src-b996fd3a9d272c435ab055667086311e1c001e85.tar.gz
Fix the assmebly mutex macros to handle saving/restoring interrupt state
properly. Fix the recursive mutex macros to actually compile. At the moment we only use MTX_EXIT anyways.
Diffstat (limited to 'sys/i386/include/mutex.h')
-rw-r--r--sys/i386/include/mutex.h28
1 files changed, 21 insertions, 7 deletions
diff --git a/sys/i386/include/mutex.h b/sys/i386/include/mutex.h
index ab8a953..1bbe0e0 100644
--- a/sys/i386/include/mutex.h
+++ b/sys/i386/include/mutex.h
@@ -744,45 +744,59 @@ _mtx_exit(struct mtx *mtxp, int type, const char *file, int line)
#if defined(I386_CPU)
#define MTX_EXIT(lck, reg) \
- movl $ MTX_UNOWNED,lck+MTX_LOCK;
+ pushl lck+MTX_SAVEFL; \
+ movl $ MTX_UNOWNED,lck+MTX_LOCK; \
+ popf
#else /* I386_CPU */
#define MTX_ENTER(reg, lck) \
+ pushf \
+ cli \
9: movl $ MTX_UNOWNED,%eax; \
MPLOCKED \
cmpxchgl reg,lck+MTX_LOCK; \
- jnz 9b
+ jnz 9b; \
+ popl lck+MTX_SAVEFL;
/* Must use locked bus op (cmpxchg) when setting to unowned (barrier) */
#define MTX_EXIT(lck,reg) \
+ pushl lck+MTX_SAVEFL; \
movl lck+MTX_LOCK,%eax; \
movl $ MTX_UNOWNED,reg; \
MPLOCKED \
cmpxchgl reg,lck+MTX_LOCK; \
+ popf
#define MTX_ENTER_WITH_RECURSION(reg, lck) \
+ pushf \
+ cli \
movl lck+MTX_LOCK,%eax; \
- cmpl PCPU_CURPROC,%eax; \
+ cmpl _curproc,%eax; \
jne 9f; \
- incw lck+MTX_RECURSECNT; \
+ incw lck+MTX_RECURS; \
jmp 8f; \
9: movl $ MTX_UNOWNED,%eax; \
MPLOCKED \
cmpxchgl reg,lck+MTX_LOCK; \
jnz 9b; \
-8:
+ popl lck+MTX_SAVEFL; \
+ jmp 10f; \
+8: add $4,%esp; \
+10:
#define MTX_EXIT_WITH_RECURSION(lck,reg) \
- movl lck+MTX_RECURSECNT,%eax; \
+ movl lck+MTX_RECURSE,%eax; \
decl %eax; \
js 9f; \
- movl %eax,lck+MTX_RECURSECNT; \
+ movl %eax,lck+MTX_RECURSE; \
jmp 8f; \
+ pushl lck+MTX_SAVEFL; \
9: movl lck+MTX_LOCK,%eax; \
movl $ MTX_UNOWNED,reg; \
MPLOCKED \
cmpxchgl reg,lck+MTX_LOCK; \
+ popf \
8:
#endif /* I386_CPU */
OpenPOWER on IntegriCloud