Browse Source

Revert "[nce] Adjusted precise access fault window handling + decay mechanism"

vkexperiments1
CamilleLaVey 4 days ago
parent
commit
ce2f2187bd
  1. 40
      src/core/arm/nce/arm_nce.cpp
  2. 6
      src/core/arm/nce/arm_nce.h

40
src/core/arm/nce/arm_nce.cpp

@ -190,44 +190,10 @@ bool ArmNce::IsPreciseAccessPage(u64 addr) const {
void ArmNce::MarkPreciseAccessPage(u64 addr) { void ArmNce::MarkPreciseAccessPage(u64 addr) {
const std::scoped_lock lk{m_precise_pages_guard}; const std::scoped_lock lk{m_precise_pages_guard};
const u64 page = AlignDownPage(addr);
if (auto it = m_precise_pages.find(page); it != m_precise_pages.end()) {
it->second = std::min<u8>(MaxPreciseAccessPageWeight, static_cast<u8>(it->second + 1));
return;
}
while (m_precise_pages.size() >= MaxPreciseAccessPages) {
DecayPreciseAccessPagesLocked();
}
m_precise_pages.emplace(page, 1);
}
void ArmNce::MarkPreciseAccessFaultWindow(u64 addr) {
MarkPreciseAccessPage(addr);
if (!IsNearPageBoundary(addr)) {
return;
}
const u64 page_offset = addr & Memory::YUZU_PAGEMASK;
if (page_offset < SplitPageAccessWindow && addr >= Memory::YUZU_PAGESIZE) {
MarkPreciseAccessPage(addr - Memory::YUZU_PAGESIZE);
}
if (page_offset + SplitPageAccessWindow > Memory::YUZU_PAGESIZE) {
MarkPreciseAccessPage(addr + Memory::YUZU_PAGESIZE);
}
}
void ArmNce::DecayPreciseAccessPagesLocked() {
for (auto it = m_precise_pages.begin(); it != m_precise_pages.end();) {
if (it->second > 1) {
--it->second;
++it;
} else {
it = m_precise_pages.erase(it);
}
if (m_precise_pages.size() >= MaxPreciseAccessPages) {
m_precise_pages.clear();
} }
m_precise_pages.insert(AlignDownPage(addr));
} }
void ArmNce::LockThread(Kernel::KThread* thread) { void ArmNce::LockThread(Kernel::KThread* thread) {

6
src/core/arm/nce/arm_nce.h

@ -7,7 +7,7 @@
#pragma once #pragma once
#include <mutex> #include <mutex>
#include <unordered_map>
#include <unordered_set>
#include "core/arm/arm_interface.h" #include "core/arm/arm_interface.h"
#include "core/arm/nce/guest_context.h" #include "core/arm/nce/guest_context.h"
@ -84,8 +84,6 @@ private:
bool IsPreciseAccessPage(u64 addr) const; bool IsPreciseAccessPage(u64 addr) const;
void MarkPreciseAccessPage(u64 addr); void MarkPreciseAccessPage(u64 addr);
void MarkPreciseAccessFaultWindow(u64 addr);
void DecayPreciseAccessPagesLocked();
public: public:
Core::System& m_system; Core::System& m_system;
@ -99,7 +97,7 @@ public:
Kernel::KThread* m_running_thread{}; Kernel::KThread* m_running_thread{};
mutable std::mutex m_precise_pages_guard{}; mutable std::mutex m_precise_pages_guard{};
std::unordered_map<u64, u8> m_precise_pages{};
std::unordered_set<u64> m_precise_pages{};
// Stack for signal processing. // Stack for signal processing.
std::unique_ptr<u8[]> m_stack{}; std::unique_ptr<u8[]> m_stack{};

Loading…
Cancel
Save