Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ description = "Makes a kernel compatible with the bootloader crate"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
log = "0.4.17"

[dev-dependencies]
rand = "0.8.4"
1 change: 1 addition & 0 deletions api/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ fn main() {
(88, 9),
(97, 9),
(106, 9),
(115, 1),
];

let mut code = String::new();
Expand Down
36 changes: 33 additions & 3 deletions api/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ pub struct BootloaderConfig {
/// Configuration for the frame buffer that can be used by the kernel to display pixels
/// on the screen.
pub frame_buffer: FrameBuffer,

/// Configuration for changing the level of the filter of the messages that are shown in the
/// screen when booting. The default is 'Trace'.
pub log_level: log::LevelFilter,
}

impl BootloaderConfig {
Expand All @@ -35,7 +39,7 @@ impl BootloaderConfig {
0x3D,
];
#[doc(hidden)]
pub const SERIALIZED_LEN: usize = 115;
pub const SERIALIZED_LEN: usize = 116;

/// Creates a new default configuration with the following values:
///
Expand All @@ -48,6 +52,7 @@ impl BootloaderConfig {
version: ApiVersion::new_default(),
mappings: Mappings::new_default(),
frame_buffer: FrameBuffer::new_default(),
log_level: log::LevelFilter::Trace,
}
}

Expand All @@ -61,6 +66,7 @@ impl BootloaderConfig {
mappings,
kernel_stack_size,
frame_buffer,
log_level,
} = self;
let ApiVersion {
version_major,
Expand Down Expand Up @@ -133,13 +139,24 @@ impl BootloaderConfig {
},
);

concat_106_9(
let buf = concat_106_9(
buf,
match minimum_framebuffer_width {
Option::None => [0; 9],
Option::Some(addr) => concat_1_8([1], addr.to_le_bytes()),
},
)
);

let log_level: u8 = match log_level {
log::LevelFilter::Trace => 0,
log::LevelFilter::Debug => 1,
log::LevelFilter::Info => 2,
log::LevelFilter::Warn => 3,
log::LevelFilter::Error => 4,
log::LevelFilter::Off => 5,
};

concat_115_1(buf, log_level.to_le_bytes())
}

/// Tries to deserialize a config byte array that was created using [`Self::serialize`].
Expand Down Expand Up @@ -252,6 +269,17 @@ impl BootloaderConfig {
(frame_buffer, s)
};

let (&log_level, s) = split_array_ref(s);
let log_level = match u8::from_le_bytes(log_level) {
0 => log::LevelFilter::Trace,
1 => log::LevelFilter::Debug,
2 => log::LevelFilter::Info,
3 => log::LevelFilter::Warn,
4 => log::LevelFilter::Error,
5 => log::LevelFilter::Off,
_ => return Err("log_level invalid"),
};

if !s.is_empty() {
return Err("unexpected rest");
}
Expand All @@ -261,6 +289,7 @@ impl BootloaderConfig {
kernel_stack_size: u64::from_le_bytes(kernel_stack_size),
mappings,
frame_buffer,
log_level,
})
}

Expand All @@ -271,6 +300,7 @@ impl BootloaderConfig {
mappings: Mappings::random(),
kernel_stack_size: rand::random(),
frame_buffer: FrameBuffer::random(),
log_level: log::LevelFilter::Trace,
}
}
}
Expand Down
16 changes: 8 additions & 8 deletions bios/stage-4/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,6 @@ mod memory_descriptor;
#[no_mangle]
#[link_section = ".start"]
pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
let framebuffer_info = init_logger(info.framebuffer);
log::info!("4th Stage");
log::info!("{info:x?}");

let memory_map: &mut [E820MemoryRegion] = unsafe {
core::slice::from_raw_parts_mut(
info.memory_map_addr as *mut _,
Expand Down Expand Up @@ -102,8 +98,6 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
// it's mapped using `invlpg`, for efficiency.
x86_64::instructions::tlb::flush_all();

log::info!("BIOS boot");

let page_tables = create_page_tables(&mut frame_allocator);

let kernel_slice = {
Expand All @@ -112,6 +106,12 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
};
let kernel = Kernel::parse(kernel_slice);

let framebuffer_info = init_logger(info.framebuffer, kernel.config.log_level);

log::info!("4th Stage");
log::info!("{info:x?}");
log::info!("BIOS boot");

let system_info = SystemInfo {
framebuffer: Some(RawFrameBufferInfo {
addr: PhysAddr::new(info.framebuffer.region.start),
Expand All @@ -123,7 +123,7 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
load_and_switch_to_kernel(kernel, frame_allocator, page_tables, system_info);
}

fn init_logger(info: BiosFramebufferInfo) -> FrameBufferInfo {
fn init_logger(info: BiosFramebufferInfo, log_level: log::LevelFilter) -> FrameBufferInfo {
let framebuffer_info = FrameBufferInfo {
byte_len: info.region.len.try_into().unwrap(),
width: info.width.into(),
Expand Down Expand Up @@ -152,7 +152,7 @@ fn init_logger(info: BiosFramebufferInfo) -> FrameBufferInfo {
)
};

bootloader_x86_64_common::init_logger(framebuffer, framebuffer_info);
bootloader_x86_64_common::init_logger(framebuffer, framebuffer_info, log_level);

framebuffer_info
}
Expand Down
8 changes: 6 additions & 2 deletions common/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,14 @@ pub mod logger;
const PAGE_SIZE: u64 = 4096;

/// Initialize a text-based logger using the given pixel-based framebuffer as output.
pub fn init_logger(framebuffer: &'static mut [u8], info: FrameBufferInfo) {
pub fn init_logger(
framebuffer: &'static mut [u8],
info: FrameBufferInfo,
log_level: log::LevelFilter,
) {
let logger = logger::LOGGER.get_or_init(move || logger::LockedLogger::new(framebuffer, info));
log::set_logger(logger).expect("logger already set");
log::set_max_level(log::LevelFilter::Trace);
log::set_max_level(log_level);
log::info!("Framebuffer info: {:?}", info);
}

Expand Down
2 changes: 1 addition & 1 deletion uefi/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ fn init_logger(st: &SystemTable<Boot>, config: BootloaderConfig) -> Option<RawFr

log::info!("UEFI boot");

bootloader_x86_64_common::init_logger(slice, info);
bootloader_x86_64_common::init_logger(slice, info, config.log_level);

Some(RawFrameBufferInfo {
addr: PhysAddr::new(framebuffer.as_mut_ptr() as u64),
Expand Down