exception_handler_posix: Just disable fastmem if initialization fails
This commit is contained in:
parent
55bddc767f
commit
c4cf0b3e47
1 changed files with 20 additions and 5 deletions
|
@ -39,11 +39,15 @@ public:
|
||||||
void AddCodeBlock(CodeBlockInfo info);
|
void AddCodeBlock(CodeBlockInfo info);
|
||||||
void RemoveCodeBlock(u64 rip);
|
void RemoveCodeBlock(u64 rip);
|
||||||
|
|
||||||
|
bool SupportsFastmem() const { return supports_fast_mem; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
auto FindCodeBlockInfo(u64 rip) {
|
auto FindCodeBlockInfo(u64 rip) {
|
||||||
return std::find_if(code_block_infos.begin(), code_block_infos.end(), [&](const auto& x) { return x.code_begin <= rip && x.code_end > rip; });
|
return std::find_if(code_block_infos.begin(), code_block_infos.end(), [&](const auto& x) { return x.code_begin <= rip && x.code_end > rip; });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool supports_fast_mem = true;
|
||||||
|
|
||||||
std::vector<CodeBlockInfo> code_block_infos;
|
std::vector<CodeBlockInfo> code_block_infos;
|
||||||
std::mutex code_block_infos_mutex;
|
std::mutex code_block_infos_mutex;
|
||||||
|
|
||||||
|
@ -62,17 +66,28 @@ SigHandler::SigHandler() {
|
||||||
signal_stack.ss_sp = std::malloc(signal_stack_size);
|
signal_stack.ss_sp = std::malloc(signal_stack_size);
|
||||||
signal_stack.ss_size = signal_stack_size;
|
signal_stack.ss_size = signal_stack_size;
|
||||||
signal_stack.ss_flags = 0;
|
signal_stack.ss_flags = 0;
|
||||||
const int ret = sigaltstack(&signal_stack, nullptr);
|
if (sigaltstack(&signal_stack, nullptr) != 0) {
|
||||||
ASSERT_MSG(ret == 0, "dynarmic: POSIX SigHandler: init failure at sigaltstack");
|
fmt::print(stderr, "dynarmic: POSIX SigHandler: init failure at sigaltstack\n");
|
||||||
|
supports_fast_mem = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
sa.sa_handler = nullptr;
|
sa.sa_handler = nullptr;
|
||||||
sa.sa_sigaction = &SigHandler::SigAction;
|
sa.sa_sigaction = &SigHandler::SigAction;
|
||||||
sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_RESTART;
|
sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_RESTART;
|
||||||
sigemptyset(&sa.sa_mask);
|
sigemptyset(&sa.sa_mask);
|
||||||
sigaction(SIGSEGV, &sa, &old_sa_segv);
|
if (sigaction(SIGSEGV, &sa, &old_sa_segv) != 0) {
|
||||||
|
fmt::print(stderr, "dynarmic: POSIX SigHandler: could not set SIGSEGV handler\n");
|
||||||
|
supports_fast_mem = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
sigaction(SIGBUS, &sa, &old_sa_bus);
|
if (sigaction(SIGBUS, &sa, &old_sa_bus) != 0) {
|
||||||
|
fmt::print(stderr, "dynarmic: POSIX SigHandler: could not set SIGBUS handler\n");
|
||||||
|
supports_fast_mem = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +188,7 @@ void ExceptionHandler::Register(BlockOfCode& code) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ExceptionHandler::SupportsFastmem() const noexcept {
|
bool ExceptionHandler::SupportsFastmem() const noexcept {
|
||||||
return static_cast<bool>(impl);
|
return static_cast<bool>(impl) && sig_handler.SupportsFastmem();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExceptionHandler::SetFastmemCallback(std::function<FakeCall(u64)> cb) {
|
void ExceptionHandler::SetFastmemCallback(std::function<FakeCall(u64)> cb) {
|
||||||
|
|
Loading…
Reference in a new issue