diff options
author | jhb <jhb@FreeBSD.org> | 2000-09-24 23:34:21 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2000-09-24 23:34:21 +0000 |
commit | b996fd3a9d272c435ab055667086311e1c001e85 (patch) | |
tree | 11b35ba859949d139c46097e5939a1782e59c9a8 /sys | |
parent | 1e62854c841a85648caea4331197b7f2ca19b862 (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/amd64/include/mutex.h | 28 | ||||
-rw-r--r-- | sys/i386/include/mutex.h | 28 |
2 files changed, 42 insertions, 14 deletions
diff --git a/sys/amd64/include/mutex.h b/sys/amd64/include/mutex.h index ab8a953..1bbe0e0 100644 --- a/sys/amd64/include/mutex.h +++ b/sys/amd64/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 */ 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 */ |