]> Devi Nivas Git - cs3210-lab0.git/commitdiff
disable interrupts when holding kernel lock
authorkaashoek <kaashoek>
Wed, 28 Jun 2006 16:44:41 +0000 (16:44 +0000)
committerkaashoek <kaashoek>
Wed, 28 Jun 2006 16:44:41 +0000 (16:44 +0000)
defs.h
mp.c
spinlock.c

diff --git a/defs.h b/defs.h
index 27cac3daf131bd4b920633cc76d21edb2cf48566..e627a4c18bd5b7784704b39c2d5b7faefa5acecb 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -41,6 +41,7 @@ void lapic_init(int);
 void lapic_timerinit(void);
 void lapic_timerintr(void);
 void lapic_enableintr(void);
+void lapic_disableintr(void);
 
 // spinlock.c
 extern uint32_t kernel_lock;
diff --git a/mp.c b/mp.c
index ca581e532462aefd9bd5b550331cbb14f3e374c3..eb5afc9356f3a3d29231b616ea2a7ec53e4c2316 100644 (file)
--- a/mp.c
+++ b/mp.c
@@ -183,6 +183,12 @@ lapic_enableintr(void)
   lapic_write(LAPIC_TPR, 0);
 }
 
+void
+lapic_disableintr(void) 
+{
+  lapic_write(LAPIC_TPR, 0xFF);
+}
+
 int
 cpu(void)
 {
index 911ecf820bdbbd2f71fe3923f82b7d2a5969cb02..5cbe0626841370029418a723338d4fb7d6b82753 100644 (file)
@@ -14,6 +14,8 @@ acquire_spinlock(uint32_t* lock)
 
   if (*lock == cpu_id)
     return;
+  
+  lapic_disableintr();
   while ( cmpxchg(LOCK_FREE, cpu_id, lock) != cpu_id ) { ; }
   // cprintf ("acquired: %d\n", cpu_id);
 }
@@ -26,6 +28,7 @@ release_spinlock(uint32_t* lock)
   if (*lock != cpu_id)
     panic("release_spinlock: releasing a lock that i don't own\n");
   *lock = LOCK_FREE;
+  lapic_enableintr();
 }
 
 void