mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-11-28 09:30:58 +01:00
kern: KCacheHelper: better reflect nintendo coremask clearing logic
This commit is contained in:
parent
71e4313d0c
commit
2490bbf4f9
@ -104,12 +104,12 @@ namespace ams::kern::arch::arm64::cpu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ThreadFunctionImpl() {
|
void ThreadFunctionImpl() {
|
||||||
const s32 core_id = GetCurrentCoreId();
|
const u64 core_mask = (1ul << GetCurrentCoreId());
|
||||||
while (true) {
|
while (true) {
|
||||||
/* Wait for a request to come in. */
|
/* Wait for a request to come in. */
|
||||||
{
|
{
|
||||||
KScopedLightLock lk(m_cv_lock);
|
KScopedLightLock lk(m_cv_lock);
|
||||||
while ((m_target_cores.Load() & (1ul << core_id)) == 0) {
|
while ((m_target_cores.Load() & core_mask) == 0) {
|
||||||
m_cv.Wait(std::addressof(m_cv_lock));
|
m_cv.Wait(std::addressof(m_cv_lock));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,6 +120,8 @@ namespace ams::kern::arch::arm64::cpu {
|
|||||||
/* Broadcast, if there's nothing pending. */
|
/* Broadcast, if there's nothing pending. */
|
||||||
{
|
{
|
||||||
KScopedLightLock lk(m_cv_lock);
|
KScopedLightLock lk(m_cv_lock);
|
||||||
|
|
||||||
|
m_target_cores &= ~core_mask;
|
||||||
if (m_target_cores.Load() == 0) {
|
if (m_target_cores.Load() == 0) {
|
||||||
m_cv.Broadcast();
|
m_cv.Broadcast();
|
||||||
}
|
}
|
||||||
@ -150,6 +152,7 @@ namespace ams::kern::arch::arm64::cpu {
|
|||||||
virtual KInterruptTask *OnInterrupt(s32 interrupt_id) override {
|
virtual KInterruptTask *OnInterrupt(s32 interrupt_id) override {
|
||||||
MESOSPHERE_UNUSED(interrupt_id);
|
MESOSPHERE_UNUSED(interrupt_id);
|
||||||
this->ProcessOperation();
|
this->ProcessOperation();
|
||||||
|
m_target_cores &= ~(1ul << GetCurrentCoreId());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,8 +289,6 @@ namespace ams::kern::arch::arm64::cpu {
|
|||||||
FlushDataCacheBySetWay(0);
|
FlushDataCacheBySetWay(0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_target_cores &= (~(1ul << GetCurrentCoreId()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ALWAYS_INLINE void SetEventLocally() {
|
ALWAYS_INLINE void SetEventLocally() {
|
||||||
|
Loading…
Reference in New Issue
Block a user