11use crate :: frame_allocator:: FrameAllocator ;
22use bootloader:: bootinfo:: MemoryRegionType ;
3+ use bootloader:: bootinfo:: TlsTemplate ;
34use fixedvec:: FixedVec ;
45use x86_64:: structures:: paging:: mapper:: { MapToError , MapperFlush , UnmapError } ;
56use x86_64:: structures:: paging:: {
@@ -9,16 +10,40 @@ use x86_64::structures::paging::{
910use x86_64:: { align_up, PhysAddr , VirtAddr } ;
1011use xmas_elf:: program:: { self , ProgramHeader64 } ;
1112
13+ #[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
14+ pub struct MemoryInfo {
15+ pub stack_end : VirtAddr ,
16+ pub tls_segment : Option < TlsTemplate > ,
17+ }
18+
19+ #[ derive( Debug ) ]
20+ pub enum MapKernelError {
21+ Mapping ( MapToError ) ,
22+ MultipleTlsSegments ,
23+ }
24+
25+ impl From < MapToError > for MapKernelError {
26+ fn from ( e : MapToError ) -> Self {
27+ MapKernelError :: Mapping ( e)
28+ }
29+ }
30+
1231pub ( crate ) fn map_kernel (
1332 kernel_start : PhysAddr ,
1433 stack_start : Page ,
1534 stack_size : u64 ,
1635 segments : & FixedVec < ProgramHeader64 > ,
1736 page_table : & mut RecursivePageTable ,
1837 frame_allocator : & mut FrameAllocator ,
19- ) -> Result < VirtAddr , MapToError > {
38+ ) -> Result < MemoryInfo , MapKernelError > {
39+ let mut tls_segment = None ;
2040 for segment in segments {
21- map_segment ( segment, kernel_start, page_table, frame_allocator) ?;
41+ let tls = map_segment ( segment, kernel_start, page_table, frame_allocator) ?;
42+ if let Some ( tls) = tls {
43+ if tls_segment. replace ( tls) . is_some ( ) {
44+ return Err ( MapKernelError :: MultipleTlsSegments ) ;
45+ }
46+ }
2247 }
2348
2449 // Create a stack
@@ -35,15 +60,18 @@ pub(crate) fn map_kernel(
3560 unsafe { map_page ( page, frame, flags, page_table, frame_allocator) ? } . flush ( ) ;
3661 }
3762
38- Ok ( stack_end. start_address ( ) )
63+ Ok ( MemoryInfo {
64+ stack_end : stack_end. start_address ( ) ,
65+ tls_segment,
66+ } )
3967}
4068
4169pub ( crate ) fn map_segment (
4270 segment : & ProgramHeader64 ,
4371 kernel_start : PhysAddr ,
4472 page_table : & mut RecursivePageTable ,
4573 frame_allocator : & mut FrameAllocator ,
46- ) -> Result < ( ) , MapToError > {
74+ ) -> Result < Option < TlsTemplate > , MapToError > {
4775 let typ = segment. get_type ( ) . unwrap ( ) ;
4876 match typ {
4977 program:: Type :: Load => {
@@ -160,10 +188,16 @@ pub(crate) fn map_segment(
160188 unsafe { addr. as_mut_ptr :: < u8 > ( ) . write ( 0 ) } ;
161189 }
162190 }
191+
192+ Ok ( None )
163193 }
164- _ => { }
194+ program:: Type :: Tls => Ok ( Some ( TlsTemplate {
195+ start_addr : segment. virtual_addr ,
196+ mem_size : segment. mem_size ,
197+ file_size : segment. file_size ,
198+ } ) ) ,
199+ _ => Ok ( None ) ,
165200 }
166- Ok ( ( ) )
167201}
168202
169203pub ( crate ) unsafe fn map_page < ' a , S > (
0 commit comments