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