@@ -27,6 +27,20 @@ pub struct BootloaderConfig {
27
27
/// Configuration for the frame buffer that can be used by the kernel to display pixels
28
28
/// on the screen.
29
29
pub frame_buffer : FrameBuffer ,
30
+
31
+ /// Configuration for changing the level of the filter of the messages that are shown in the
32
+ /// screen when booting. The default is 'Trace'.
33
+ pub log_level : LevelFilter ,
34
+
35
+ /// Whether the bootloader should print log messages to the framebuffer when booting.
36
+ ///
37
+ /// Enabled by default.
38
+ pub frame_buffer_logger_status : LoggerStatus ,
39
+
40
+ /// Whether the bootloader should print log messages to the serial port when booting.
41
+ ///
42
+ /// Enabled by default.
43
+ pub serial_logger_status : LoggerStatus ,
30
44
}
31
45
32
46
impl BootloaderConfig {
@@ -35,7 +49,7 @@ impl BootloaderConfig {
35
49
0x3D ,
36
50
] ;
37
51
#[ doc( hidden) ]
38
- pub const SERIALIZED_LEN : usize = 115 ;
52
+ pub const SERIALIZED_LEN : usize = 118 ;
39
53
40
54
/// Creates a new default configuration with the following values:
41
55
///
@@ -48,6 +62,9 @@ impl BootloaderConfig {
48
62
version : ApiVersion :: new_default ( ) ,
49
63
mappings : Mappings :: new_default ( ) ,
50
64
frame_buffer : FrameBuffer :: new_default ( ) ,
65
+ log_level : LevelFilter :: Trace ,
66
+ frame_buffer_logger_status : LoggerStatus :: Enable ,
67
+ serial_logger_status : LoggerStatus :: Enable ,
51
68
}
52
69
}
53
70
@@ -61,6 +78,9 @@ impl BootloaderConfig {
61
78
mappings,
62
79
kernel_stack_size,
63
80
frame_buffer,
81
+ log_level,
82
+ frame_buffer_logger_status,
83
+ serial_logger_status,
64
84
} = self ;
65
85
let ApiVersion {
66
86
version_major,
@@ -133,12 +153,22 @@ impl BootloaderConfig {
133
153
} ,
134
154
) ;
135
155
136
- concat_106_9 (
156
+ let buf = concat_106_9 (
137
157
buf,
138
158
match minimum_framebuffer_width {
139
159
Option :: None => [ 0 ; 9 ] ,
140
160
Option :: Some ( addr) => concat_1_8 ( [ 1 ] , addr. to_le_bytes ( ) ) ,
141
161
} ,
162
+ ) ;
163
+
164
+ let log_level = concat_115_1 ( buf, ( * log_level as u8 ) . to_le_bytes ( ) ) ;
165
+
166
+ let frame_buffer_logger_status =
167
+ concat_116_1 ( log_level, ( * frame_buffer_logger_status as u8 ) . to_le_bytes ( ) ) ;
168
+
169
+ concat_117_1 (
170
+ frame_buffer_logger_status,
171
+ ( * serial_logger_status as u8 ) . to_le_bytes ( ) ,
142
172
)
143
173
}
144
174
@@ -252,6 +282,28 @@ impl BootloaderConfig {
252
282
( frame_buffer, s)
253
283
} ;
254
284
285
+ let ( & log_level, s) = split_array_ref ( s) ;
286
+ let log_level = LevelFilter :: from_u8 ( u8:: from_le_bytes ( log_level) ) ;
287
+ let log_level = match log_level {
288
+ Option :: Some ( level) => level,
289
+ Option :: None => return Err ( "log_level invalid" ) ,
290
+ } ;
291
+
292
+ let ( & frame_buffer_logger_status, s) = split_array_ref ( s) ;
293
+ let frame_buffer_logger_status =
294
+ LoggerStatus :: from_u8 ( u8:: from_le_bytes ( frame_buffer_logger_status) ) ;
295
+ let frame_buffer_logger_status = match frame_buffer_logger_status {
296
+ Option :: Some ( status) => status,
297
+ Option :: None => return Err ( "frame_buffer_logger_status invalid" ) ,
298
+ } ;
299
+
300
+ let ( & serial_logger_status, s) = split_array_ref ( s) ;
301
+ let serial_logger_status = LoggerStatus :: from_u8 ( u8:: from_le_bytes ( serial_logger_status) ) ;
302
+ let serial_logger_status = match serial_logger_status {
303
+ Option :: Some ( status) => status,
304
+ Option :: None => return Err ( "serial_logger_status invalid" ) ,
305
+ } ;
306
+
255
307
if !s. is_empty ( ) {
256
308
return Err ( "unexpected rest" ) ;
257
309
}
@@ -261,6 +313,9 @@ impl BootloaderConfig {
261
313
kernel_stack_size : u64:: from_le_bytes ( kernel_stack_size) ,
262
314
mappings,
263
315
frame_buffer,
316
+ log_level,
317
+ frame_buffer_logger_status,
318
+ serial_logger_status,
264
319
} )
265
320
}
266
321
@@ -271,6 +326,9 @@ impl BootloaderConfig {
271
326
mappings : Mappings :: random ( ) ,
272
327
kernel_stack_size : rand:: random ( ) ,
273
328
frame_buffer : FrameBuffer :: random ( ) ,
329
+ log_level : LevelFilter :: Trace ,
330
+ frame_buffer_logger_status : LoggerStatus :: Enable ,
331
+ serial_logger_status : LoggerStatus :: Enable ,
274
332
}
275
333
}
276
334
}
@@ -534,6 +592,63 @@ impl Default for Mapping {
534
592
}
535
593
}
536
594
595
+ /// An enum representing the available verbosity level filters of the logger.
596
+ ///
597
+ /// Based on
598
+ /// https://github.com/rust-lang/log/blob/dc32ab999f52805d5ce579b526bd9d9684c38d1a/src/lib.rs#L552-565
599
+ #[ repr( u8 ) ]
600
+ #[ derive( Debug , Copy , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
601
+ pub enum LevelFilter {
602
+ /// A level lower than all log levels.
603
+ Off ,
604
+ /// Corresponds to the `Error` log level.
605
+ Error ,
606
+ /// Corresponds to the `Warn` log level.
607
+ Warn ,
608
+ /// Corresponds to the `Info` log level.
609
+ Info ,
610
+ /// Corresponds to the `Debug` log level.
611
+ Debug ,
612
+ /// Corresponds to the `Trace` log level.
613
+ Trace ,
614
+ }
615
+
616
+ impl LevelFilter {
617
+ /// Converts a u8 into a Option<LevelFilter>
618
+ pub fn from_u8 ( value : u8 ) -> Option < LevelFilter > {
619
+ match value {
620
+ 0 => Some ( Self :: Off ) ,
621
+ 1 => Some ( Self :: Error ) ,
622
+ 2 => Some ( Self :: Warn ) ,
623
+ 3 => Some ( Self :: Info ) ,
624
+ 4 => Some ( Self :: Debug ) ,
625
+ 5 => Some ( Self :: Trace ) ,
626
+ _ => None ,
627
+ }
628
+ }
629
+ }
630
+
631
+ /// An enum for enabling or disabling the different methods for logging.
632
+ #[ repr( u8 ) ]
633
+ #[ derive( Debug , Copy , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
634
+ pub enum LoggerStatus {
635
+ /// This method of logging is disabled
636
+ Disable ,
637
+ /// This method of logging is enabled
638
+ Enable ,
639
+ }
640
+
641
+ impl LoggerStatus {
642
+ /// Converts an u8 into a Option<LoggerStatus>
643
+ pub fn from_u8 ( value : u8 ) -> Option < LoggerStatus > {
644
+ match value {
645
+ 0 => Some ( Self :: Disable ) ,
646
+ 1 => Some ( Self :: Enable ) ,
647
+ _ => None ,
648
+ }
649
+ }
650
+ }
651
+
537
652
/// Taken from https://github.com/rust-lang/rust/blob/e100ec5bc7cd768ec17d75448b29c9ab4a39272b/library/core/src/slice/mod.rs#L1673-L1677
538
653
///
539
654
/// TODO replace with `split_array` feature in stdlib as soon as it's stabilized,
0 commit comments