29
29
//! aero_kernel::module_exit!(hello_exit);
30
30
//! ```
31
31
32
- use crate :: { drivers, fs} ;
32
+ use core:: mem:: size_of;
33
+
34
+ use crate :: { drivers, extern_sym, fs} ;
33
35
34
36
/// Inner helper function to make sure the function provided to the [module_init] macro
35
37
/// has a valid function signature. This function returns the passed module init function as
36
38
/// a const void pointer.
37
39
38
- #[ derive( Debug , PartialEq , PartialOrd , Eq , Ord ) ]
40
+ #[ derive( Debug , Copy , Clone , PartialEq , PartialOrd , Eq , Ord ) ]
39
41
#[ repr( C ) ]
40
42
pub enum ModuleType {
41
43
Block = 0 ,
42
44
Other = 1 ,
43
45
}
44
46
45
- #[ derive( Debug ) ]
47
+ #[ derive( Debug , Clone ) ]
46
48
#[ repr( C ) ]
47
49
pub struct Module {
48
50
pub init : * const ( ) ,
@@ -69,20 +71,15 @@ macro_rules! module_init {
69
71
/// we cannot read the ext2 root filesystem, we link all of the kernel modules into the kernel
70
72
/// itself (this is temporary and modules will be loaded from the filesystem in the future).
71
73
pub ( crate ) fn init ( ) {
72
- extern "C" {
73
- static mut __kernel_modules_start: u8 ;
74
- static mut __kernel_modules_end: u8 ;
75
- }
74
+ let modules_start = extern_sym ! ( __kernel_modules_start) . cast :: < Module > ( ) ;
75
+ let modules_end = extern_sym ! ( __kernel_modules_end) . cast :: < Module > ( ) ;
76
76
77
- unsafe {
78
- let size = & __kernel_modules_end as * const u8 as usize
79
- - & __kernel_modules_start as * const u8 as usize ;
80
-
81
- let modules = core:: slice:: from_raw_parts_mut (
82
- & mut __kernel_modules_start as * mut u8 as * mut Module ,
83
- size / core:: mem:: size_of :: < Module > ( ) ,
84
- ) ;
77
+ let size = ( modules_end. addr ( ) - modules_start. addr ( ) ) / size_of :: < Module > ( ) ;
78
+ let modules = unsafe { core:: slice:: from_raw_parts ( modules_start, size) } ;
85
79
80
+ unsafe {
81
+ // TODO: refactor this out
82
+ let mut modules = modules. to_vec ( ) ;
86
83
modules. sort_by ( |e, a| e. ty . cmp ( & a. ty ) ) ;
87
84
88
85
let mut launched_fs = false ;
0 commit comments