Skip to content

Commit caf05fb

Browse files
committed
Merge branch 'main' into cargo-features
2 parents 2e4a544 + 94c71d5 commit caf05fb

File tree

10 files changed

+407
-181
lines changed

10 files changed

+407
-181
lines changed

Diff for: Cargo.lock

+4-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: api/build.rs

+3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ fn main() {
2222
(88, 9),
2323
(97, 9),
2424
(106, 9),
25+
(115, 1),
26+
(116, 1),
27+
(117, 1),
2528
];
2629

2730
let mut code = String::new();

Diff for: api/src/config.rs

+117-2
Original file line numberDiff line numberDiff line change
@@ -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

3246
impl 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,

Diff for: bios/stage-4/src/main.rs

+28-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
#![no_main]
33

44
use crate::memory_descriptor::MemoryRegion;
5-
use bootloader_api::info::{FrameBufferInfo, PixelFormat};
5+
use bootloader_api::{
6+
config::{LevelFilter, LoggerStatus},
7+
info::{FrameBufferInfo, PixelFormat},
8+
};
69
use bootloader_x86_64_bios_common::{BiosFramebufferInfo, BiosInfo, E820MemoryRegion};
710
use bootloader_x86_64_common::RawFrameBufferInfo;
811
use bootloader_x86_64_common::{
@@ -24,10 +27,6 @@ mod memory_descriptor;
2427
#[no_mangle]
2528
#[link_section = ".start"]
2629
pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
27-
let framebuffer_info = init_logger(info.framebuffer);
28-
log::info!("4th Stage");
29-
log::info!("{info:x?}");
30-
3130
let memory_map: &mut [E820MemoryRegion] = unsafe {
3231
core::slice::from_raw_parts_mut(
3332
info.memory_map_addr as *mut _,
@@ -102,8 +101,6 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
102101
// it's mapped using `invlpg`, for efficiency.
103102
x86_64::instructions::tlb::flush_all();
104103

105-
log::info!("BIOS boot");
106-
107104
let page_tables = create_page_tables(&mut frame_allocator);
108105

109106
let kernel_slice = {
@@ -112,6 +109,17 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
112109
};
113110
let kernel = Kernel::parse(kernel_slice);
114111

112+
let framebuffer_info = init_logger(
113+
info.framebuffer,
114+
kernel.config.log_level,
115+
kernel.config.frame_buffer_logger_status,
116+
kernel.config.serial_logger_status,
117+
);
118+
119+
log::info!("4th Stage");
120+
log::info!("{info:x?}");
121+
log::info!("BIOS boot");
122+
115123
let system_info = SystemInfo {
116124
framebuffer: Some(RawFrameBufferInfo {
117125
addr: PhysAddr::new(info.framebuffer.region.start),
@@ -123,7 +131,12 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
123131
load_and_switch_to_kernel(kernel, frame_allocator, page_tables, system_info);
124132
}
125133

126-
fn init_logger(info: BiosFramebufferInfo) -> FrameBufferInfo {
134+
fn init_logger(
135+
info: BiosFramebufferInfo,
136+
log_level: LevelFilter,
137+
frame_buffer_logger_status: LoggerStatus,
138+
serial_logger_status: LoggerStatus,
139+
) -> FrameBufferInfo {
127140
let framebuffer_info = FrameBufferInfo {
128141
byte_len: info.region.len.try_into().unwrap(),
129142
width: info.width.into(),
@@ -152,7 +165,13 @@ fn init_logger(info: BiosFramebufferInfo) -> FrameBufferInfo {
152165
)
153166
};
154167

155-
bootloader_x86_64_common::init_logger(framebuffer, framebuffer_info);
168+
bootloader_x86_64_common::init_logger(
169+
framebuffer,
170+
framebuffer_info,
171+
log_level,
172+
frame_buffer_logger_status,
173+
serial_logger_status,
174+
);
156175

157176
framebuffer_info
158177
}

Diff for: common/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ xmas-elf = "0.8.0"
1919
raw-cpuid = "10.2.0"
2020
rand = { version = "0.8.4", default-features = false }
2121
rand_hc = "0.3.1"
22+
uart_16550 = "0.2.18"
2223

2324
[dependencies.noto-sans-mono-bitmap]
2425
version = "0.2.0"

0 commit comments

Comments
 (0)