Browse Source

bugfix: spinlock操作时,产生的内存写入越界问题。

fslongjin 2 years ago
parent
commit
5747e4c8cc
1 changed files with 9 additions and 9 deletions
  1. 9 9
      kernel/common/spinlock.h

+ 9 - 9
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();