summaryrefslogtreecommitdiff
path: root/libddekit/ddekit/initcall.h
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-04-08 02:31:00 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2012-04-08 02:31:00 +0200
commitfcdea94c3fddd42de30e6294b02fc3fa869c888e (patch)
tree170c7320a73a56864c1f0e69324071b93420227e /libddekit/ddekit/initcall.h
parent19796a75ab8ba43b31e230ea169d5383c6392bfc (diff)
parentc0c35f90e218835ef0f8c0b67399ad6533763ed0 (diff)
Merge branch 'upstream-merged' of git.debian.org:/git/pkg-hurd/hurd into upstream-merged
Conflicts: pfinet/ethernet.c
Diffstat (limited to 'libddekit/ddekit/initcall.h')
-rw-r--r--libddekit/ddekit/initcall.h42
1 files changed, 42 insertions, 0 deletions
diff --git a/libddekit/ddekit/initcall.h b/libddekit/ddekit/initcall.h
new file mode 100644
index 00000000..6befa31c
--- /dev/null
+++ b/libddekit/ddekit/initcall.h
@@ -0,0 +1,42 @@
+#ifndef _ddekit_initcall_h
+#define _ddekit_initcall_h
+
+// from l4/sys/compiler.h
+#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ >= 4
+#define L4_STICKY(x) __attribute__((used)) x
+#else
+#define L4_STICKY(x) __attribute__((unused)) x
+#endif
+
+#define l4str(s) #s
+
+// from dde_linux/ARCH-x86/ctor.h
+typedef void (*l4ddekit_initcall_t)(void);
+
+#define __l4ddekit_initcall(p) \
+ __attribute__ ((__section__ (".l4dde_ctors." #p)))
+
+/** Define a function to be a DDEKit initcall.
+ *
+ * Define a function to be a DDEKit initcall. This function will then be placed
+ * in a separate linker section of the binary (called .l4dde_ctors). The L4Env
+ * construction mechanism will execute all constructors in this section during
+ * application startup.
+ *
+ * This is the right place to place Linux' module_init functions & Co.
+ *
+ * \param fn function
+ */
+#define DDEKIT_INITCALL(fn) DDEKIT_CTOR(fn, 1)
+
+#define DDEKIT_CTOR(fn, prio) \
+ l4ddekit_initcall_t \
+ L4_STICKY(__l4ddekit_initcall_##fn) \
+ __l4ddekit_initcall(prio) = (void *)fn
+
+/**
+ * Runs all registered initcalls.
+ */
+void ddekit_do_initcalls(void);
+
+#endif