88#![ feature( pointer_methods) ]
99#![ feature( const_fn) ]
1010#![ feature( nll) ]
11-
1211#![ no_std]
1312#![ no_main]
1413
15- extern crate xmas_elf;
16- extern crate x86_64;
17- extern crate usize_conversions;
1814extern crate os_bootinfo;
1915extern crate spin;
16+ extern crate usize_conversions;
17+ extern crate x86_64;
18+ extern crate xmas_elf;
2019#[ macro_use]
2120extern crate fixedvec;
2221
22+ use core:: slice;
23+ use os_bootinfo:: BootInfo ;
24+ use usize_conversions:: usize_from;
2325pub use x86_64:: PhysAddr ;
2426use x86_64:: VirtAddr ;
25- use x86_64:: ux:: u9;
26- use x86_64:: structures:: paging:: { PAGE_SIZE , PageTableFlags , Page } ;
27- use x86_64:: structures:: paging:: RecursivePageTable ;
2827use x86_64:: instructions:: tlb;
29- use core :: slice ;
30- use usize_conversions :: usize_from ;
31- use os_bootinfo :: BootInfo ;
28+ use x86_64 :: structures :: paging :: RecursivePageTable ;
29+ use x86_64 :: structures :: paging :: { Page , PageTableFlags , PAGE_SIZE } ;
30+ use x86_64 :: ux :: u9 ;
3231
3332global_asm ! ( include_str!( "boot.s" ) ) ;
3433global_asm ! ( include_str!( "second_stage.s" ) ) ;
@@ -40,8 +39,8 @@ extern "C" {
4039}
4140
4241mod boot_info;
43- mod page_table;
4442mod frame_allocator;
43+ mod page_table;
4544mod printer;
4645
4746pub struct IdentityMappedAddr ( PhysAddr ) ;
@@ -61,15 +60,19 @@ impl IdentityMappedAddr {
6160}
6261
6362#[ no_mangle]
64- pub extern "C" fn load_elf ( kernel_start : IdentityMappedAddr , kernel_size : u64 ,
65- memory_map_addr : VirtAddr , memory_map_entry_count : u64 ,
66- page_table_start : PhysAddr , page_table_end : PhysAddr ,
67- bootloader_start : PhysAddr , bootloader_end : PhysAddr ,
68- ) -> !
69- {
63+ pub extern "C" fn load_elf (
64+ kernel_start : IdentityMappedAddr ,
65+ kernel_size : u64 ,
66+ memory_map_addr : VirtAddr ,
67+ memory_map_entry_count : u64 ,
68+ page_table_start : PhysAddr ,
69+ page_table_end : PhysAddr ,
70+ bootloader_start : PhysAddr ,
71+ bootloader_end : PhysAddr ,
72+ ) -> ! {
7073 use fixedvec:: FixedVec ;
71- use xmas_elf:: program:: { ProgramHeader , ProgramHeader64 } ;
7274 use os_bootinfo:: { MemoryRegion , MemoryRegionType } ;
75+ use xmas_elf:: program:: { ProgramHeader , ProgramHeader64 } ;
7376
7477 let mut memory_map = boot_info:: create_from ( memory_map_addr, memory_map_entry_count) ;
7578
@@ -87,9 +90,9 @@ pub extern "C" fn load_elf(kernel_start: IdentityMappedAddr, kernel_size: u64,
8790
8891 for program_header in elf_file. program_iter ( ) {
8992 match program_header {
90- ProgramHeader :: Ph64 ( header) => {
91- segments . push ( * header) . expect ( "does not support more than 32 program segments" )
92- } ,
93+ ProgramHeader :: Ph64 ( header) => segments
94+ . push ( * header)
95+ . expect ( "does not support more than 32 program segments" ) ,
9396 ProgramHeader :: Ph32 ( _) => panic ! ( "does not support 32 bit elf files" ) ,
9497 }
9598 }
@@ -100,14 +103,20 @@ pub extern "C" fn load_elf(kernel_start: IdentityMappedAddr, kernel_size: u64,
100103
101104 // Create a RecursivePageTable
102105 let recursive_index = u9:: new ( 511 ) ;
103- let recursive_page_table_addr = Page :: from_page_table_indices ( recursive_index,
104- recursive_index, recursive_index, recursive_index) ;
106+ let recursive_page_table_addr = Page :: from_page_table_indices (
107+ recursive_index,
108+ recursive_index,
109+ recursive_index,
110+ recursive_index,
111+ ) ;
105112 let page_table = unsafe { & mut * ( recursive_page_table_addr. start_address ( ) . as_mut_ptr ( ) ) } ;
106- let mut rec_page_table = RecursivePageTable :: new ( page_table )
107- . expect ( "recursive page table creation failed" ) ;
113+ let mut rec_page_table =
114+ RecursivePageTable :: new ( page_table ) . expect ( "recursive page table creation failed" ) ;
108115
109116 // Create a frame allocator, which marks allocated frames as used in the memory map.
110- let mut frame_allocator = frame_allocator:: FrameAllocator { memory_map : & mut memory_map } ;
117+ let mut frame_allocator = frame_allocator:: FrameAllocator {
118+ memory_map : & mut memory_map,
119+ } ;
111120
112121 // Mark already used memory areas in frame allocator.
113122 {
@@ -117,15 +126,18 @@ pub extern "C" fn load_elf(kernel_start: IdentityMappedAddr, kernel_size: u64,
117126 region_type : MemoryRegionType :: Kernel ,
118127 } ) ;
119128 frame_allocator. add_region ( MemoryRegion {
120- start_addr : page_table_start, len : page_table_end - page_table_start,
129+ start_addr : page_table_start,
130+ len : page_table_end - page_table_start,
121131 region_type : MemoryRegionType :: PageTable ,
122132 } ) ;
123133 frame_allocator. add_region ( MemoryRegion {
124- start_addr : bootloader_start, len : bootloader_end - bootloader_start,
134+ start_addr : bootloader_start,
135+ len : bootloader_end - bootloader_start,
125136 region_type : MemoryRegionType :: Bootloader ,
126137 } ) ;
127138 frame_allocator. add_region ( MemoryRegion {
128- start_addr : PhysAddr :: new ( 0 ) , len : u64:: from ( PAGE_SIZE ) ,
139+ start_addr : PhysAddr :: new ( 0 ) ,
140+ len : u64:: from ( PAGE_SIZE ) ,
129141 region_type : MemoryRegionType :: FrameZero ,
130142 } ) ;
131143 }
@@ -134,25 +146,37 @@ pub extern "C" fn load_elf(kernel_start: IdentityMappedAddr, kernel_size: u64,
134146 let kernel_start_page = Page :: containing_address ( kernel_start. virt ( ) ) ;
135147 let kernel_end_page = Page :: containing_address ( kernel_start. virt ( ) + kernel_size - 1u64 ) ;
136148 for page in Page :: range_inclusive ( kernel_start_page, kernel_end_page) . step_by ( 512 ) {
137- rec_page_table. unmap ( page, & mut |frame| {
138- frame_allocator. deallocate_frame ( frame) ;
139- } ) . expect ( "dealloc error" ) ;
149+ rec_page_table
150+ . unmap ( page, & mut |frame| {
151+ frame_allocator. deallocate_frame ( frame) ;
152+ } )
153+ . expect ( "dealloc error" ) ;
140154 }
141155 // Flush the translation lookaside buffer since we changed the active mapping.
142156 tlb:: flush_all ( ) ;
143157
144158 // Map kernel segments.
145- let stack_end = page_table:: map_kernel ( kernel_start. phys ( ) , & segments, & mut rec_page_table,
146- & mut frame_allocator) . expect ( "kernel mapping failed" ) ;
159+ let stack_end = page_table:: map_kernel (
160+ kernel_start. phys ( ) ,
161+ & segments,
162+ & mut rec_page_table,
163+ & mut frame_allocator,
164+ ) . expect ( "kernel mapping failed" ) ;
147165
148166 // Map a page for the boot info structure
149167 let boot_info_page = {
150168 let page = Page :: containing_address ( VirtAddr :: new ( 0xb0071f0000 ) ) ;
151- let frame = frame_allocator. allocate_frame ( MemoryRegionType :: Bootloader )
169+ let frame = frame_allocator
170+ . allocate_frame ( MemoryRegionType :: Bootloader )
152171 . expect ( "frame allocation failed" ) ;
153172 let flags = PageTableFlags :: PRESENT | PageTableFlags :: WRITABLE ;
154- page_table:: map_page ( page, frame, flags,
155- & mut rec_page_table, & mut frame_allocator) . expect ( "Mapping of bootinfo page failed" ) ;
173+ page_table:: map_page (
174+ page,
175+ frame,
176+ flags,
177+ & mut rec_page_table,
178+ & mut frame_allocator,
179+ ) . expect ( "Mapping of bootinfo page failed" ) ;
156180 page
157181 } ;
158182
@@ -162,7 +186,7 @@ pub extern "C" fn load_elf(kernel_start: IdentityMappedAddr, kernel_size: u64,
162186
163187 // Write boot info to boot info page.
164188 let boot_info_addr = boot_info_page. start_address ( ) ;
165- unsafe { boot_info_addr. as_mut_ptr :: < BootInfo > ( ) . write ( boot_info) } ;
189+ unsafe { boot_info_addr. as_mut_ptr :: < BootInfo > ( ) . write ( boot_info) } ;
166190
167191 // Make sure that the kernel respects the write-protection bits, even when in ring 0.
168192 enable_write_protect_bit ( ) ;
@@ -175,7 +199,7 @@ pub extern "C" fn load_elf(kernel_start: IdentityMappedAddr, kernel_size: u64,
175199
176200fn enable_nxe_bit ( ) {
177201 use x86_64:: registers:: control:: { Efer , EferFlags } ;
178- unsafe { Efer :: update ( |efer| * efer |= EferFlags :: NO_EXECUTE_ENABLE ) }
202+ unsafe { Efer :: update ( |efer| * efer |= EferFlags :: NO_EXECUTE_ENABLE ) }
179203}
180204
181205fn enable_write_protect_bit ( ) {
@@ -185,10 +209,12 @@ fn enable_write_protect_bit() {
185209
186210#[ lang = "panic_fmt" ]
187211#[ no_mangle]
188- pub extern fn rust_begin_panic ( msg : core:: fmt:: Arguments ,
189- _file : & ' static str ,
190- _line : u32 ,
191- _column : u32 ) -> ! {
212+ pub extern "C" fn rust_begin_panic (
213+ msg : core:: fmt:: Arguments ,
214+ _file : & ' static str ,
215+ _line : u32 ,
216+ _column : u32 ,
217+ ) -> ! {
192218 use core:: fmt:: Write ;
193219 write ! ( printer:: PRINTER . lock( ) , "PANIC: {}" , msg) . unwrap ( ) ;
194220
@@ -197,7 +223,11 @@ pub extern fn rust_begin_panic(msg: core::fmt::Arguments,
197223
198224#[ lang = "eh_personality" ]
199225#[ no_mangle]
200- pub extern fn eh_personality ( ) { loop { } }
226+ pub extern "C" fn eh_personality ( ) {
227+ loop { }
228+ }
201229
202230#[ no_mangle]
203- pub extern fn _Unwind_Resume ( ) { loop { } }
231+ pub extern "C" fn _Unwind_Resume ( ) {
232+ loop { }
233+ }
0 commit comments