@@ -39,7 +39,7 @@ pub mod serial;
3939
4040const PAGE_SIZE : u64 = 4096 ;
4141
42- /// Initialize a text-based logger using the given pixel-based framebuffer as output.
42+ /// Initialize a text-based logger using the given pixel-based framebuffer as output.
4343pub fn init_logger (
4444 framebuffer : & ' static mut [ u8 ] ,
4545 info : FrameBufferInfo ,
@@ -195,10 +195,10 @@ where
195195 enable_write_protect_bit ( ) ;
196196
197197 let config = kernel. config ;
198- let kernel_slice_start = kernel. start_address as u64 ;
198+ let kernel_slice_start = PhysAddr :: new ( kernel. start_address as _ ) ;
199199 let kernel_slice_len = u64:: try_from ( kernel. len ) . unwrap ( ) ;
200200
201- let ( entry_point, tls_template) = load_kernel:: load_kernel (
201+ let ( kernel_image_offset , entry_point, tls_template) = load_kernel:: load_kernel (
202202 kernel,
203203 kernel_page_table,
204204 frame_allocator,
@@ -402,6 +402,8 @@ where
402402
403403 kernel_slice_start,
404404 kernel_slice_len,
405+ kernel_image_offset,
406+
405407 ramdisk_slice_start,
406408 ramdisk_slice_len,
407409 }
@@ -426,9 +428,11 @@ pub struct Mappings {
426428 pub tls_template : Option < TlsTemplate > ,
427429
428430 /// Start address of the kernel slice allocation in memory.
429- pub kernel_slice_start : u64 ,
431+ pub kernel_slice_start : PhysAddr ,
430432 /// Size of the kernel slice allocation in memory.
431433 pub kernel_slice_len : u64 ,
434+ /// Relocation offset of the kernel image in virtual memory.
435+ pub kernel_image_offset : VirtAddr ,
432436 pub ramdisk_slice_start : Option < VirtAddr > ,
433437 pub ramdisk_slice_len : u64 ,
434438}
@@ -543,6 +547,9 @@ where
543547 . map ( |addr| addr. as_u64 ( ) )
544548 . into ( ) ;
545549 info. ramdisk_len = mappings. ramdisk_slice_len ;
550+ info. kernel_addr = mappings. kernel_slice_start . as_u64 ( ) ;
551+ info. kernel_len = mappings. kernel_slice_len as _ ;
552+ info. kernel_image_offset = mappings. kernel_image_offset . as_u64 ( ) ;
546553 info. _test_sentinel = boot_config. _test_sentinel ;
547554 info
548555 } ) ;
@@ -587,15 +594,21 @@ pub struct PageTables {
587594 ///
588595 /// Must be the page table that the `kernel` field of this struct refers to.
589596 ///
590- /// This frame is loaded into the `CR3` register on the final context switch to the kernel.
597+ /// This frame is loaded into the `CR3` register on the final context switch to the kernel.
591598 pub kernel_level_4_frame : PhysFrame ,
592599}
593600
594601/// Performs the actual context switch.
595602unsafe fn context_switch ( addresses : Addresses ) -> ! {
596603 unsafe {
597604 asm ! (
598- "mov cr3, {}; mov rsp, {}; push 0; jmp {}" ,
605+ r#"
606+ xor rbp, rbp
607+ mov cr3, {}
608+ mov rsp, {}
609+ push 0
610+ jmp {}
611+ "# ,
599612 in( reg) addresses. page_table. start_address( ) . as_u64( ) ,
600613 in( reg) addresses. stack_top. as_u64( ) ,
601614 in( reg) addresses. entry_point. as_u64( ) ,
0 commit comments