#define FOOLOS_MODULE_NAME "spinlock" #include "lib/logger/log.h" #include "lib/int/stdint.h" // https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html typedef uint8_t spinlock; volatile spinlock spinlocks[16]; void init_spinlocks() { log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Initializing spinlocks at 0x%08X ",spinlocks); for(int i=0;i<16;i++)spinlocks[i]=0; } volatile void lock_spin(int i) { spinlock *addr=spinlocks+i; // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"locking %d (0x%08X)",i,addr); while(x86_xchg(addr,1)); } void lock_release(int i) { // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"unlocking %d",i); spinlock *addr=spinlocks+i; asm("movb $0,%0"::"m"(*addr)); }