1
- use crate :: framebuffer:: FrameBufferWriter ;
1
+ use crate :: { framebuffer:: FrameBufferWriter , serial :: SerialPort } ;
2
2
use bootloader_api:: info:: FrameBufferInfo ;
3
3
use conquer_once:: spin:: OnceCell ;
4
4
use core:: fmt:: Write ;
@@ -8,20 +8,26 @@ use spinning_top::Spinlock;
8
8
pub static LOGGER : OnceCell < LockedLogger > = OnceCell :: uninit ( ) ;
9
9
10
10
/// A [`FrameBufferWriter`] instance protected by a spinlock.
11
- pub struct LockedLogger ( Spinlock < FrameBufferWriter > ) ;
11
+ pub struct LockedLogger ( Spinlock < FrameBufferWriter > , Spinlock < SerialPort > ) ;
12
12
13
13
impl LockedLogger {
14
14
/// Create a new instance that logs to the given framebuffer.
15
15
pub fn new ( framebuffer : & ' static mut [ u8 ] , info : FrameBufferInfo ) -> Self {
16
- LockedLogger ( Spinlock :: new ( FrameBufferWriter :: new ( framebuffer, info) ) )
16
+ LockedLogger (
17
+ Spinlock :: new ( FrameBufferWriter :: new ( framebuffer, info) ) ,
18
+ Spinlock :: new ( SerialPort :: new ( ) ) ,
19
+ )
17
20
}
18
21
19
22
/// Force-unlocks the logger to prevent a deadlock.
20
23
///
21
24
/// ## Safety
22
25
/// This method is not memory safe and should be only used when absolutely necessary.
23
26
pub unsafe fn force_unlock ( & self ) {
24
- unsafe { self . 0 . force_unlock ( ) } ;
27
+ unsafe {
28
+ self . 0 . force_unlock ( ) ;
29
+ self . 1 . force_unlock ( ) ;
30
+ } ;
25
31
}
26
32
}
27
33
@@ -32,7 +38,9 @@ impl log::Log for LockedLogger {
32
38
33
39
fn log ( & self , record : & log:: Record ) {
34
40
let mut logger = self . 0 . lock ( ) ;
41
+ let mut serial = self . 1 . lock ( ) ;
35
42
writeln ! ( logger, "{:5}: {}" , record. level( ) , record. args( ) ) . unwrap ( ) ;
43
+ writeln ! ( serial, "{:5}: {}" , record. level( ) , record. args( ) ) . unwrap ( ) ;
36
44
}
37
45
38
46
fn flush ( & self ) { }
0 commit comments