Make linker function declarations a tag
This is similar to Linux's initcall(). Instead of changing the name of
the function, just tag it. This makes it a little easier to port Linux
drivers too.
The __init tag does nothing right now. For now, just use it as a
convention.
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/drivers/net/bnx2x/bnx2x_dev.c b/kern/drivers/net/bnx2x/bnx2x_dev.c
index eb031a4..b4b0722 100644
--- a/kern/drivers/net/bnx2x/bnx2x_dev.c
+++ b/kern/drivers/net/bnx2x/bnx2x_dev.c
@@ -451,7 +451,8 @@
return 0;
}
-linker_func_3(etherbnx2x_link)
+static void __init etherbnx2x_link(void)
{
addethercard("bnx2x", bnx2x_pnp);
}
+init_func_3(etherbnx2x_link);
diff --git a/kern/drivers/net/ether8139.c b/kern/drivers/net/ether8139.c
index f5761df..199a0c6 100644
--- a/kern/drivers/net/ether8139.c
+++ b/kern/drivers/net/ether8139.c
@@ -801,7 +801,8 @@
return 0;
}
-linker_func_3(ether8139link)
+static void __init ether8139link(void)
{
addethercard("rtl8139", rtl8139pnp);
}
+init_func_3(ether8139link);
diff --git a/kern/drivers/net/ether82563.c b/kern/drivers/net/ether82563.c
index c4c48fc..5a2e1c3 100644
--- a/kern/drivers/net/ether82563.c
+++ b/kern/drivers/net/ether82563.c
@@ -2297,7 +2297,7 @@
return pnp(e, i218);
}
-linker_func_3(ether82563link)
+static void __init ether82563link(void)
{
/* recognise lots of model numbers for debugging assistance */
addethercard("i82563", i82563pnp);
@@ -2312,3 +2312,4 @@
addethercard("i218", i218pnp);
addethercard("igbepcie", anypnp);
}
+init_func_3(ether82563link);
diff --git a/kern/drivers/net/etherigbe.c b/kern/drivers/net/etherigbe.c
index f29869f..13d5463 100644
--- a/kern/drivers/net/etherigbe.c
+++ b/kern/drivers/net/etherigbe.c
@@ -2040,8 +2040,9 @@
return 0;
}
-linker_func_3(etherigbelink)
+static void __init etherigbelink()
{
addethercard("i82543", igbepnp);
addethercard("igbe", igbepnp);
}
+init_func_3(etherigbelink);
diff --git a/kern/drivers/net/mlx4/main.c b/kern/drivers/net/mlx4/main.c
index bd8217e..2309a21 100644
--- a/kern/drivers/net/mlx4/main.c
+++ b/kern/drivers/net/mlx4/main.c
@@ -3979,8 +3979,9 @@
return 0;
}
-linker_func_3(ethermlx4_link)
+static void __init ethermlx4_link(void)
{
addethercard("mlx4", mlx4_pnp);
}
+init_func_3(ethermlx4_link);
#endif
diff --git a/kern/drivers/net/r8169.c b/kern/drivers/net/r8169.c
index b9924e1..4f57342 100644
--- a/kern/drivers/net/r8169.c
+++ b/kern/drivers/net/r8169.c
@@ -8867,7 +8867,8 @@
return 0;
}
-linker_func_3(ether_rtl8169_link)
+static void __init ether_rtl8169_link(void)
{
addethercard("r8169", rtl8169_pnp);
}
+init_func_3(ether_rtl8169_link);
diff --git a/kern/include/linker_func.h b/kern/include/linker_func.h
index 72e3e68..8dd4abb 100644
--- a/kern/include/linker_func.h
+++ b/kern/include/linker_func.h
@@ -9,19 +9,20 @@
* higher levels. There is no guarantee of ordering of functions within a
* level.
*
- * To use, change your function definition to use the appropriate macro, e.g.
+ * To use, simply add the __init tag and the appropriate init_func_X(func);
*
- * void foo(void)
+ * static void foo(void)
* {
* bar();
* }
*
* becomes
*
- * linker_func_3(foo)
+ * static void __init foo(void)
* {
* bar();
* }
+ * init_func_3(foo);
*
* And foo() will run during the third level of functions.
*
@@ -29,6 +30,8 @@
#pragma once
+#define __init
+
#define __linkerfunc1 __attribute__((__section__(".linkerfunc1")))
#define __linkerfunc2 __attribute__((__section__(".linkerfunc2")))
#define __linkerfunc3 __attribute__((__section__(".linkerfunc3")))
@@ -36,25 +39,11 @@
typedef void (*linker_func_t)(void);
-#define linker_func_1(x) \
- void (x)(void); \
- linker_func_t __linkerfunc1 __##x = (x); \
- void (x)(void)
-
-#define linker_func_2(x) \
- void (x)(void); \
- linker_func_t __linkerfunc2 __##x = (x); \
- void (x)(void)
-
-#define linker_func_3(x) \
- void (x)(void); \
- linker_func_t __linkerfunc3 __##x = (x); \
- void (x)(void)
-
-#define linker_func_4(x) \
- void (x)(void); \
- linker_func_t __linkerfunc4 __##x = (x); \
- void (x)(void)
+/* Casting for the sake of Linux functions, which return an int. */
+#define init_func_1(x) linker_func_t __linkerfunc1 __##x = (linker_func_t)(x);
+#define init_func_2(x) linker_func_t __linkerfunc2 __##x = (linker_func_t)(x);
+#define init_func_3(x) linker_func_t __linkerfunc3 __##x = (linker_func_t)(x);
+#define init_func_4(x) linker_func_t __linkerfunc4 __##x = (linker_func_t)(x);
extern linker_func_t __linkerfunc1start[];
extern linker_func_t __linkerfunc1end[];
diff --git a/kern/include/linux_compat.h b/kern/include/linux_compat.h
index 0d9232c..c645057 100644
--- a/kern/include/linux_compat.h
+++ b/kern/include/linux_compat.h
@@ -312,7 +312,6 @@
#define MODULE_DEVICE_TABLE(...)
#define THIS_MODULE ((void*)0)
#define EXPORT_SYMBOL(...)
-#define __init
#define __exit
#define module_init(...)
#define module_exit(...)
diff --git a/kern/src/ktest/net_ktests.c b/kern/src/ktest/net_ktests.c
index 19ef811..ef33ded 100644
--- a/kern/src/ktest/net_ktests.c
+++ b/kern/src/ktest/net_ktests.c
@@ -88,7 +88,8 @@
static int num_ktests = sizeof(ktests) / sizeof(struct ktest);
-linker_func_1(register_net_ktests)
+static void __init register_net_ktests(void)
{
REGISTER_KTESTS(ktests, num_ktests);
}
+init_func_1(register_net_ktests);
diff --git a/kern/src/ktest/pb_ktests.c b/kern/src/ktest/pb_ktests.c
index 9049d16..05d22ea 100644
--- a/kern/src/ktest/pb_ktests.c
+++ b/kern/src/ktest/pb_ktests.c
@@ -2097,110 +2097,9 @@
KTEST_REG(percpu_increment, CONFIG_TEST_percpu_increment),
};
static int num_ktests = sizeof(ktests) / sizeof(struct ktest);
-linker_func_1(register_pb_ktests)
+
+static void __init register_pb_ktests(void)
{
REGISTER_KTESTS(ktests, num_ktests);
}
-
-/* Linker function tests. Keep them commented, etc. */
-#if 0
-linker_func_1(xme11)
-{
- printk("xme11\n");
-}
-
-linker_func_1(xme12)
-{
- printk("xme12\n");
-}
-
-linker_func_1(xme13)
-{
- printk("xme13\n");
-}
-
-linker_func_1(xme14)
-{
- printk("xme14\n");
-}
-
-linker_func_1(xme15)
-{
- printk("xme15\n");
-}
-
-linker_func_2(xme21)
-{
- printk("xme21\n");
-}
-
-linker_func_2(xme22)
-{
- printk("xme22\n");
-}
-
-linker_func_2(xme23)
-{
- printk("xme23\n");
-}
-
-linker_func_2(xme24)
-{
- printk("xme24\n");
-}
-
-linker_func_2(xme25)
-{
- printk("xme25\n");
-}
-
-linker_func_3(xme31)
-{
- printk("xme31\n");
-}
-
-linker_func_3(xme32)
-{
- printk("xme32\n");
-}
-
-linker_func_3(xme33)
-{
- printk("xme33\n");
-}
-
-linker_func_3(xme34)
-{
- printk("xme34\n");
-}
-
-linker_func_3(xme35)
-{
- printk("xme35\n");
-}
-
-linker_func_4(xme41)
-{
- printk("xme41\n");
-}
-
-linker_func_4(xme42)
-{
- printk("xme42\n");
-}
-
-linker_func_4(xme43)
-{
- printk("xme43\n");
-}
-
-linker_func_4(xme44)
-{
- printk("xme44\n");
-}
-
-linker_func_4(xme45)
-{
- printk("xme45\n");
-}
-#endif /* linker func tests */
+init_func_1(register_pb_ktests);
diff --git a/kern/src/net/ethermedium.c b/kern/src/net/ethermedium.c
index c96f463..bb39564 100644
--- a/kern/src/net/ethermedium.c
+++ b/kern/src/net/ethermedium.c
@@ -859,11 +859,12 @@
return NULL;
}
-linker_func_4(ethermediumlink)
+static void __init ethermediumlink(void)
{
addipmedium(ðermedium);
addipmedium(&trexmedium);
}
+init_func_4(ethermediumlink);
static void etherpref2addr(uint8_t * pref, uint8_t * ea)
{
diff --git a/kern/src/net/loopbackmedium.c b/kern/src/net/loopbackmedium.c
index 4cdf617..25918d5 100644
--- a/kern/src/net/loopbackmedium.c
+++ b/kern/src/net/loopbackmedium.c
@@ -149,7 +149,8 @@
.bwrite = loopbackbwrite,
};
-linker_func_4(loopbackmediumlink)
+static void __init loopbackmediumlink(void)
{
addipmedium(&loopbackmedium);
}
+init_func_4(loopbackmediumlink);