Support to multi-threading and pthread interface (POSIX.1-2008) (#23)
[lunaix-os.git] / lunaix-os / includes / lunaix / kpreempt.h
diff --git a/lunaix-os/includes/lunaix/kpreempt.h b/lunaix-os/includes/lunaix/kpreempt.h
new file mode 100644 (file)
index 0000000..d20deba
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef __LUNAIX_KPREEMPT_H
+#define __LUNAIX_KPREEMPT_H
+
+#include <sys/abi.h>
+
+#define _preemptible __attribute__((section(".kf.preempt")))
+
+#define ensure_preempt_caller()                                 \
+    do {                                                        \
+        extern int __kf_preempt_start[];                        \
+        extern int __kf_preempt_end[];                          \
+        ptr_t _retaddr = abi_get_retaddr();                     \
+        assert_msg((ptr_t)__kf_preempt_start <= _retaddr        \
+                    && _retaddr < (ptr_t)__kf_preempt_end,      \
+                   "caller must be kernel preemptible");        \
+    } while(0)
+
+#endif /* __LUNAIX_KPREEMPT_H */