2020
2121use core:: alloc:: Layout ;
2222use core:: mem:: { self , MaybeUninit } ;
23- use core:: { ptr, slice} ;
24-
25- use hermit_entry:: boot_info:: TlsInfo ;
23+ use core:: ptr;
2624
2725use self :: allocation:: Allocation ;
26+ use crate :: env:: TlsInfo ;
2827
2928/// Thread-local storage data structures.
3029pub struct Tls {
@@ -51,22 +50,8 @@ struct Tcb {
5150}
5251
5352impl Tls {
54- unsafe fn new ( tls_info : TlsInfo ) -> Self {
55- let start = usize:: try_from ( tls_info. start ) . unwrap ( ) ;
56- let filesz = usize:: try_from ( tls_info. filesz ) . unwrap ( ) ;
57- let memsz = usize:: try_from ( tls_info. memsz ) . unwrap ( ) ;
58- let align = usize:: try_from ( tls_info. align ) . unwrap ( ) ;
59-
60- // Get TLS initialization image
61- let tls_init_image = {
62- let start = ptr:: with_exposed_provenance ( start) ;
63- unsafe { slice:: from_raw_parts ( start, filesz) }
64- } ;
65-
53+ unsafe fn new ( tls_info : TlsInfo < ' _ > ) -> Self {
6654 let tcb_layout = Layout :: new :: < Tcb > ( ) . pad_to_align ( ) ;
67- let data_layout = Layout :: from_size_align ( memsz, align)
68- . unwrap ( )
69- . pad_to_align ( ) ;
7055
7156 let ( layout, tls_offset, tcb_offset) =
7257 if cfg ! ( any( target_arch = "aarch64" , target_arch = "riscv64" ) ) {
@@ -79,7 +64,7 @@ impl Tls {
7964 assert_eq ! ( mem:: offset_of!( Tcb , dtv) , 0 ) ;
8065
8166 // In variant I, the TLS data comes after the TCB.
82- let ( tls_layout, data_offset) = tcb_layout. extend ( data_layout ) . unwrap ( ) ;
67+ let ( tls_layout, data_offset) = tcb_layout. extend ( tls_info . layout ) . unwrap ( ) ;
8368 ( tls_layout. pad_to_align ( ) , data_offset, 0 )
8469 } else if cfg ! ( target_arch = "x86_64" ) {
8570 // x86-64 uses TLS data structures variant II.
@@ -92,7 +77,7 @@ impl Tls {
9277 assert_eq ! ( mem:: offset_of!( Tcb , thread_ptr) , 0 ) ;
9378
9479 // In Variant II, the TCB comes after the TLS data.
95- let ( tls_layout, tcb_offset) = data_layout . extend ( tcb_layout) . unwrap ( ) ;
80+ let ( tls_layout, tcb_offset) = tls_info . layout . extend ( tcb_layout) . unwrap ( ) ;
9681 ( tls_layout. pad_to_align ( ) , 0 , tcb_offset)
9782 } else {
9883 unimplemented ! ( )
@@ -101,10 +86,12 @@ impl Tls {
10186 let mut block = Allocation :: new ( layout) . unwrap ( ) ;
10287
10388 // Initialize the beginning of the TLS block with the TLS initialization image.
104- block. as_mut_slice ( ) [ tls_offset..] [ ..tls_init_image. len ( ) ] . copy_from_slice ( tls_init_image) ;
89+ let image =
90+ unsafe { & * ( ptr:: from_ref ( tls_info. image ) as * const [ core:: mem:: MaybeUninit < u8 > ] ) } ;
91+ block. as_mut_slice ( ) [ tls_offset..] [ ..tls_info. image . len ( ) ] . copy_from_slice ( image) ;
10592
10693 // Fill the rest of the TLS block with zeros.
107- block. as_mut_slice ( ) [ tls_offset..] [ tls_init_image . len ( ) ..data_layout . size ( ) ]
94+ block. as_mut_slice ( ) [ tls_offset..] [ tls_info . image . len ( ) ..tls_info . layout . size ( ) ]
10895 . fill ( MaybeUninit :: new ( 0 ) ) ;
10996
11097 let thread_ptr = if cfg ! ( target_arch = "riscv64" ) {
@@ -138,7 +125,7 @@ impl Tls {
138125 }
139126
140127 pub fn from_env ( ) -> Option < Self > {
141- let tls_info = crate :: env :: tls_info ( ) ?;
128+ let tls_info = TlsInfo :: from_env ( ) ?;
142129 let this = unsafe { Self :: new ( tls_info) } ;
143130 Some ( this)
144131 }
0 commit comments