@@ -14,12 +14,18 @@ pub mod serial;
1414mod start;
1515pub mod systemtime;
1616
17- use alloc:: alloc:: alloc;
18- use core:: alloc:: Layout ;
17+ use alloc:: alloc:: { Layout , alloc} ;
18+ #[ cfg( feature = "common-os" ) ]
19+ use core:: arch:: asm;
1920use core:: arch:: global_asm;
2021use core:: ptr;
22+ #[ cfg( feature = "common-os" ) ]
23+ use core:: slice;
2124use core:: sync:: atomic:: { AtomicPtr , AtomicU32 , Ordering } ;
2225
26+ #[ cfg( feature = "common-os" ) ]
27+ use memory_addresses:: { PhysAddr , VirtAddr } ;
28+
2329pub ( crate ) use self :: interrupts:: wakeup_core;
2430pub ( crate ) use self :: processor:: set_oneshot_timer;
2531#[ cfg( feature = "common-os" ) ]
@@ -209,10 +215,10 @@ where
209215
210216 use crate :: arch:: aarch64:: mm:: paging:: { self , PageTableEntryFlags } ;
211217 use crate :: fd:: { Fd , RawFd } ;
212- use crate :: mm:: { FrameAlloc , PageRangeAllocator } ;
213218 #[ cfg( feature = "fork" ) ]
214219 use crate :: mm:: frame_ref_inc;
215220 use crate :: mm:: vma:: * ;
221+ use crate :: mm:: { FrameAlloc , PageRangeAllocator } ;
216222
217223 // Each process has its own object map.
218224 let mut object_map = HashMap :: < RawFd , Arc < async_lock:: RwLock < Fd > > , RandomState > :: with_hasher (
@@ -238,7 +244,22 @@ where
238244 code_size / BasePageSize :: SIZE as usize ,
239245 flags,
240246 ) ;
241- core_scheduler ( ) . get_current_task ( ) . borrow_mut ( ) . vmas . write ( ) . insert ( VirtAddr :: from ( USER_START ) , VirtualMemoryArea :: new ( VirtAddr :: from ( USER_START ) , VirtAddr :: from ( USER_START + code_size) . align_up ( BasePageSize :: SIZE ) , VirtualMemoryAreaProt :: READ |VirtualMemoryAreaProt :: WRITE |VirtualMemoryAreaProt :: EXECUTE , MemoryType :: CODE ) ) ;
247+ core_scheduler ( )
248+ . get_current_task ( )
249+ . borrow_mut ( )
250+ . vmas
251+ . write ( )
252+ . insert (
253+ VirtAddr :: from ( USER_START ) ,
254+ VirtualMemoryArea :: new (
255+ VirtAddr :: from ( USER_START ) ,
256+ VirtAddr :: from ( USER_START + code_size) . align_up ( BasePageSize :: SIZE ) ,
257+ VirtualMemoryAreaProt :: READ
258+ | VirtualMemoryAreaProt :: WRITE
259+ | VirtualMemoryAreaProt :: EXECUTE ,
260+ MemoryType :: CODE ,
261+ ) ,
262+ ) ;
242263
243264 let loader_start_ptr = ptr:: with_exposed_provenance_mut ( USER_START . as_usize ( ) ) ;
244265 let code_slice = unsafe { slice:: from_raw_parts_mut ( loader_start_ptr, code_size) } ;
@@ -270,10 +291,24 @@ where
270291 tls_memsz / BasePageSize :: SIZE as usize ,
271292 flags,
272293 ) ;
273- core_scheduler ( ) . get_current_task ( ) . borrow_mut ( ) . vmas . write ( ) . insert ( tls_virt, VirtualMemoryArea :: new ( tls_virt, ( tls_virt + tls_memsz) . align_up ( BasePageSize :: SIZE ) , VirtualMemoryAreaProt :: READ |VirtualMemoryAreaProt :: WRITE , MemoryType :: TLS ) ) ;
274-
275- let block =
276- unsafe { slice:: from_raw_parts_mut ( tls_virt. as_mut_ptr ( ) , tls_offset + tls_size as usize ) } ;
294+ core_scheduler ( )
295+ . get_current_task ( )
296+ . borrow_mut ( )
297+ . vmas
298+ . write ( )
299+ . insert (
300+ tls_virt,
301+ VirtualMemoryArea :: new (
302+ tls_virt,
303+ ( tls_virt + tls_memsz) . align_up ( BasePageSize :: SIZE ) ,
304+ VirtualMemoryAreaProt :: READ | VirtualMemoryAreaProt :: WRITE ,
305+ MemoryType :: TLS ,
306+ ) ,
307+ ) ;
308+
309+ let block = unsafe {
310+ slice:: from_raw_parts_mut ( tls_virt. as_mut_ptr ( ) , tls_offset + tls_size as usize )
311+ } ;
277312 for elem in block. iter_mut ( ) {
278313 * elem = 0 ;
279314 }
@@ -289,11 +324,10 @@ where
289324 let tls_init = func ( code_slice, Some ( tls_image) ) ?;
290325
291326 if let Some ( init) = tls_init {
292- let template =
293- Arc :: new ( crate :: scheduler:: task:: TlsTemplate {
294- size : tls_size as usize ,
295- init,
296- } ) ;
327+ let template = Arc :: new ( crate :: scheduler:: task:: TlsTemplate {
328+ size : tls_size as usize ,
329+ init,
330+ } ) ;
297331 core_scheduler ( )
298332 . get_current_task ( )
299333 . borrow_mut ( )
@@ -364,10 +398,10 @@ pub unsafe fn jump_to_user_land(entry_point: usize, arg: alloc::vec::Vec<&str>)
364398
365399 use crate :: arch:: aarch64:: kernel:: scheduler:: TaskStacks ;
366400 use crate :: arch:: aarch64:: mm:: paging:: { self , PageTableEntryFlags } ;
367- use crate :: mm:: { FrameAlloc , PageRangeAllocator } ;
368401 #[ cfg( feature = "fork" ) ]
369402 use crate :: mm:: frame_ref_inc;
370403 use crate :: mm:: vma:: * ;
404+ use crate :: mm:: { FrameAlloc , PageRangeAllocator } ;
371405
372406 debug ! ( "Create new file descriptor table" ) ;
373407 core_scheduler ( ) . recreate_objmap ( ) . unwrap ( ) ;
@@ -386,7 +420,20 @@ pub unsafe fn jump_to_user_land(entry_point: usize, arg: alloc::vec::Vec<&str>)
386420 USER_STACK_SIZE / BasePageSize :: SIZE as usize ,
387421 flags,
388422 ) ;
389- core_scheduler ( ) . get_current_task ( ) . borrow_mut ( ) . vmas . write ( ) . insert ( USER_STACK , VirtualMemoryArea :: new ( USER_STACK , USER_STACK +USER_STACK_SIZE , VirtualMemoryAreaProt :: READ |VirtualMemoryAreaProt :: WRITE , MemoryType :: STACK ) ) ;
423+ core_scheduler ( )
424+ . get_current_task ( )
425+ . borrow_mut ( )
426+ . vmas
427+ . write ( )
428+ . insert (
429+ USER_STACK ,
430+ VirtualMemoryArea :: new (
431+ USER_STACK ,
432+ USER_STACK + USER_STACK_SIZE ,
433+ VirtualMemoryAreaProt :: READ | VirtualMemoryAreaProt :: WRITE ,
434+ MemoryType :: STACK ,
435+ ) ,
436+ ) ;
390437 #[ cfg( feature = "fork" ) ]
391438 for i in 0 ..USER_STACK_SIZE / BasePageSize :: SIZE as usize {
392439 frame_ref_inc ( phys_addr + i * BasePageSize :: SIZE as usize ) ;
0 commit comments