1 /*
2  * Copyright (C) 2015-2021 Alibaba Group Holding Limited
3  */
4 #include <stddef.h>
5 
6 #ifdef USER_SPACE_DRIVER
7 #include <rpc.h>
8 #endif
9 #include <drivers/char/u_device.h>
10 #include <drivers/u_ld.h>
11 #include <drivers/char/u_device.h>
12 #include <drivers/char/u_cdev_msg.h>
13 
14 extern long __core_driver_start__;
15 extern long __core_driver_end__;
16 extern long __bus_driver_start__;
17 extern long __bus_driver_end__;
18 extern long __vfs_driver_start__;
19 extern long __vfs_driver_end__;
20 extern long __early_driver_start__;
21 extern long __early_driver_end__;
22 extern long __level0_driver_start__;
23 extern long __level0_driver_end__;
24 extern long __level1_driver_start__;
25 extern long __level1_driver_end__;
26 extern long __level2_driver_start__;
27 extern long __level2_driver_end__;
28 extern long __level3_driver_start__;
29 extern long __level3_driver_end__;
30 extern long __post_driver_start__;
31 extern long __post_driver_end__;
32 
33 struct section_info {
34     OS_DRIVER_ENTRY *s;
35     OS_DRIVER_ENTRY *e;
36 };
37 
38 #define DODE(x) (OS_DRIVER_ENTRY *)(x)
39 
40 /**
41  * all driver entry declared with XXXX_DRIVER_ENTRY or XXXX_DRIVER_FULL_ENTRY (POST is excluded) will be called with specified
42  * sequence
43  *
44  * @return 0 for success; negative error no. for failure
45  */
_os_driver_entry(void)46 int _os_driver_entry(void) {
47     int i = 0;
48     OS_DRIVER_ENTRY *s = NULL;
49     OS_DRIVER_ENTRY *e = NULL;
50 
51     OS_DRIVER_ENTRY *drv_entry = NULL;
52 
53     struct section_info g_drv_section_entry[] = {
54         {DODE(&__core_driver_start__), DODE(&__core_driver_end__)},
55         {DODE(&__bus_driver_start__), DODE(&__bus_driver_end__)},
56         {DODE(&__early_driver_start__), DODE(&__early_driver_end__)},
57         {DODE(&__vfs_driver_start__), DODE(&__vfs_driver_end__)},
58         {DODE(&__level0_driver_start__), DODE(&__level0_driver_end__)},
59         {DODE(&__level1_driver_start__), DODE(&__level1_driver_end__)},
60         {DODE(&__level2_driver_start__), DODE(&__level2_driver_end__)},
61         {DODE(&__level3_driver_start__), DODE(&__level3_driver_end__)},
62     };
63 
64     for (i = 0; i < sizeof(g_drv_section_entry)/sizeof(g_drv_section_entry[0]); i++) {
65         s = g_drv_section_entry[i].s;
66         e = g_drv_section_entry[i].e;
67         drv_entry = s;
68         while (drv_entry < e) {
69             ddkc_dbg("drv_entry:%p, *drv_entry:%p\r\n", drv_entry, *drv_entry);
70             (*((OS_DRIVER_ENTRY *)drv_entry))();
71             drv_entry++;
72         }
73 
74     }
75     return 0;
76 }
77 
78 /**
79  * all driver entry declared with POST_DRIVER_ENTRY or POST_DRIVER_FULL_ENTRY will be called with specified
80  * sequence
81  *
82  * @return 0 for success; negative error no. for failure
83  */
_os_post_driver_entry(void)84 int _os_post_driver_entry(void) {
85     int i = 0;
86     OS_DRIVER_ENTRY *s = NULL;
87     OS_DRIVER_ENTRY *e = NULL;
88 
89     OS_DRIVER_ENTRY *drv_entry = NULL;
90 
91     struct section_info g_drv_section_entry[] = {
92         {DODE(&__post_driver_start__), DODE(&__post_driver_end__)},
93     };
94 
95     for (i = 0; i < sizeof(g_drv_section_entry)/sizeof(g_drv_section_entry[0]); i++) {
96         s = g_drv_section_entry[i].s;
97         e = g_drv_section_entry[i].e;
98         drv_entry = s;
99         while (drv_entry < e) {
100             ddkc_dbg("drv_entry:%p, *drv_entry:%p\r\n", drv_entry, *drv_entry);
101             (*((OS_DRIVER_ENTRY *)drv_entry))();
102             drv_entry++;
103         }
104 
105     }
106     return 0;
107 }
108