mirror of
https://git.h3cjp.net/H3cJP/citra.git
synced 2024-12-27 05:36:42 +00:00
kernel/process: Allocate the process' TLS region during initialization
Prior to execution within a process beginning, the process establishes its own TLS region for uses (as far as I can tell) related to exception handling. Now that TLS creation was decoupled from threads themselves, we can add this behavior to our Process class. This is also good, as it allows us to remove a stub within svcGetInfo, namely querying the address of that region.
This commit is contained in:
parent
eb6f55d880
commit
56c7912159
|
@ -187,6 +187,8 @@ 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) {
|
||||||
AllocateMainThreadStack(stack_size);
|
AllocateMainThreadStack(stack_size);
|
||||||
|
tls_region_address = CreateTLSRegion();
|
||||||
|
|
||||||
vm_manager.LogLayout();
|
vm_manager.LogLayout();
|
||||||
|
|
||||||
ChangeStatus(ProcessStatus::Running);
|
ChangeStatus(ProcessStatus::Running);
|
||||||
|
@ -218,6 +220,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
@ -341,6 +346,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{};
|
||||||
|
|
||||||
|
|
|
@ -831,9 +831,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::TotalPhysicalMemoryAvailableWithoutMmHeap:
|
case GetInfoType::TotalPhysicalMemoryAvailableWithoutMmHeap:
|
||||||
|
|
Loading…
Reference in a new issue