From 87dce36809c34fe407eeecd91ab764c344af0f88 Mon Sep 17 00:00:00 2001 From: Jake Burkholder Date: Sat, 20 Jan 2001 04:14:25 +0000 Subject: [PATCH] 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. --- sys/amd64/amd64/exception.S | 4 +- sys/amd64/amd64/exception.s | 4 +- sys/amd64/amd64/genassym.c | 7 --- sys/amd64/include/mutex.h | 116 +++++------------------------------- sys/i386/i386/exception.s | 4 +- sys/i386/i386/genassym.c | 7 --- sys/i386/include/mutex.h | 116 +++++------------------------------- sys/sys/mutex.h | 3 +- 8 files changed, 38 insertions(+), 223 deletions(-) diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index 99b91d0abd98..603b4be6a236 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -37,8 +37,8 @@ #include #include +#include #include -#include #include #include #ifdef SMP @@ -293,7 +293,7 @@ IDTVEC(int0x80_syscall) jmp _doreti ENTRY(fork_trampoline) - MTX_EXIT(_sched_lock, %ecx) + MTX_EXIT(_sched_lock, MTX_SPIN) sti /* XXX: we need this for kernel threads created very early before interrupts are enabled */ diff --git a/sys/amd64/amd64/exception.s b/sys/amd64/amd64/exception.s index 99b91d0abd98..603b4be6a236 100644 --- a/sys/amd64/amd64/exception.s +++ b/sys/amd64/amd64/exception.s @@ -37,8 +37,8 @@ #include #include +#include #include -#include #include #include #ifdef SMP @@ -293,7 +293,7 @@ IDTVEC(int0x80_syscall) jmp _doreti ENTRY(fork_trampoline) - MTX_EXIT(_sched_lock, %ecx) + MTX_EXIT(_sched_lock, MTX_SPIN) sti /* XXX: we need this for kernel threads created very early before interrupts are enabled */ diff --git a/sys/amd64/amd64/genassym.c b/sys/amd64/amd64/genassym.c index 82e5a5461064..eca44e0a6197 100644 --- a/sys/amd64/amd64/genassym.c +++ b/sys/amd64/amd64/genassym.c @@ -231,10 +231,3 @@ ASSYM(VM86_FRAMESIZE, sizeof(struct vm86frame)); ASSYM(MTX_LOCK, offsetof(struct mtx, mtx_lock)); ASSYM(MTX_RECURSE, offsetof(struct mtx, mtx_recurse)); ASSYM(MTX_SAVEINTR, offsetof(struct mtx, mtx_saveintr)); -#ifdef WITNESS -ASSYM(MTX_DEBUG, offsetof(struct mtx, mtx_debug)); -ASSYM(MTXD_WITNESS, offsetof(struct mtx_debug, mtxd_witness)); -#endif - -ASSYM(MTX_UNOWNED, MTX_UNOWNED); -ASSYM(MTX_SPIN, MTX_SPIN); diff --git a/sys/amd64/include/mutex.h b/sys/amd64/include/mutex.h index 61951fd6526f..0e5810896151 100644 --- a/sys/amd64/include/mutex.h +++ b/sys/amd64/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 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: +#define MTX_EXIT(lck, type) \ + pushl $0 ; /* dummy __LINE__ */ \ + pushl $0 ; /* dummy __FILE__ */ \ + pushl $type ; \ + pushl $lck ; \ + call _mtx_exit ; \ + addl $16,%esp -#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 */ diff --git a/sys/i386/i386/exception.s b/sys/i386/i386/exception.s index 99b91d0abd98..603b4be6a236 100644 --- a/sys/i386/i386/exception.s +++ b/sys/i386/i386/exception.s @@ -37,8 +37,8 @@ #include #include +#include #include -#include #include #include #ifdef SMP @@ -293,7 +293,7 @@ IDTVEC(int0x80_syscall) jmp _doreti ENTRY(fork_trampoline) - MTX_EXIT(_sched_lock, %ecx) + MTX_EXIT(_sched_lock, MTX_SPIN) sti /* XXX: we need this for kernel threads created very early before interrupts are enabled */ diff --git a/sys/i386/i386/genassym.c b/sys/i386/i386/genassym.c index 82e5a5461064..eca44e0a6197 100644 --- a/sys/i386/i386/genassym.c +++ b/sys/i386/i386/genassym.c @@ -231,10 +231,3 @@ ASSYM(VM86_FRAMESIZE, sizeof(struct vm86frame)); ASSYM(MTX_LOCK, offsetof(struct mtx, mtx_lock)); ASSYM(MTX_RECURSE, offsetof(struct mtx, mtx_recurse)); ASSYM(MTX_SAVEINTR, offsetof(struct mtx, mtx_saveintr)); -#ifdef WITNESS -ASSYM(MTX_DEBUG, offsetof(struct mtx, mtx_debug)); -ASSYM(MTXD_WITNESS, offsetof(struct mtx_debug, mtxd_witness)); -#endif - -ASSYM(MTX_UNOWNED, MTX_UNOWNED); -ASSYM(MTX_SPIN, MTX_SPIN); diff --git a/sys/i386/include/mutex.h b/sys/i386/include/mutex.h index 61951fd6526f..0e5810896151 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 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: +#define MTX_EXIT(lck, type) \ + pushl $0 ; /* dummy __LINE__ */ \ + pushl $0 ; /* dummy __FILE__ */ \ + pushl $type ; \ + pushl $lck ; \ + call _mtx_exit ; \ + addl $16,%esp -#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 */ diff --git a/sys/sys/mutex.h b/sys/sys/mutex.h index dff8098203e6..e4660ec539f6 100644 --- a/sys/sys/mutex.h +++ b/sys/sys/mutex.h @@ -45,7 +45,6 @@ #include -#ifndef LOCORE #ifdef _KERNEL /* @@ -88,6 +87,8 @@ #endif /* _KERNEL */ +#ifndef LOCORE + #ifdef WITNESS struct mtx_debug { struct witness *mtxd_witness;