提交 f7cea12b 创建 作者: kaashoek's avatar kaashoek

disable interrupts when holding kernel lock

上级 bd303ed0
...@@ -41,6 +41,7 @@ void lapic_init(int); ...@@ -41,6 +41,7 @@ void lapic_init(int);
void lapic_timerinit(void); void lapic_timerinit(void);
void lapic_timerintr(void); void lapic_timerintr(void);
void lapic_enableintr(void); void lapic_enableintr(void);
void lapic_disableintr(void);
// spinlock.c // spinlock.c
extern uint32_t kernel_lock; extern uint32_t kernel_lock;
......
...@@ -183,6 +183,12 @@ lapic_enableintr(void) ...@@ -183,6 +183,12 @@ lapic_enableintr(void)
lapic_write(LAPIC_TPR, 0); lapic_write(LAPIC_TPR, 0);
} }
void
lapic_disableintr(void)
{
lapic_write(LAPIC_TPR, 0xFF);
}
int int
cpu(void) cpu(void)
{ {
......
...@@ -14,6 +14,8 @@ acquire_spinlock(uint32_t* lock) ...@@ -14,6 +14,8 @@ acquire_spinlock(uint32_t* lock)
if (*lock == cpu_id) if (*lock == cpu_id)
return; return;
lapic_disableintr();
while ( cmpxchg(LOCK_FREE, cpu_id, lock) != cpu_id ) { ; } while ( cmpxchg(LOCK_FREE, cpu_id, lock) != cpu_id ) { ; }
// cprintf ("acquired: %d\n", cpu_id); // cprintf ("acquired: %d\n", cpu_id);
} }
...@@ -26,6 +28,7 @@ release_spinlock(uint32_t* lock) ...@@ -26,6 +28,7 @@ release_spinlock(uint32_t* lock)
if (*lock != cpu_id) if (*lock != cpu_id)
panic("release_spinlock: releasing a lock that i don't own\n"); panic("release_spinlock: releasing a lock that i don't own\n");
*lock = LOCK_FREE; *lock = LOCK_FREE;
lapic_enableintr();
} }
void void
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论