8
8
#![ feature( pointer_methods) ]
9
9
#![ feature( const_fn) ]
10
10
#![ feature( nll) ]
11
-
12
11
#![ no_std]
13
12
#![ no_main]
14
13
15
- extern crate xmas_elf;
16
- extern crate x86_64;
17
- extern crate usize_conversions;
18
14
extern crate os_bootinfo;
19
15
extern crate spin;
16
+ extern crate usize_conversions;
17
+ extern crate x86_64;
18
+ extern crate xmas_elf;
20
19
#[ macro_use]
21
20
extern crate fixedvec;
22
21
22
+ use core:: slice;
23
+ use os_bootinfo:: BootInfo ;
24
+ use usize_conversions:: usize_from;
23
25
pub use x86_64:: PhysAddr ;
24
26
use 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 ;
28
27
use 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 ;
32
31
33
32
global_asm ! ( include_str!( "boot.s" ) ) ;
34
33
global_asm ! ( include_str!( "second_stage.s" ) ) ;
@@ -40,8 +39,8 @@ extern "C" {
40
39
}
41
40
42
41
mod boot_info;
43
- mod page_table;
44
42
mod frame_allocator;
43
+ mod page_table;
45
44
mod printer;
46
45
47
46
pub struct IdentityMappedAddr ( PhysAddr ) ;
@@ -61,15 +60,19 @@ impl IdentityMappedAddr {
61
60
}
62
61
63
62
#[ 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
+ ) -> ! {
70
73
use fixedvec:: FixedVec ;
71
- use xmas_elf:: program:: { ProgramHeader , ProgramHeader64 } ;
72
74
use os_bootinfo:: { MemoryRegion , MemoryRegionType } ;
75
+ use xmas_elf:: program:: { ProgramHeader , ProgramHeader64 } ;
73
76
74
77
let mut memory_map = boot_info:: create_from ( memory_map_addr, memory_map_entry_count) ;
75
78
@@ -87,9 +90,9 @@ pub extern "C" fn load_elf(kernel_start: IdentityMappedAddr, kernel_size: u64,
87
90
88
91
for program_header in elf_file. program_iter ( ) {
89
92
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" ) ,
93
96
ProgramHeader :: Ph32 ( _) => panic ! ( "does not support 32 bit elf files" ) ,
94
97
}
95
98
}
@@ -100,14 +103,20 @@ pub extern "C" fn load_elf(kernel_start: IdentityMappedAddr, kernel_size: u64,
100
103
101
104
// Create a RecursivePageTable
102
105
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
+ ) ;
105
112
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" ) ;
108
115
109
116
// 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
+ } ;
111
120
112
121
// Mark already used memory areas in frame allocator.
113
122
{
@@ -117,15 +126,18 @@ pub extern "C" fn load_elf(kernel_start: IdentityMappedAddr, kernel_size: u64,
117
126
region_type : MemoryRegionType :: Kernel ,
118
127
} ) ;
119
128
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,
121
131
region_type : MemoryRegionType :: PageTable ,
122
132
} ) ;
123
133
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,
125
136
region_type : MemoryRegionType :: Bootloader ,
126
137
} ) ;
127
138
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 ) ,
129
141
region_type : MemoryRegionType :: FrameZero ,
130
142
} ) ;
131
143
}
@@ -134,25 +146,37 @@ pub extern "C" fn load_elf(kernel_start: IdentityMappedAddr, kernel_size: u64,
134
146
let kernel_start_page = Page :: containing_address ( kernel_start. virt ( ) ) ;
135
147
let kernel_end_page = Page :: containing_address ( kernel_start. virt ( ) + kernel_size - 1u64 ) ;
136
148
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" ) ;
140
154
}
141
155
// Flush the translation lookaside buffer since we changed the active mapping.
142
156
tlb:: flush_all ( ) ;
143
157
144
158
// 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" ) ;
147
165
148
166
// Map a page for the boot info structure
149
167
let boot_info_page = {
150
168
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 )
152
171
. expect ( "frame allocation failed" ) ;
153
172
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" ) ;
156
180
page
157
181
} ;
158
182
@@ -162,7 +186,7 @@ pub extern "C" fn load_elf(kernel_start: IdentityMappedAddr, kernel_size: u64,
162
186
163
187
// Write boot info to boot info page.
164
188
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) } ;
166
190
167
191
// Make sure that the kernel respects the write-protection bits, even when in ring 0.
168
192
enable_write_protect_bit ( ) ;
@@ -175,7 +199,7 @@ pub extern "C" fn load_elf(kernel_start: IdentityMappedAddr, kernel_size: u64,
175
199
176
200
fn enable_nxe_bit ( ) {
177
201
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 ) }
179
203
}
180
204
181
205
fn enable_write_protect_bit ( ) {
@@ -185,10 +209,12 @@ fn enable_write_protect_bit() {
185
209
186
210
#[ lang = "panic_fmt" ]
187
211
#[ 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
+ ) -> ! {
192
218
use core:: fmt:: Write ;
193
219
write ! ( printer:: PRINTER . lock( ) , "PANIC: {}" , msg) . unwrap ( ) ;
194
220
@@ -197,7 +223,11 @@ pub extern fn rust_begin_panic(msg: core::fmt::Arguments,
197
223
198
224
#[ lang = "eh_personality" ]
199
225
#[ no_mangle]
200
- pub extern fn eh_personality ( ) { loop { } }
226
+ pub extern "C" fn eh_personality ( ) {
227
+ loop { }
228
+ }
201
229
202
230
#[ no_mangle]
203
- pub extern fn _Unwind_Resume ( ) { loop { } }
231
+ pub extern "C" fn _Unwind_Resume ( ) {
232
+ loop { }
233
+ }
0 commit comments