mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-04-10 05:28:56 +02:00
Revert "[nce] Adjusted precise access fault window handling + decay mechanism"
This commit is contained in:
parent
8c077fc4cd
commit
ce2f2187bd
2 changed files with 5 additions and 41 deletions
|
|
@ -190,44 +190,10 @@ bool ArmNce::IsPreciseAccessPage(u64 addr) const {
|
|||
|
||||
void ArmNce::MarkPreciseAccessPage(u64 addr) {
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <mutex>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
|
||||
#include "core/arm/arm_interface.h"
|
||||
#include "core/arm/nce/guest_context.h"
|
||||
|
|
@ -84,8 +84,6 @@ private:
|
|||
|
||||
bool IsPreciseAccessPage(u64 addr) const;
|
||||
void MarkPreciseAccessPage(u64 addr);
|
||||
void MarkPreciseAccessFaultWindow(u64 addr);
|
||||
void DecayPreciseAccessPagesLocked();
|
||||
|
||||
public:
|
||||
Core::System& m_system;
|
||||
|
|
@ -99,7 +97,7 @@ public:
|
|||
Kernel::KThread* m_running_thread{};
|
||||
|
||||
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.
|
||||
std::unique_ptr<u8[]> m_stack{};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue