From b62706c9f2ceed65394457ae9b131996a2b29463 Mon Sep 17 00:00:00 2001 From: Brett Weiland Date: Fri, 24 Sep 2021 14:20:20 -0500 Subject: palloc/pfree found smp safe --- src/include/smp.h | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) (limited to 'src/include/smp.h') diff --git a/src/include/smp.h b/src/include/smp.h index e331036..ba12c76 100644 --- a/src/include/smp.h +++ b/src/include/smp.h @@ -7,6 +7,7 @@ void smp_prepare(); extern uint8_t corecount; +/** static inline void lock(uint8_t *lock) { asm("mov al, 1\n" "spinlock:\n" @@ -16,30 +17,45 @@ static inline void lock(uint8_t *lock) { "jnz spinlock\n" ::"r"(lock):"al"); } +**/ +static inline void lock(uint16_t *mutex) { + asm(".spinlock_%=:\n" + "lock bts %0, 0\n" + "jnc .done_%=\n" + "pause\n" + "jmp .spinlock_%=\n" + ".done_%=:\n" + ::"m"(*mutex)); +} + +static inline void unlock(uint16_t *mutex) { + asm("lock btr %0, 0\n" + ::"m"(*mutex)); +} + +/** 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" + "jc .mutex_taken_%=\n" "mov %0, 0\n" - "jmp .done\n" - ".mutex_taken:\n" + "jmp .done_%=\n" + ".mutex_taken_%=:\n" "mov %0, 1\n" - ".done:\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 -- cgit v1.2.3