From 8a8be1b8c36e38f58f8ba3e425b6e701ad65abf3 Mon Sep 17 00:00:00 2001 From: rtm Date: Thu, 10 Aug 2006 02:07:10 +0000 Subject: low-level keyboard input (not hooked up to /dev yet) fix acquire() to cli() *before* incrementing nlock make T_SYSCALL a trap gate, not an interrupt gate sadly, various crashes if you hold down a keyboard key... --- spinlock.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'spinlock.c') diff --git a/spinlock.c b/spinlock.c index 5a0fd23..b1b4079 100644 --- a/spinlock.c +++ b/spinlock.c @@ -30,8 +30,10 @@ acquire(struct spinlock * lock) if(holding(lock)) panic("acquire"); - if(cpus[cpu()].nlock++ == 0) - cli(); + if(cpus[cpu()].nlock == 0) + cli(); + cpus[cpu()].nlock++; + while(cmpxchg(0, 1, &lock->locked) == 1) ; cpuid(0, 0, 0, 0, 0); // memory barrier @@ -53,6 +55,8 @@ 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 -- cgit v1.2.3