Skip to content

Commit d983247

Browse files
committed
Switch stage-4 to logger instead of using custom screen writer
1 parent a5fe892 commit d983247

File tree

4 files changed

+46
-207
lines changed

4 files changed

+46
-207
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bios/stage-4/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,3 @@ log = "0.4.14"
1313
x86_64 = "0.14.8"
1414
rsdp = "2.0.0"
1515
usize_conversions = "0.2.0"
16-
noto-sans-mono-bitmap = "0.1.5"

bios/stage-4/src/main.rs

Lines changed: 46 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,13 @@
22
#![no_main]
33

44
use crate::memory_descriptor::MemoryRegion;
5-
use crate::screen::Writer;
65
use bootloader_api::info::{FrameBufferInfo, PixelFormat};
7-
use bootloader_x86_64_bios_common::{BiosInfo, E820MemoryRegion};
6+
use bootloader_x86_64_bios_common::{BiosFramebufferInfo, BiosInfo, E820MemoryRegion};
87
use bootloader_x86_64_common::{
9-
legacy_memory_region::LegacyFrameAllocator, load_and_switch_to_kernel, logger::LOGGER, Kernel,
10-
PageTables, SystemInfo,
11-
};
12-
use core::{
13-
arch::{asm, global_asm},
14-
fmt::Write,
15-
mem::size_of,
16-
panic::PanicInfo,
17-
slice,
8+
legacy_memory_region::LegacyFrameAllocator, load_and_switch_to_kernel, Kernel, PageTables,
9+
SystemInfo,
1810
};
11+
use core::slice;
1912
use usize_conversions::usize_from;
2013
use x86_64::structures::paging::{FrameAllocator, OffsetPageTable};
2114
use x86_64::structures::paging::{
@@ -24,14 +17,13 @@ use x86_64::structures::paging::{
2417
use x86_64::{PhysAddr, VirtAddr};
2518

2619
mod memory_descriptor;
27-
mod screen;
2820

2921
#[no_mangle]
3022
#[link_section = ".start"]
3123
pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
32-
screen::init(info.framebuffer);
33-
writeln!(Writer, "4th Stage").unwrap();
34-
writeln!(Writer, "{info:x?}").unwrap();
24+
let framebuffer_info = init_logger(info.framebuffer);
25+
log::info!("4th Stage");
26+
log::info!("{info:x?}");
3527

3628
let memory_map: &mut [E820MemoryRegion] = unsafe {
3729
core::slice::from_raw_parts_mut(
@@ -45,7 +37,7 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
4537
let max_phys_addr = memory_map
4638
.iter()
4739
.map(|r| {
48-
writeln!(Writer, "start: {:#x}, len: {:#x}", r.start_addr, r.len).unwrap();
40+
log::info!("start: {:#x}, len: {:#x}", r.start_addr, r.len);
4941
r.start_addr + r.len
5042
})
5143
.max()
@@ -92,28 +84,6 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
9284
}
9385
}
9486

95-
let framebuffer_addr = PhysAddr::new(info.framebuffer.region.start);
96-
let framebuffer_info = FrameBufferInfo {
97-
byte_len: info.framebuffer.region.len.try_into().unwrap(),
98-
width: info.framebuffer.width.into(),
99-
height: info.framebuffer.height.into(),
100-
pixel_format: match info.framebuffer.pixel_format {
101-
bootloader_x86_64_bios_common::PixelFormat::Rgb => PixelFormat::Rgb,
102-
bootloader_x86_64_bios_common::PixelFormat::Bgr => PixelFormat::Bgr,
103-
bootloader_x86_64_bios_common::PixelFormat::Unknown {
104-
red_position,
105-
green_position,
106-
blue_position,
107-
} => PixelFormat::Unknown {
108-
red_position,
109-
green_position,
110-
blue_position,
111-
},
112-
},
113-
bytes_per_pixel: info.framebuffer.bytes_per_pixel.into(),
114-
stride: info.framebuffer.stride.into(),
115-
};
116-
11787
log::info!("BIOS boot");
11888

11989
let page_tables = create_page_tables(&mut frame_allocator);
@@ -125,38 +95,46 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
12595
let kernel = Kernel::parse(kernel_slice);
12696

12797
let system_info = SystemInfo {
128-
framebuffer_addr,
98+
framebuffer_addr: PhysAddr::new(info.framebuffer.region.start),
12999
framebuffer_info,
130100
rsdp_addr: detect_rsdp(),
131101
};
132102

133103
load_and_switch_to_kernel(kernel, frame_allocator, page_tables, system_info);
134104
}
135105

136-
fn init_logger(
137-
framebuffer_start: PhysAddr,
138-
framebuffer_size: usize,
139-
horizontal_resolution: usize,
140-
vertical_resolution: usize,
141-
bytes_per_pixel: usize,
142-
stride: usize,
143-
pixel_format: PixelFormat,
144-
) -> FrameBufferInfo {
145-
let ptr = framebuffer_start.as_u64() as *mut u8;
146-
let slice = unsafe { slice::from_raw_parts_mut(ptr, framebuffer_size) };
147-
148-
let info = FrameBufferInfo {
149-
byte_len: framebuffer_size,
150-
width: horizontal_resolution,
151-
height: vertical_resolution,
152-
bytes_per_pixel,
153-
stride,
154-
pixel_format,
106+
fn init_logger(info: BiosFramebufferInfo) -> FrameBufferInfo {
107+
let framebuffer_info = FrameBufferInfo {
108+
byte_len: info.region.len.try_into().unwrap(),
109+
width: info.width.into(),
110+
height: info.height.into(),
111+
pixel_format: match info.pixel_format {
112+
bootloader_x86_64_bios_common::PixelFormat::Rgb => PixelFormat::Rgb,
113+
bootloader_x86_64_bios_common::PixelFormat::Bgr => PixelFormat::Bgr,
114+
bootloader_x86_64_bios_common::PixelFormat::Unknown {
115+
red_position,
116+
green_position,
117+
blue_position,
118+
} => PixelFormat::Unknown {
119+
red_position,
120+
green_position,
121+
blue_position,
122+
},
123+
},
124+
bytes_per_pixel: info.bytes_per_pixel.into(),
125+
stride: info.stride.into(),
126+
};
127+
128+
let framebuffer = unsafe {
129+
core::slice::from_raw_parts_mut(
130+
info.region.start as *mut u8,
131+
info.region.len.try_into().unwrap(),
132+
)
155133
};
156134

157-
bootloader_x86_64_common::init_logger(slice, info);
135+
bootloader_x86_64_common::init_logger(framebuffer, framebuffer_info);
158136

159-
info
137+
framebuffer_info
160138
}
161139

162140
/// Creates page table abstraction types for both the bootloader and kernel page tables.
@@ -230,13 +208,15 @@ fn detect_rsdp() -> Option<PhysAddr> {
230208
}
231209

232210
#[panic_handler]
233-
fn panic(info: &PanicInfo) -> ! {
234-
// TODO remove
235-
let _ = writeln!(Writer, "{info}");
236-
237-
unsafe { LOGGER.get().map(|l| l.force_unlock()) };
211+
#[cfg(not(test))]
212+
fn panic(info: &core::panic::PanicInfo) -> ! {
213+
unsafe {
214+
bootloader_x86_64_common::logger::LOGGER
215+
.get()
216+
.map(|l| l.force_unlock())
217+
};
238218
log::error!("{}", info);
239219
loop {
240-
unsafe { asm!("cli; hlt") };
220+
unsafe { core::arch::asm!("cli; hlt") };
241221
}
242222
}

bios/stage-4/src/screen.rs

Lines changed: 0 additions & 139 deletions
This file was deleted.

0 commit comments

Comments
 (0)