mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-22 22:00:39 -06:00
Reformat all the things. Have fun with merge conflicts.
This commit is contained in:
@ -10,70 +10,69 @@
|
||||
#include "Core/PowerPC/JitCommon/JitBase.h"
|
||||
|
||||
// include order is important
|
||||
#include <gtest/gtest.h> // NOLINT
|
||||
#include <gtest/gtest.h> // NOLINT
|
||||
|
||||
enum
|
||||
{
|
||||
#ifdef _WIN32
|
||||
PAGE_GRAN = 0x10000
|
||||
PAGE_GRAN = 0x10000
|
||||
#else
|
||||
PAGE_GRAN = 0x1000
|
||||
PAGE_GRAN = 0x1000
|
||||
#endif
|
||||
};
|
||||
|
||||
class PageFaultFakeJit : public JitBase
|
||||
{
|
||||
public:
|
||||
// CPUCoreBase methods
|
||||
void Init() override {}
|
||||
void Shutdown() override {}
|
||||
void ClearCache() override {}
|
||||
void Run() override {}
|
||||
void SingleStep() override {}
|
||||
const char *GetName() override { return nullptr; }
|
||||
// CPUCoreBase methods
|
||||
void Init() override {}
|
||||
void Shutdown() override {}
|
||||
void ClearCache() override {}
|
||||
void Run() override {}
|
||||
void SingleStep() override {}
|
||||
const char* GetName() override { return nullptr; }
|
||||
// JitBase methods
|
||||
JitBaseBlockCache* GetBlockCache() override { return nullptr; }
|
||||
void Jit(u32 em_address) override {}
|
||||
const CommonAsmRoutinesBase* GetAsmRoutines() override { return nullptr; }
|
||||
virtual bool HandleFault(uintptr_t access_address, SContext* ctx) override
|
||||
{
|
||||
m_pre_unprotect_time = std::chrono::high_resolution_clock::now();
|
||||
UnWriteProtectMemory(m_data, PAGE_GRAN, /*allowExecute*/ false);
|
||||
m_post_unprotect_time = std::chrono::high_resolution_clock::now();
|
||||
return true;
|
||||
}
|
||||
|
||||
// JitBase methods
|
||||
JitBaseBlockCache *GetBlockCache() override { return nullptr; }
|
||||
void Jit(u32 em_address) override {}
|
||||
const CommonAsmRoutinesBase *GetAsmRoutines() override { return nullptr; }
|
||||
|
||||
virtual bool HandleFault(uintptr_t access_address, SContext* ctx) override
|
||||
{
|
||||
m_pre_unprotect_time = std::chrono::high_resolution_clock::now();
|
||||
UnWriteProtectMemory(m_data, PAGE_GRAN, /*allowExecute*/ false);
|
||||
m_post_unprotect_time = std::chrono::high_resolution_clock::now();
|
||||
return true;
|
||||
}
|
||||
|
||||
void* m_data;
|
||||
std::chrono::time_point<std::chrono::high_resolution_clock>
|
||||
m_pre_unprotect_time, m_post_unprotect_time;
|
||||
void* m_data;
|
||||
std::chrono::time_point<std::chrono::high_resolution_clock> m_pre_unprotect_time,
|
||||
m_post_unprotect_time;
|
||||
};
|
||||
|
||||
|
||||
TEST(PageFault, PageFault)
|
||||
{
|
||||
EMM::InstallExceptionHandler();
|
||||
void* data = AllocateMemoryPages(PAGE_GRAN);
|
||||
EXPECT_NE(data, nullptr);
|
||||
WriteProtectMemory(data, PAGE_GRAN, false);
|
||||
EMM::InstallExceptionHandler();
|
||||
void* data = AllocateMemoryPages(PAGE_GRAN);
|
||||
EXPECT_NE(data, nullptr);
|
||||
WriteProtectMemory(data, PAGE_GRAN, false);
|
||||
|
||||
PageFaultFakeJit pfjit;
|
||||
jit = &pfjit;
|
||||
pfjit.m_data = data;
|
||||
PageFaultFakeJit pfjit;
|
||||
jit = &pfjit;
|
||||
pfjit.m_data = data;
|
||||
|
||||
auto start = std::chrono::high_resolution_clock::now();
|
||||
*(volatile int*) data = 5;
|
||||
auto end = std::chrono::high_resolution_clock::now();
|
||||
auto start = std::chrono::high_resolution_clock::now();
|
||||
*(volatile int*)data = 5;
|
||||
auto end = std::chrono::high_resolution_clock::now();
|
||||
|
||||
#define AS_NS(diff) ((unsigned long long)std::chrono::duration_cast<std::chrono::nanoseconds>(diff).count())
|
||||
#define AS_NS(diff) \
|
||||
((unsigned long long)std::chrono::duration_cast<std::chrono::nanoseconds>(diff).count())
|
||||
|
||||
EMM::UninstallExceptionHandler();
|
||||
jit = nullptr;
|
||||
EMM::UninstallExceptionHandler();
|
||||
jit = nullptr;
|
||||
|
||||
printf("page fault timing:\n");
|
||||
printf("start->HandleFault %llu ns\n", AS_NS(pfjit.m_pre_unprotect_time - start));
|
||||
printf("UnWriteProtectMemory %llu ns\n", AS_NS(pfjit.m_post_unprotect_time - pfjit.m_pre_unprotect_time));
|
||||
printf("HandleFault->end %llu ns\n", AS_NS(end - pfjit.m_post_unprotect_time));
|
||||
printf("total %llu ns\n", AS_NS(end - start));
|
||||
printf("page fault timing:\n");
|
||||
printf("start->HandleFault %llu ns\n", AS_NS(pfjit.m_pre_unprotect_time - start));
|
||||
printf("UnWriteProtectMemory %llu ns\n",
|
||||
AS_NS(pfjit.m_post_unprotect_time - pfjit.m_pre_unprotect_time));
|
||||
printf("HandleFault->end %llu ns\n", AS_NS(end - pfjit.m_post_unprotect_time));
|
||||
printf("total %llu ns\n", AS_NS(end - start));
|
||||
}
|
||||
|
Reference in New Issue
Block a user