diff options
author | Subv <subv2112@gmail.com> | 2018-07-21 02:57:45 +0200 |
---|---|---|
committer | Subv <subv2112@gmail.com> | 2018-07-21 02:57:45 +0200 |
commit | d84eb9dac64f314adcef2c374de245012f658b1d (patch) | |
tree | 56720a5bce5d1a285dda01c16bfcb1dd57e53054 /src/core/hle/kernel | |
parent | Merge pull request #730 from lioncash/string (diff) | |
download | yuzu-d84eb9dac64f314adcef2c374de245012f658b1d.tar yuzu-d84eb9dac64f314adcef2c374de245012f658b1d.tar.gz yuzu-d84eb9dac64f314adcef2c374de245012f658b1d.tar.bz2 yuzu-d84eb9dac64f314adcef2c374de245012f658b1d.tar.lz yuzu-d84eb9dac64f314adcef2c374de245012f658b1d.tar.xz yuzu-d84eb9dac64f314adcef2c374de245012f658b1d.tar.zst yuzu-d84eb9dac64f314adcef2c374de245012f658b1d.zip |
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r-- | src/core/hle/kernel/scheduler.cpp | 3 | ||||
-rw-r--r-- | src/core/hle/kernel/thread.cpp | 1 | ||||
-rw-r--r-- | src/core/hle/kernel/thread.h | 9 |
3 files changed, 13 insertions, 0 deletions
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp index 1f4abfbe8..82829f6bb 100644 --- a/src/core/hle/kernel/scheduler.cpp +++ b/src/core/hle/kernel/scheduler.cpp @@ -56,6 +56,8 @@ void Scheduler::SwitchContext(Thread* new_thread) { if (previous_thread) { previous_thread->last_running_ticks = CoreTiming::GetTicks(); cpu_core->SaveContext(previous_thread->context); + // Save the TPIDR_EL0 system register in case it was modified. + previous_thread->tpidr_el0 = cpu_core->GetTPIDR_EL0(); if (previous_thread->status == THREADSTATUS_RUNNING) { // This is only the case when a reschedule is triggered without the current thread @@ -87,6 +89,7 @@ void Scheduler::SwitchContext(Thread* new_thread) { cpu_core->LoadContext(new_thread->context); cpu_core->SetTlsAddress(new_thread->GetTLSAddress()); + cpu_core->SetTPIDR_EL0(new_thread->GetTPIDR_EL0()); cpu_core->ClearExclusiveState(); } else { current_thread = nullptr; diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index e7fd6c842..7f1e18831 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp @@ -313,6 +313,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, thread->status = THREADSTATUS_DORMANT; thread->entry_point = entry_point; thread->stack_top = stack_top; + thread->tpidr_el0 = 0; thread->nominal_priority = thread->current_priority = priority; thread->last_running_ticks = CoreTiming::GetTicks(); thread->processor_id = processor_id; diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h index f1e759802..5fe72c55c 100644 --- a/src/core/hle/kernel/thread.h +++ b/src/core/hle/kernel/thread.h @@ -183,6 +183,14 @@ public: } /* + * Returns the value of the TPIDR_EL0 Read/Write system register for this thread. + * @returns The value of the TPIDR_EL0 register. + */ + u64 GetTPIDR_EL0() const { + return tpidr_el0; + } + + /* * Returns the address of the current thread's command buffer, located in the TLS. * @returns VAddr of the thread's command buffer. */ @@ -213,6 +221,7 @@ public: s32 processor_id; VAddr tls_address; ///< Virtual address of the Thread Local Storage of the thread + u64 tpidr_el0; ///< TPIDR_EL0 read/write system register. SharedPtr<Process> owner_process; ///< Process that owns this thread |