kernel: locks: add spin lock/unlock function that don't change interrupt state
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
#include <kernel/machine/hwlock.h>
|
||||
#include <kernel/compiler.h>
|
||||
#include <kernel/machine/hwlock.h>
|
||||
|
||||
void ml_hwlock_lock(ml_hwlock_t *lck)
|
||||
{
|
||||
|
||||
@@ -11,6 +11,41 @@ ml_hwlock_lock:
|
||||
|
||||
mov $1, %ecx
|
||||
|
||||
mfence
|
||||
|
||||
1: mov $0, %eax
|
||||
lock cmpxchg %ecx, (%rdi)
|
||||
jne 1b
|
||||
|
||||
pop %rbp
|
||||
ret
|
||||
|
||||
|
||||
.global ml_hwlock_unlock
|
||||
.type ml_hwlock_unlock, @function
|
||||
|
||||
/* %rdi = pointer to ml_hwlock_t (int) */
|
||||
ml_hwlock_unlock:
|
||||
push %rbp
|
||||
mov %rsp, %rbp
|
||||
|
||||
movl $0, (%rdi)
|
||||
mfence
|
||||
|
||||
pop %rbp
|
||||
ret
|
||||
|
||||
|
||||
.global ml_hwlock_lock_irq
|
||||
.type ml_hwlock_lock_irq, @function
|
||||
|
||||
/* %rdi = pointer to ml_hwlock_t (int) */
|
||||
ml_hwlock_lock_irq:
|
||||
push %rbp
|
||||
mov %rsp, %rbp
|
||||
|
||||
mov $1, %ecx
|
||||
|
||||
cli
|
||||
mfence
|
||||
|
||||
@@ -21,11 +56,12 @@ ml_hwlock_lock:
|
||||
pop %rbp
|
||||
ret
|
||||
|
||||
.global ml_hwlock_unlock
|
||||
.type ml_hwlock_unlock, @function
|
||||
|
||||
.global ml_hwlock_unlock_irq
|
||||
.type ml_hwlock_unlock_irq, @function
|
||||
|
||||
/* %rdi = pointer to ml_hwlock_t (int) */
|
||||
ml_hwlock_unlock:
|
||||
ml_hwlock_unlock_irq:
|
||||
push %rbp
|
||||
mov %rsp, %rbp
|
||||
|
||||
@@ -62,6 +98,7 @@ ml_hwlock_lock_irqsave:
|
||||
pop %rbp
|
||||
ret
|
||||
|
||||
|
||||
.global ml_hwlock_unlock_irqrestore
|
||||
.type ml_hwlock_unlock_irqrestore, @function
|
||||
|
||||
|
||||
@@ -12,6 +12,9 @@ typedef int ml_hwlock_t;
|
||||
extern void ml_hwlock_lock(ml_hwlock_t *lck);
|
||||
extern void ml_hwlock_unlock(ml_hwlock_t *lck);
|
||||
|
||||
extern void ml_hwlock_lock_irq(ml_hwlock_t *lck);
|
||||
extern void ml_hwlock_unlock_irq(ml_hwlock_t *lck);
|
||||
|
||||
extern void ml_hwlock_lock_irqsave(ml_hwlock_t *lck, unsigned long *flags);
|
||||
extern void ml_hwlock_unlock_irqrestore(ml_hwlock_t *lck, unsigned long flags);
|
||||
|
||||
|
||||
@@ -10,13 +10,17 @@ extern "C" {
|
||||
|
||||
typedef __aligned(8) ml_hwlock_t spin_lock_t;
|
||||
|
||||
#define SPIN_LOCK_INIT ML_HWLOCK_INIT
|
||||
#define SPIN_LOCK_INIT ML_HWLOCK_INIT
|
||||
|
||||
#define spin_lock(lck) ml_hwlock_lock(lck);
|
||||
#define spin_unlock(lck) ml_hwlock_unlock(lck);
|
||||
#define spin_lock(lck) ml_hwlock_lock(lck);
|
||||
#define spin_unlock(lck) ml_hwlock_unlock(lck);
|
||||
|
||||
#define spin_lock_irq(lck) ml_hwlock_lock_irq(lck);
|
||||
#define spin_unlock_irq(lck) ml_hwlock_unlock_irq(lck);
|
||||
|
||||
#define spin_lock_irqsave(lck, flags) ml_hwlock_lock_irqsave(lck, flags);
|
||||
#define spin_unlock_irqrestore(lck, flags) ml_hwlock_unlock_irqrestore(lck, flags);
|
||||
#define spin_unlock_irqrestore(lck, flags) \
|
||||
ml_hwlock_unlock_irqrestore(lck, flags);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user