#ifndef SMP_INCLUDED #define SMP_INCLUDED #include #include #include #include void smp_prepare(); extern uint8_t corecount; static inline void lock(uint8_t *lock) { asm("mov al, 1\n" "spinlock:\n" "lock xchgb [%0], al\n" "test al, al\n" "pause\n" "jnz spinlock\n" ::"r"(lock):"al"); } static inline void unlock(uint8_t *lock) { asm("lock andb [%0], 0"::"r"(lock)); } static inline bool get_set_mutex(uint16_t *mutex) { bool ret; asm("lock bts %1, 0\n" "jc .mutex_taken\n" "mov %0, 0\n" "jmp .done\n" ".mutex_taken:\n" "mov %0, 1\n" ".done:\n" :"=r"(ret) :"m"(*mutex)); return ret; } //THIS IS ONLY UNTIL WE GET MULTITHREADING SET UP uint8_t get_coreid(); #define CREATE_LOTO(name) #endif