121a88fd4Skaashoek #include "types.h" 221a88fd4Skaashoek #include "defs.h" 321a88fd4Skaashoek #include "x86.h" 4*7837c71bSkaashoek #include "mmu.h" 521a88fd4Skaashoek 621a88fd4Skaashoek #define LOCK_FREE -1 721a88fd4Skaashoek 821a88fd4Skaashoek uint32_t kernel_lock = LOCK_FREE; 921a88fd4Skaashoek 1021a88fd4Skaashoek // lock = LOCK_FREE if free, else = cpu_id of owner CPU 1121a88fd4Skaashoek void 1221a88fd4Skaashoek acquire_spinlock(uint32_t* lock) 1321a88fd4Skaashoek { 14df5cc916Srtm int cpu_id = cpu(); 1521a88fd4Skaashoek 1621a88fd4Skaashoek if (*lock == cpu_id) 1721a88fd4Skaashoek return; 18f7cea12bSkaashoek 19*7837c71bSkaashoek write_eflags(read_eflags() & ~FL_IF); 2021a88fd4Skaashoek while ( cmpxchg(LOCK_FREE, cpu_id, lock) != cpu_id ) { ; } 21bf390361Srtm // cprintf ("acquired: %d\n", cpu_id); 2221a88fd4Skaashoek } 2321a88fd4Skaashoek 2421a88fd4Skaashoek void 2521a88fd4Skaashoek release_spinlock(uint32_t* lock) 2621a88fd4Skaashoek { 27df5cc916Srtm int cpu_id = cpu(); 28bf390361Srtm // cprintf ("release: %d\n", cpu_id); 2921a88fd4Skaashoek if (*lock != cpu_id) 3021a88fd4Skaashoek panic("release_spinlock: releasing a lock that i don't own\n"); 3121a88fd4Skaashoek *lock = LOCK_FREE; 32*7837c71bSkaashoek write_eflags(read_eflags() | FL_IF); 3321a88fd4Skaashoek } 3421a88fd4Skaashoek 3521a88fd4Skaashoek void 3621a88fd4Skaashoek release_grant_spinlock(uint32_t* lock, int c) 3721a88fd4Skaashoek { 38df5cc916Srtm int cpu_id = cpu(); 39bf390361Srtm // cprintf ("release_grant: %d -> %d\n", cpu_id, c); 4021a88fd4Skaashoek if (*lock != cpu_id) 4121a88fd4Skaashoek panic("release_spinlock: releasing a lock that i don't own\n"); 4221a88fd4Skaashoek *lock = c; 4321a88fd4Skaashoek } 44