@@ -27,6 +27,20 @@ pub struct BootloaderConfig {
2727 /// Configuration for the frame buffer that can be used by the kernel to display pixels
2828 /// on the screen.
2929 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 ,
3044}
3145
3246impl BootloaderConfig {
@@ -35,7 +49,7 @@ impl BootloaderConfig {
3549 0x3D ,
3650 ] ;
3751 #[ doc( hidden) ]
38- pub const SERIALIZED_LEN : usize = 115 ;
52+ pub const SERIALIZED_LEN : usize = 118 ;
3953
4054 /// Creates a new default configuration with the following values:
4155 ///
@@ -48,6 +62,9 @@ impl BootloaderConfig {
4862 version : ApiVersion :: new_default ( ) ,
4963 mappings : Mappings :: new_default ( ) ,
5064 frame_buffer : FrameBuffer :: new_default ( ) ,
65+ log_level : LevelFilter :: Trace ,
66+ frame_buffer_logger_status : LoggerStatus :: Enable ,
67+ serial_logger_status : LoggerStatus :: Enable ,
5168 }
5269 }
5370
@@ -61,6 +78,9 @@ impl BootloaderConfig {
6178 mappings,
6279 kernel_stack_size,
6380 frame_buffer,
81+ log_level,
82+ frame_buffer_logger_status,
83+ serial_logger_status,
6484 } = self ;
6585 let ApiVersion {
6686 version_major,
@@ -133,12 +153,22 @@ impl BootloaderConfig {
133153 } ,
134154 ) ;
135155
136- concat_106_9 (
156+ let buf = concat_106_9 (
137157 buf,
138158 match minimum_framebuffer_width {
139159 Option :: None => [ 0 ; 9 ] ,
140160 Option :: Some ( addr) => concat_1_8 ( [ 1 ] , addr. to_le_bytes ( ) ) ,
141161 } ,
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 ( ) ,
142172 )
143173 }
144174
@@ -252,6 +282,28 @@ impl BootloaderConfig {
252282 ( frame_buffer, s)
253283 } ;
254284
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+
255307 if !s. is_empty ( ) {
256308 return Err ( "unexpected rest" ) ;
257309 }
@@ -261,6 +313,9 @@ impl BootloaderConfig {
261313 kernel_stack_size : u64:: from_le_bytes ( kernel_stack_size) ,
262314 mappings,
263315 frame_buffer,
316+ log_level,
317+ frame_buffer_logger_status,
318+ serial_logger_status,
264319 } )
265320 }
266321
@@ -271,6 +326,9 @@ impl BootloaderConfig {
271326 mappings : Mappings :: random ( ) ,
272327 kernel_stack_size : rand:: random ( ) ,
273328 frame_buffer : FrameBuffer :: random ( ) ,
329+ log_level : LevelFilter :: Trace ,
330+ frame_buffer_logger_status : LoggerStatus :: Enable ,
331+ serial_logger_status : LoggerStatus :: Enable ,
274332 }
275333 }
276334}
@@ -534,6 +592,63 @@ impl Default for Mapping {
534592 }
535593}
536594
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+
537652/// Taken from https://github.com/rust-lang/rust/blob/e100ec5bc7cd768ec17d75448b29c9ab4a39272b/library/core/src/slice/mod.rs#L1673-L1677
538653///
539654/// TODO replace with `split_array` feature in stdlib as soon as it's stabilized,
0 commit comments