Merge pull request #2687 from lioncash/tls-process
kernel/process: Allocate the process' TLS region during initialization
This commit is contained in:
		
						commit
						5d369112d9
					
				| @ -184,19 +184,11 @@ ResultCode Process::LoadFromMetadata(const FileSys::ProgramMetadata& metadata) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Process::Run(s32 main_thread_priority, u64 stack_size) { | void Process::Run(s32 main_thread_priority, u64 stack_size) { | ||||||
|     // The kernel always ensures that the given stack size is page aligned.
 |     AllocateMainThreadStack(stack_size); | ||||||
|     main_thread_stack_size = Common::AlignUp(stack_size, Memory::PAGE_SIZE); |     tls_region_address = CreateTLSRegion(); | ||||||
| 
 |  | ||||||
|     // Allocate and map the main thread stack
 |  | ||||||
|     // TODO(bunnei): This is heap area that should be allocated by the kernel and not mapped as part
 |  | ||||||
|     // of the user address space.
 |  | ||||||
|     const VAddr mapping_address = vm_manager.GetTLSIORegionEndAddress() - main_thread_stack_size; |  | ||||||
|     vm_manager |  | ||||||
|         .MapMemoryBlock(mapping_address, std::make_shared<std::vector<u8>>(main_thread_stack_size), |  | ||||||
|                         0, main_thread_stack_size, MemoryState::Stack) |  | ||||||
|         .Unwrap(); |  | ||||||
| 
 | 
 | ||||||
|     vm_manager.LogLayout(); |     vm_manager.LogLayout(); | ||||||
|  | 
 | ||||||
|     ChangeStatus(ProcessStatus::Running); |     ChangeStatus(ProcessStatus::Running); | ||||||
| 
 | 
 | ||||||
|     SetupMainThread(*this, kernel, main_thread_priority); |     SetupMainThread(*this, kernel, main_thread_priority); | ||||||
| @ -226,6 +218,9 @@ void Process::PrepareForTermination() { | |||||||
|     stop_threads(system.Scheduler(2).GetThreadList()); |     stop_threads(system.Scheduler(2).GetThreadList()); | ||||||
|     stop_threads(system.Scheduler(3).GetThreadList()); |     stop_threads(system.Scheduler(3).GetThreadList()); | ||||||
| 
 | 
 | ||||||
|  |     FreeTLSRegion(tls_region_address); | ||||||
|  |     tls_region_address = 0; | ||||||
|  | 
 | ||||||
|     ChangeStatus(ProcessStatus::Exited); |     ChangeStatus(ProcessStatus::Exited); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -325,4 +320,16 @@ void Process::ChangeStatus(ProcessStatus new_status) { | |||||||
|     WakeupAllWaitingThreads(); |     WakeupAllWaitingThreads(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Process::AllocateMainThreadStack(u64 stack_size) { | ||||||
|  |     // The kernel always ensures that the given stack size is page aligned.
 | ||||||
|  |     main_thread_stack_size = Common::AlignUp(stack_size, Memory::PAGE_SIZE); | ||||||
|  | 
 | ||||||
|  |     // Allocate and map the main thread stack
 | ||||||
|  |     const VAddr mapping_address = vm_manager.GetTLSIORegionEndAddress() - main_thread_stack_size; | ||||||
|  |     vm_manager | ||||||
|  |         .MapMemoryBlock(mapping_address, std::make_shared<std::vector<u8>>(main_thread_stack_size), | ||||||
|  |                         0, main_thread_stack_size, MemoryState::Stack) | ||||||
|  |         .Unwrap(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace Kernel
 | } // namespace Kernel
 | ||||||
|  | |||||||
| @ -135,6 +135,11 @@ public: | |||||||
|         return mutex; |         return mutex; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /// Gets the address to the process' dedicated TLS region.
 | ||||||
|  |     VAddr GetTLSRegionAddress() const { | ||||||
|  |         return tls_region_address; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /// Gets the current status of the process
 |     /// Gets the current status of the process
 | ||||||
|     ProcessStatus GetStatus() const { |     ProcessStatus GetStatus() const { | ||||||
|         return status; |         return status; | ||||||
| @ -296,6 +301,9 @@ private: | |||||||
|     /// a process signal.
 |     /// a process signal.
 | ||||||
|     void ChangeStatus(ProcessStatus new_status); |     void ChangeStatus(ProcessStatus new_status); | ||||||
| 
 | 
 | ||||||
|  |     /// Allocates the main thread stack for the process, given the stack size in bytes.
 | ||||||
|  |     void AllocateMainThreadStack(u64 stack_size); | ||||||
|  | 
 | ||||||
|     /// Memory manager for this process.
 |     /// Memory manager for this process.
 | ||||||
|     Kernel::VMManager vm_manager; |     Kernel::VMManager vm_manager; | ||||||
| 
 | 
 | ||||||
| @ -358,6 +366,9 @@ private: | |||||||
|     /// variable related facilities.
 |     /// variable related facilities.
 | ||||||
|     Mutex mutex; |     Mutex mutex; | ||||||
| 
 | 
 | ||||||
|  |     /// Address indicating the location of the process' dedicated TLS region.
 | ||||||
|  |     VAddr tls_region_address = 0; | ||||||
|  | 
 | ||||||
|     /// Random values for svcGetInfo RandomEntropy
 |     /// Random values for svcGetInfo RandomEntropy
 | ||||||
|     std::array<u64, RANDOM_ENTROPY_SIZE> random_entropy{}; |     std::array<u64, RANDOM_ENTROPY_SIZE> random_entropy{}; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -843,9 +843,7 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, u64 ha | |||||||
|             return RESULT_SUCCESS; |             return RESULT_SUCCESS; | ||||||
| 
 | 
 | ||||||
|         case GetInfoType::UserExceptionContextAddr: |         case GetInfoType::UserExceptionContextAddr: | ||||||
|             LOG_WARNING(Kernel_SVC, |             *result = process->GetTLSRegionAddress(); | ||||||
|                         "(STUBBED) Attempted to query user exception context address, returned 0"); |  | ||||||
|             *result = 0; |  | ||||||
|             return RESULT_SUCCESS; |             return RESULT_SUCCESS; | ||||||
| 
 | 
 | ||||||
|         case GetInfoType::TotalPhysicalMemoryAvailableWithoutSystemResource: |         case GetInfoType::TotalPhysicalMemoryAvailableWithoutSystemResource: | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei