@@ -81,7 +81,7 @@ pub fn output_message_byte(byte: u8) {
81
81
}
82
82
83
83
pub unsafe fn get_memory ( _memory_size : u64 ) -> u64 {
84
- ( ptr:: addr_of!( kernel_end) . addr ( ) as u64 ) . align_up ( LargePageSize :: SIZE as u64 )
84
+ ( unsafe { ptr:: addr_of!( kernel_end) } . addr ( ) as u64 ) . align_up ( LargePageSize :: SIZE as u64 )
85
85
}
86
86
87
87
pub fn find_kernel ( ) -> & ' static [ u8 ] {
@@ -159,21 +159,21 @@ pub unsafe fn boot_kernel(kernel_info: LoadedKernel) -> ! {
159
159
for i in pgt_slice. iter_mut ( ) {
160
160
* i = 0 ;
161
161
}
162
- pgt_slice[ 0 ] = ptr:: addr_of!( l1_pgtable) . addr ( ) as u64 + PT_PT ;
163
- pgt_slice[ 511 ] = ptr:: addr_of!( l0_pgtable) . addr ( ) as u64 + PT_PT + PT_SELF ;
162
+ pgt_slice[ 0 ] = unsafe { ptr:: addr_of!( l1_pgtable) } . addr ( ) as u64 + PT_PT ;
163
+ pgt_slice[ 511 ] = unsafe { ptr:: addr_of!( l0_pgtable) } . addr ( ) as u64 + PT_PT + PT_SELF ;
164
164
165
165
let pgt_slice = unsafe { core:: slice:: from_raw_parts_mut ( ptr:: addr_of_mut!( l1_pgtable) , 512 ) } ;
166
166
for i in pgt_slice. iter_mut ( ) {
167
167
* i = 0 ;
168
168
}
169
- pgt_slice[ 0 ] = ptr:: addr_of!( l2_pgtable) . addr ( ) as u64 + PT_PT ;
170
- pgt_slice[ 1 ] = ptr:: addr_of!( l2k_pgtable) . addr ( ) as u64 + PT_PT ;
169
+ pgt_slice[ 0 ] = unsafe { ptr:: addr_of!( l2_pgtable) } . addr ( ) as u64 + PT_PT ;
170
+ pgt_slice[ 1 ] = unsafe { ptr:: addr_of!( l2k_pgtable) } . addr ( ) as u64 + PT_PT ;
171
171
172
172
let pgt_slice = unsafe { core:: slice:: from_raw_parts_mut ( ptr:: addr_of_mut!( l2_pgtable) , 512 ) } ;
173
173
for i in pgt_slice. iter_mut ( ) {
174
174
* i = 0 ;
175
175
}
176
- pgt_slice[ 0 ] = ptr:: addr_of!( l3_pgtable) . addr ( ) as u64 + PT_PT ;
176
+ pgt_slice[ 0 ] = unsafe { ptr:: addr_of!( l3_pgtable) } . addr ( ) as u64 + PT_PT ;
177
177
178
178
let pgt_slice = unsafe { core:: slice:: from_raw_parts_mut ( ptr:: addr_of_mut!( l3_pgtable) , 512 ) } ;
179
179
for i in pgt_slice. iter_mut ( ) {
@@ -187,8 +187,9 @@ pub unsafe fn boot_kernel(kernel_info: LoadedKernel) -> ! {
187
187
* i = 0 ;
188
188
}
189
189
for ( i, pgt_slice) in pgt_slice. iter_mut ( ) . enumerate ( ) . take ( 10 ) {
190
- * pgt_slice =
191
- ptr:: addr_of!( L0mib_pgtable ) . addr ( ) as u64 + ( i * BasePageSize :: SIZE ) as u64 + PT_PT ;
190
+ * pgt_slice = unsafe { ptr:: addr_of!( L0mib_pgtable ) } . addr ( ) as u64
191
+ + ( i * BasePageSize :: SIZE ) as u64
192
+ + PT_PT ;
192
193
}
193
194
194
195
let pgt_slice =
@@ -227,7 +228,12 @@ pub unsafe fn boot_kernel(kernel_info: LoadedKernel) -> ! {
227
228
}
228
229
229
230
let current_stack_address = load_info. kernel_image_addr_range . start - KERNEL_STACK_SIZE as u64 ;
230
- pub static mut BOOT_INFO : Option < RawBootInfo > = None ;
231
+
232
+ take_static:: take_static! {
233
+ static RAW_BOOT_INFO : Option <RawBootInfo > = None ;
234
+ }
235
+
236
+ let raw_boot_info = RAW_BOOT_INFO . take ( ) . unwrap ( ) ;
231
237
232
238
let dtb = unsafe {
233
239
Dtb :: from_raw ( sptr:: from_exposed_addr ( DEVICE_TREE as usize ) )
@@ -246,22 +252,19 @@ pub unsafe fn boot_kernel(kernel_info: LoadedKernel) -> ! {
246
252
let ram_start = u64:: from_be_bytes ( start_slice. try_into ( ) . unwrap ( ) ) ;
247
253
let ram_size = u64:: from_be_bytes ( size_slice. try_into ( ) . unwrap ( ) ) ;
248
254
249
- let boot_info = {
250
- let boot_info = BootInfo {
251
- hardware_info : HardwareInfo {
252
- phys_addr_range : ram_start..ram_start + ram_size,
253
- serial_port_base : SerialPortBase :: new ( 0x1000 ) ,
254
- device_tree : core:: num:: NonZeroU64 :: new ( DEVICE_TREE ) ,
255
- } ,
256
- load_info,
257
- platform_info : PlatformInfo :: LinuxBoot ,
258
- } ;
259
- RawBootInfo :: from ( boot_info)
255
+ let boot_info = BootInfo {
256
+ hardware_info : HardwareInfo {
257
+ phys_addr_range : ram_start..ram_start + ram_size,
258
+ serial_port_base : SerialPortBase :: new ( 0x1000 ) ,
259
+ device_tree : core:: num:: NonZeroU64 :: new ( DEVICE_TREE ) ,
260
+ } ,
261
+ load_info,
262
+ platform_info : PlatformInfo :: LinuxBoot ,
260
263
} ;
261
264
262
- unsafe {
263
- BOOT_INFO = Some ( boot_info) ;
264
- }
265
+ info ! ( "boot_info = {boot_info:#?}" ) ;
266
+ let boot_info_ptr = raw_boot_info . insert ( RawBootInfo :: from ( boot_info) ) ;
267
+ info ! ( "boot_info at {boot_info_ptr:p}" ) ;
265
268
266
269
// Jump to the kernel entry point and provide the Multiboot information to it.
267
270
info ! (
@@ -291,7 +294,7 @@ pub unsafe fn boot_kernel(kernel_info: LoadedKernel) -> ! {
291
294
"br {entry}" ,
292
295
stack_address = in( reg) current_stack_address,
293
296
entry = in( reg) entry_point,
294
- in( "x0" ) BOOT_INFO . as_ref ( ) . unwrap ( ) ,
297
+ in( "x0" ) boot_info_ptr ,
295
298
in( "x1" ) 0 ,
296
299
options( noreturn)
297
300
)
0 commit comments