xref: /xv6-public/spinlock.c (revision 7837c71b)
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