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);