7
7
//! make LLVM=1 M=samples/rust
8
8
9
9
// core is from Rust compiler, not from kernel
10
+ use core:: marker:: PhantomPinned ;
10
11
use core:: ptr;
11
12
12
13
use kernel:: bindings;
@@ -26,8 +27,10 @@ module! {
26
27
}
27
28
28
29
struct RustProc {
30
+ ops : bindings:: proc_ops ,
29
31
parent : * mut bindings:: proc_dir_entry ,
30
32
_entry : * mut bindings:: proc_dir_entry ,
33
+ _pin : PhantomPinned ,
31
34
}
32
35
33
36
impl RustProc {
@@ -55,9 +58,13 @@ impl RustProc {
55
58
pr_info ! ( "proc_open is invoked\n " ) ;
56
59
pr_info ! ( "proc_open is invoked\n " ) ;
57
60
pr_info ! ( "proc_open is invoked\n " ) ;
58
- pr_info ! ( "proc_open is invoked\n " ) ;
59
- pr_info ! ( "proc_open is invoked\n " ) ;
60
- pr_info ! ( "proc_open is invoked\n " ) ;
61
+ pr_err ! ( "proc_open is invoked\n " ) ;
62
+ pr_err ! ( "proc_open is invoked\n " ) ;
63
+ pr_err ! ( "proc_open is invoked\n " ) ;
64
+
65
+ while true {
66
+ pr_info ! ( "proc_open is invoked\n " ) ;
67
+ }
61
68
62
69
unsafe {
63
70
let ret = bindings:: single_open ( _file, Some ( Self :: proc_show) , ptr:: null_mut ( ) ) ;
@@ -79,33 +86,36 @@ impl kernel::Module for RustProc {
79
86
let dir_name = CString :: try_from_fmt ( fmt ! ( "{}" , SUB_DIR_NAME ) ) ?;
80
87
let parent = bindings:: proc_mkdir ( dir_name. as_char_ptr ( ) , ptr:: null_mut ( ) ) ;
81
88
82
- let proc_ops = bindings:: proc_ops {
83
- proc_flags : 0 , // mandatory to prevent build error
84
- proc_get_unmapped_area : None , // mandatory to prevent build error
85
- proc_read_iter : None , // mandatory to prevent build error
86
- proc_open : Some ( Self :: proc_open) ,
87
- proc_read : None ,
88
- proc_write : None ,
89
- proc_lseek : None ,
90
- proc_release : None ,
91
- proc_poll : None ,
92
- proc_ioctl : None ,
93
- proc_mmap : None ,
89
+ let ret = Self {
90
+ parent,
91
+ ops : bindings:: proc_ops {
92
+ proc_flags : 0 , // mandatory to prevent build error
93
+ proc_get_unmapped_area : None , // mandatory to prevent build error
94
+ proc_read_iter : None , // mandatory to prevent build error
95
+ proc_open : Some ( Self :: proc_open) ,
96
+ proc_read : None ,
97
+ proc_write : None ,
98
+ proc_lseek : None ,
99
+ proc_release : None ,
100
+ proc_poll : None ,
101
+ proc_ioctl : None ,
102
+ proc_mmap : None ,
103
+ } ,
104
+ _entry : ptr:: null_mut ( ) ,
105
+ _pin : PhantomPinned ,
94
106
} ;
107
+
95
108
let entry_name = CString :: try_from_fmt ( fmt ! ( "{}" , PROC_FS_NAME ) ) ?;
96
109
let entry: * mut bindings:: proc_dir_entry =
97
- bindings:: proc_create ( entry_name. as_char_ptr ( ) , 0o644 , parent, & proc_ops ) ;
110
+ bindings:: proc_create ( entry_name. as_char_ptr ( ) , 0o644 , parent, & ret . ops ) ;
98
111
// How to check entry?
99
112
if entry. is_null ( ) {
100
113
pr_info ! ( "failed to create a proc entry\n " ) ;
101
114
} else {
102
115
pr_info ! ( "succeeded to create a proc entry: {:p}\n " , entry) ;
103
116
}
104
117
105
- Ok ( RustProc {
106
- parent,
107
- _entry : entry,
108
- } )
118
+ Ok ( ret)
109
119
}
110
120
}
111
121
}
0 commit comments