11#![ no_std]
22#![ no_main]
33
4- use crate :: memory_descriptor:: E820MemoryRegion ;
4+ use crate :: memory_descriptor:: MemoryRegion ;
55use crate :: screen:: Writer ;
66use bootloader_api:: info:: { FrameBufferInfo , PixelFormat } ;
7- use bootloader_x86_64_bios_common:: BiosInfo ;
7+ use bootloader_x86_64_bios_common:: { BiosInfo , E820MemoryRegion } ;
88use bootloader_x86_64_common:: {
99 legacy_memory_region:: LegacyFrameAllocator , load_and_switch_to_kernel, logger:: LOGGER , Kernel ,
1010 PageTables , SystemInfo ,
@@ -28,24 +28,26 @@ mod screen;
2828
2929#[ no_mangle]
3030#[ link_section = ".start" ]
31- pub extern "C" fn _start ( info : & BiosInfo ) -> ! {
31+ pub extern "C" fn _start ( info : & mut BiosInfo ) -> ! {
3232 screen:: init ( info. framebuffer ) ;
3333 writeln ! ( Writer , "4th Stage" ) . unwrap ( ) ;
3434 writeln ! ( Writer , "{info:x?}" ) . unwrap ( ) ;
3535
36- let e820_memory_map = {
37- assert ! ( info. memory_map. start != 0 , "memory map address must be set" ) ;
38- let ptr = usize_from ( info. memory_map . start ) as * const E820MemoryRegion ;
39- unsafe {
40- slice:: from_raw_parts (
41- ptr,
42- usize_from ( info. memory_map . len / size_of :: < E820MemoryRegion > ( ) as u64 ) ,
43- )
44- }
36+ let memory_map: & mut [ E820MemoryRegion ] = unsafe {
37+ core:: slice:: from_raw_parts_mut (
38+ info. memory_map_addr as * mut _ ,
39+ info. memory_map_len . try_into ( ) . unwrap ( ) ,
40+ )
4541 } ;
46- let max_phys_addr = e820_memory_map
42+
43+ memory_map. sort_unstable_by_key ( |e| e. start_addr ) ;
44+
45+ let max_phys_addr = memory_map
4746 . iter ( )
48- . map ( |r| r. start_addr + r. len )
47+ . map ( |r| {
48+ writeln ! ( Writer , "start: {:#x}, len: {:#x}" , r. start_addr, r. len) . unwrap ( ) ;
49+ r. start_addr + r. len
50+ } )
4951 . max ( )
5052 . expect ( "no physical memory regions found" ) ;
5153
@@ -57,21 +59,24 @@ pub extern "C" fn _start(info: &BiosInfo) -> ! {
5759 let mut frame_allocator = {
5860 let kernel_end = PhysFrame :: containing_address ( kernel_start + kernel_size - 1u64 ) ;
5961 let next_free = kernel_end + 1 ;
60- LegacyFrameAllocator :: new_starting_at ( next_free, e820_memory_map. iter ( ) . copied ( ) )
62+ LegacyFrameAllocator :: new_starting_at (
63+ next_free,
64+ memory_map. iter ( ) . copied ( ) . map ( MemoryRegion ) ,
65+ )
6166 } ;
6267
63- // We identity-map all memory, so the offset between physical and virtual addresses is 0
68+ // We identity-mapped all memory, so the offset between physical and virtual addresses is 0
6469 let phys_offset = VirtAddr :: new ( 0 ) ;
6570
6671 let mut bootloader_page_table = {
6772 let frame = x86_64:: registers:: control:: Cr3 :: read ( ) . 0 ;
6873 let table: * mut PageTable = ( phys_offset + frame. start_address ( ) . as_u64 ( ) ) . as_mut_ptr ( ) ;
6974 unsafe { OffsetPageTable :: new ( & mut * table, phys_offset) }
7075 } ;
71- // identity-map remaining physical memory (first gigabyte is already identity-mapped)
76+ // identity-map remaining physical memory (first 10 gigabytes are already identity-mapped)
7277 {
7378 let start_frame: PhysFrame < Size2MiB > =
74- PhysFrame :: containing_address ( PhysAddr :: new ( 4096 * 512 * 512 ) ) ;
79+ PhysFrame :: containing_address ( PhysAddr :: new ( 4096 * 512 * 512 * 10 ) ) ;
7580 let end_frame = PhysFrame :: containing_address ( PhysAddr :: new ( max_phys_addr - 1 ) ) ;
7681 for frame in PhysFrame :: range_inclusive ( start_frame, end_frame) {
7782 unsafe {
0 commit comments