diff options
author | rtm <rtm> | 2006-08-10 22:08:14 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-08-10 22:08:14 +0000 |
commit | 5be0039ce9e22f140a29e167526c64c723c5be3c (patch) | |
tree | 4096ed2b728cbee37dd2adee06e83f0e908f72b6 /spinlock.c | |
parent | 8a8be1b8c36e38f58f8ba3e425b6e701ad65abf3 (diff) | |
download | xv6-labs-5be0039ce9e22f140a29e167526c64c723c5be3c.tar.gz xv6-labs-5be0039ce9e22f140a29e167526c64c723c5be3c.tar.bz2 xv6-labs-5be0039ce9e22f140a29e167526c64c723c5be3c.zip |
interrupts could be recursive since lapic_eoi() called before rti
so fast interrupts overflow the kernel stack
fix: cli() before lapic_eoi()
Diffstat (limited to 'spinlock.c')
-rw-r--r-- | spinlock.c | 18 |
1 files changed, 16 insertions, 2 deletions
@@ -10,9 +10,20 @@ // because cprintf uses them itself. //#define cprintf dont_use_cprintf +#define LOCKMAGIC 0x6673ffea + extern int use_console_lock; void +initlock(struct spinlock *lock, char *name) +{ + lock->magic = LOCKMAGIC; + lock->name = name; + lock->locked = 0; + lock->cpu = 0xffffffff; +} + +void getcallerpcs(void *v, uint pcs[]) { uint *ebp = (uint*)v - 2; @@ -27,6 +38,8 @@ getcallerpcs(void *v, uint pcs[]) void acquire(struct spinlock * lock) { + if(lock->magic != LOCKMAGIC) + panic("weird lock magic"); if(holding(lock)) panic("acquire"); @@ -45,6 +58,9 @@ acquire(struct spinlock * lock) void release(struct spinlock * lock) { + if(lock->magic != LOCKMAGIC) + panic("weird lock magic"); + if(!holding(lock)) panic("release"); @@ -55,8 +71,6 @@ release(struct spinlock * lock) lock->locked = 0; if(--cpus[cpu()].nlock == 0) sti(); - // xxx we may have just turned interrupts on during - // an interrupt, is that ok? } int |