22#![ no_main]
33
44use crate :: memory_descriptor:: MemoryRegion ;
5- use crate :: screen:: Writer ;
65use bootloader_api:: info:: { FrameBufferInfo , PixelFormat } ;
7- use bootloader_x86_64_bios_common:: { BiosInfo , E820MemoryRegion } ;
6+ use bootloader_x86_64_bios_common:: { BiosFramebufferInfo , BiosInfo , E820MemoryRegion } ;
87use 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;
1912use usize_conversions:: usize_from;
2013use x86_64:: structures:: paging:: { FrameAllocator , OffsetPageTable } ;
2114use x86_64:: structures:: paging:: {
@@ -24,14 +17,13 @@ use x86_64::structures::paging::{
2417use x86_64:: { PhysAddr , VirtAddr } ;
2518
2619mod memory_descriptor;
27- mod screen;
2820
2921#[ no_mangle]
3022#[ link_section = ".start" ]
3123pub 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}
0 commit comments