summaryrefslogtreecommitdiffstats
path: root/sys/i386/include/mutex.h
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2001-01-20 04:14:25 +0000
committerjake <jake@FreeBSD.org>2001-01-20 04:14:25 +0000
commitcf5b2e3c3be9fc98dc2fe0b284bf95f26709dff4 (patch)
treeaa7d6b8edc7163761764c2dabb633a5b6915b12d /sys/i386/include/mutex.h
parent18831b15201a666065836859262791a86f2e8166 (diff)
downloadFreeBSD-src-cf5b2e3c3be9fc98dc2fe0b284bf95f26709dff4.zip
FreeBSD-src-cf5b2e3c3be9fc98dc2fe0b284bf95f26709dff4.tar.gz
Simplify the i386 asm MTX_{ENTER,EXIT} macros to just call the
appropriate function, rather than doing a horse-and-buggy acquire. They now take the mutex type as an arg and can be used with sleep as well as spin mutexes.
Diffstat (limited to 'sys/i386/include/mutex.h')
-rw-r--r--sys/i386/include/mutex.h118
1 files changed, 16 insertions, 102 deletions
diff --git a/sys/i386/include/mutex.h b/sys/i386/include/mutex.h
index 61951fd..0e58108 100644
--- a/sys/i386/include/mutex.h
+++ b/sys/i386/include/mutex.h
@@ -253,110 +253,24 @@ extern char STR_SIEN[];
#else /* !LOCORE */
/*
- * Simple assembly macros to get and release spin locks.
+ * Simple assembly macros to get and release mutexes.
*/
-#ifdef WITNESS
-#define WITNESS_ENTER(lck, reg) \
- movl lck+MTX_DEBUG,reg; \
- cmpl $0,MTXD_WITNESS(reg); \
- jz 1f; \
- pushl $0; \
- pushl $0; \
- pushl $MTX_SPIN; \
- pushl $lck; \
- call witness_enter; \
- addl $0x10,%esp; \
-1:
+#define MTX_ENTER(lck, type) \
+ pushl $0 ; /* dummy __LINE__ */ \
+ pushl $0 ; /* dummy __FILE__ */ \
+ pushl $type ; \
+ pushl $lck ; \
+ call _mtx_enter ; \
+ addl $16,%esp
+
+#define MTX_EXIT(lck, type) \
+ pushl $0 ; /* dummy __LINE__ */ \
+ pushl $0 ; /* dummy __FILE__ */ \
+ pushl $type ; \
+ pushl $lck ; \
+ call _mtx_exit ; \
+ addl $16,%esp
-#define WITNESS_EXIT(lck, reg) \
- movl lck+MTX_DEBUG,reg; \
- cmpl $0,MTXD_WITNESS(reg); \
- jz 1f; \
- pushl $0; \
- pushl $0; \
- pushl $MTX_SPIN; \
- pushl $lck; \
- call witness_exit; \
- addl $0x10,%esp; \
-1:
-
-#else
-#define WITNESS_ENTER(lck, reg)
-#define WITNESS_EXIT(lck, reg)
-#endif
-
-#if defined(I386_CPU)
-
-#define MTX_ENTER(lck, reg) \
- movl _curproc,reg; \
- pushfl; \
- cli; \
- movl reg,lck+MTX_LOCK; \
- popl lck+MTX_SAVEINTR; \
- WITNESS_ENTER(lck, reg)
-
-#define MTX_EXIT(lck, reg) \
- WITNESS_EXIT(lck, reg) \
- pushl lck+MTX_SAVEINTR; \
- movl $ MTX_UNOWNED,lck+MTX_LOCK; \
- popfl;
-
-#else /* I386_CPU */
-
-#define MTX_ENTER(lck, reg) \
- movl _curproc,reg; \
- pushfl; \
- cli; \
-9: movl $ MTX_UNOWNED,%eax; \
- MPLOCKED \
- cmpxchgl reg,lck+MTX_LOCK; \
- jnz 9b; \
- popl lck+MTX_SAVEINTR; \
- WITNESS_ENTER(lck, reg)
-
-/* Must use locked bus op (cmpxchg) when setting to unowned (barrier) */
-#define MTX_EXIT(lck, reg) \
- WITNESS_EXIT(lck, reg) \
- pushl lck+MTX_SAVEINTR; \
- movl lck+MTX_LOCK,%eax; \
- movl $ MTX_UNOWNED,reg; \
- MPLOCKED \
- cmpxchgl reg,lck+MTX_LOCK; \
- popfl;
-
-#define MTX_ENTER_WITH_RECURSION(lck, reg) \
- pushf; \
- cli; \
- movl lck+MTX_LOCK,%eax; \
- cmpl _curproc,%eax; \
- jne 7f; \
- incl lck+MTX_RECURSE; \
- jmp 8f; \
-7: movl $ MTX_UNOWNED,%eax; \
- MPLOCKED \
- cmpxchgl reg,lck+MTX_LOCK; \
- jnz 7b; \
- popl lck+MTX_SAVEINTR; \
- jmp 9f; \
-8: add $4,%esp; \
-9: WITNESS_ENTER(lck, reg)
-
-#define MTX_EXIT_WITH_RECURSION(lck, reg) \
- WITNESS_EXIT(lck, reg) \
- movl lck+MTX_RECURSE,%eax; \
- decl %eax; \
- js 8f; \
- movl %eax,lck+MTX_RECURSE; \
- jmp 9f; \
-8: pushl lck+MTX_SAVEINTR; \
- movl lck+MTX_LOCK,%eax; \
- movl $ MTX_UNOWNED,reg; \
- MPLOCKED \
- cmpxchgl reg,lck+MTX_LOCK; \
- popf; \
-9:
-
-#endif /* I386_CPU */
#endif /* !LOCORE */
#endif /* __MACHINE_MUTEX_H */
OpenPOWER on IntegriCloud