2
2
#![ no_main]
3
3
4
4
use crate :: memory_descriptor:: MemoryRegion ;
5
- use crate :: screen:: Writer ;
6
5
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 } ;
8
7
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 ,
18
10
} ;
11
+ use core:: slice;
19
12
use usize_conversions:: usize_from;
20
13
use x86_64:: structures:: paging:: { FrameAllocator , OffsetPageTable } ;
21
14
use x86_64:: structures:: paging:: {
@@ -24,14 +17,13 @@ use x86_64::structures::paging::{
24
17
use x86_64:: { PhysAddr , VirtAddr } ;
25
18
26
19
mod memory_descriptor;
27
- mod screen;
28
20
29
21
#[ no_mangle]
30
22
#[ link_section = ".start" ]
31
23
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?}" ) ;
35
27
36
28
let memory_map: & mut [ E820MemoryRegion ] = unsafe {
37
29
core:: slice:: from_raw_parts_mut (
@@ -45,7 +37,7 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
45
37
let max_phys_addr = memory_map
46
38
. iter ( )
47
39
. 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) ;
49
41
r. start_addr + r. len
50
42
} )
51
43
. max ( )
@@ -92,28 +84,6 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
92
84
}
93
85
}
94
86
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
-
117
87
log:: info!( "BIOS boot" ) ;
118
88
119
89
let page_tables = create_page_tables ( & mut frame_allocator) ;
@@ -125,38 +95,46 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
125
95
let kernel = Kernel :: parse ( kernel_slice) ;
126
96
127
97
let system_info = SystemInfo {
128
- framebuffer_addr,
98
+ framebuffer_addr : PhysAddr :: new ( info . framebuffer . region . start ) ,
129
99
framebuffer_info,
130
100
rsdp_addr : detect_rsdp ( ) ,
131
101
} ;
132
102
133
103
load_and_switch_to_kernel ( kernel, frame_allocator, page_tables, system_info) ;
134
104
}
135
105
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
+ )
155
133
} ;
156
134
157
- bootloader_x86_64_common:: init_logger ( slice , info ) ;
135
+ bootloader_x86_64_common:: init_logger ( framebuffer , framebuffer_info ) ;
158
136
159
- info
137
+ framebuffer_info
160
138
}
161
139
162
140
/// Creates page table abstraction types for both the bootloader and kernel page tables.
@@ -230,13 +208,15 @@ fn detect_rsdp() -> Option<PhysAddr> {
230
208
}
231
209
232
210
#[ 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
+ } ;
238
218
log:: error!( "{}" , info) ;
239
219
loop {
240
- unsafe { asm ! ( "cli; hlt" ) } ;
220
+ unsafe { core :: arch :: asm!( "cli; hlt" ) } ;
241
221
}
242
222
}
0 commit comments