Make linker function declarations a tag
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 28 Aug 2019 18:13:07 +0000 (14:13 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 1 Oct 2019 14:17:01 +0000 (10:17 -0400)
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>
12 files changed:
kern/drivers/net/bnx2x/bnx2x_dev.c
kern/drivers/net/ether8139.c
kern/drivers/net/ether82563.c
kern/drivers/net/etherigbe.c
kern/drivers/net/mlx4/main.c
kern/drivers/net/r8169.c
kern/include/linker_func.h
kern/include/linux_compat.h
kern/src/ktest/net_ktests.c
kern/src/ktest/pb_ktests.c
kern/src/net/ethermedium.c
kern/src/net/loopbackmedium.c

index eb031a4..b4b0722 100644 (file)
@@ -451,7 +451,8 @@ static int bnx2x_pnp(struct ether *edev)
        return 0;
 }
 
-linker_func_3(etherbnx2x_link)
+static void __init etherbnx2x_link(void)
 {
        addethercard("bnx2x", bnx2x_pnp);
 }
+init_func_3(etherbnx2x_link);
index f5761df..199a0c6 100644 (file)
@@ -801,7 +801,8 @@ static int rtl8139pnp(struct ether *edev)
        return 0;
 }
 
-linker_func_3(ether8139link)
+static void __init ether8139link(void)
 {
        addethercard("rtl8139", rtl8139pnp);
 }
+init_func_3(ether8139link);
index c4c48fc..5a2e1c3 100644 (file)
@@ -2297,7 +2297,7 @@ static int i218pnp(struct ether *e)
        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 @@ linker_func_3(ether82563link)
        addethercard("i218", i218pnp);
        addethercard("igbepcie", anypnp);
 }
+init_func_3(ether82563link);
index f29869f..13d5463 100644 (file)
@@ -2040,8 +2040,9 @@ static int igbepnp(struct ether *edev)
        return 0;
 }
 
-linker_func_3(etherigbelink)
+static void __init etherigbelink()
 {
        addethercard("i82543", igbepnp);
        addethercard("igbe", igbepnp);
 }
+init_func_3(etherigbelink);
index bd8217e..2309a21 100644 (file)
@@ -3979,8 +3979,9 @@ static int mlx4_pnp(struct ether *edev)
        return 0;
 }
 
-linker_func_3(ethermlx4_link)
+static void __init ethermlx4_link(void)
 {
        addethercard("mlx4", mlx4_pnp);
 }
+init_func_3(ethermlx4_link);
 #endif
index b9924e1..4f57342 100644 (file)
@@ -8867,7 +8867,8 @@ static int rtl8169_pnp(struct ether *edev)
        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);
index 72e3e68..8dd4abb 100644 (file)
@@ -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")))
 
 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[];
index 0d9232c..c645057 100644 (file)
@@ -312,7 +312,6 @@ enum {
 #define MODULE_DEVICE_TABLE(...)
 #define THIS_MODULE ((void*)0)
 #define EXPORT_SYMBOL(...)
-#define __init
 #define __exit
 #define module_init(...)
 #define module_exit(...)
index 19ef811..ef33ded 100644 (file)
@@ -88,7 +88,8 @@ static struct ktest ktests[] = {
 
 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);
index 9049d16..05d22ea 100644 (file)
@@ -2097,110 +2097,9 @@ static struct ktest ktests[] = {
        KTEST_REG(percpu_increment,   CONFIG_TEST_percpu_increment),
 };
 static int num_ktests = sizeof(ktests) / sizeof(struct ktest);
-linker_func_1(register_pb_ktests)
-{
-       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)
+static void __init register_pb_ktests(void)
 {
-       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");
+       REGISTER_KTESTS(ktests, num_ktests);
 }
-#endif /* linker func tests */
+init_func_1(register_pb_ktests);
index c96f463..bb39564 100644 (file)
@@ -859,11 +859,12 @@ static struct block *multicastarp(struct Fs *f, struct arpent *a,
        return NULL;
 }
 
-linker_func_4(ethermediumlink)
+static void __init ethermediumlink(void)
 {
        addipmedium(&ethermedium);
        addipmedium(&trexmedium);
 }
+init_func_4(ethermediumlink);
 
 static void etherpref2addr(uint8_t * pref, uint8_t * ea)
 {
index 4cdf617..25918d5 100644 (file)
@@ -149,7 +149,8 @@ struct medium loopbackmedium = {
        .bwrite = loopbackbwrite,
 };
 
-linker_func_4(loopbackmediumlink)
+static void __init loopbackmediumlink(void)
 {
        addipmedium(&loopbackmedium);
 }
+init_func_4(loopbackmediumlink);