From 5747e4c8ccdb7186e58d12956365ea3c1ce82d4f Mon Sep 17 00:00:00 2001 From: fslongjin Date: Sat, 20 Aug 2022 17:11:13 +0800 Subject: [PATCH] =?UTF-8?q?bugfix:=20spinlock=E6=93=8D=E4=BD=9C=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E4=BA=A7=E7=94=9F=E7=9A=84=E5=86=85=E5=AD=98=E5=86=99?= =?UTF-8?q?=E5=85=A5=E8=B6=8A=E7=95=8C=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/common/spinlock.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/kernel/common/spinlock.h b/kernel/common/spinlock.h index 5b1d54ea..64a6ab3d 100644 --- a/kernel/common/spinlock.h +++ b/kernel/common/spinlock.h @@ -19,7 +19,7 @@ typedef struct { int8_t lock; // 1:unlocked 0:locked -} spinlock_t; +}spinlock_t; /** @@ -30,11 +30,11 @@ typedef struct void spin_lock(spinlock_t *lock) { __asm__ __volatile__("1: \n\t" - "lock decq %0 \n\t" // 尝试-1 + "lock decb %0 \n\t" // 尝试-1 "jns 3f \n\t" // 加锁成功,跳转到步骤3 "2: \n\t" // 加锁失败,稍后再试 "pause \n\t" - "cmpq $0, %0 \n\t" + "cmpb $0, %0 \n\t" "jle 2b \n\t" // 若锁被占用,则继续重试 "jmp 1b \n\t" // 尝试加锁 "3:" @@ -50,7 +50,7 @@ void spin_lock(spinlock_t *lock) void spin_unlock(spinlock_t *lock) { preempt_enable(); - __asm__ __volatile__("movq $1, %0 \n\t" + __asm__ __volatile__("movb $1, %0 \n\t" : "=m"(lock->lock)::"memory"); } @@ -74,11 +74,11 @@ void spin_init(spinlock_t *lock) void spin_lock_no_preempt(spinlock_t *lock) { __asm__ __volatile__("1: \n\t" - "lock decq %0 \n\t" // 尝试-1 + "lock decb %0 \n\t" // 尝试-1 "jns 3f \n\t" // 加锁成功,跳转到步骤3 "2: \n\t" // 加锁失败,稍后再试 "pause \n\t" - "cmpq $0, %0 \n\t" + "cmpb $0, %0 \n\t" "jle 2b \n\t" // 若锁被占用,则继续重试 "jmp 1b \n\t" // 尝试加锁 "3:" @@ -91,7 +91,7 @@ void spin_lock_no_preempt(spinlock_t *lock) */ void spin_unlock_no_preempt(spinlock_t *lock) { - __asm__ __volatile__("movq $1, %0 \n\t" + __asm__ __volatile__("movb $1, %0 \n\t" : "=m"(lock->lock)::"memory"); } @@ -106,9 +106,9 @@ long spin_trylock(spinlock_t *lock) uint64_t tmp_val = 0; preempt_disable(); // 交换tmp_val和lock的值,若tmp_val==1则证明加锁成功 - asm volatile("lock xchgq %0, %1 \n\t" // 确保只有1个进程能得到锁 + asm volatile("lock xchg %%bx, %1 \n\t" // 确保只有1个进程能得到锁 : "=q"(tmp_val), "=m"(lock->lock) - : "0"(0) + : "b"(0) : "memory"); if (!tmp_val) preempt_enable();