summaryrefslogtreecommitdiff
path: root/src/include/smp.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/smp.h')
-rw-r--r--src/include/smp.h30
1 files changed, 23 insertions, 7 deletions
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