summaryrefslogtreecommitdiff
path: root/spinlock.c
diff options
context:
space:
mode:
authorrtm <rtm>2006-08-10 22:08:14 +0000
committerrtm <rtm>2006-08-10 22:08:14 +0000
commit5be0039ce9e22f140a29e167526c64c723c5be3c (patch)
tree4096ed2b728cbee37dd2adee06e83f0e908f72b6 /spinlock.c
parent8a8be1b8c36e38f58f8ba3e425b6e701ad65abf3 (diff)
downloadxv6-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.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/spinlock.c b/spinlock.c
index b1b4079..663fe33 100644
--- a/spinlock.c
+++ b/spinlock.c
@@ -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