mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2026-01-21 04:59:48 -03:00
Rather than *MemTools.cpp checking whether the address is in the
emulated range itself (which, as of the next commit, doesn't cover every
kind of access the JIT might want to intercept) and doing PC
replacement, they just pass the access address and context to
jit->HandleFault, which does the rest itself.
Because SContext is now in JitInterface, I wanted JitBackpatch.h (which
defines it) to be lightweight, so I moved TrampolineCache and associated
x64{Analyzer,Emitter} dependencies into its own file. I hate adding new
files in three places, two of which are MSVC...
While I'm at it, edit a misleading comment.
78 lines
1.8 KiB
C++
78 lines
1.8 KiB
C++
// Copyright 2013 Dolphin Emulator Project
|
|
// Licensed under GPLv2
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
#include <cstdio>
|
|
#include <signal.h>
|
|
#ifdef ANDROID
|
|
#include <asm/sigcontext.h>
|
|
#else
|
|
#include <execinfo.h>
|
|
#include <sys/ucontext.h> // Look in here for the context definition.
|
|
#endif
|
|
|
|
#include "Common/CommonTypes.h"
|
|
#include "Core/MemTools.h"
|
|
#include "Core/HW/Memmap.h"
|
|
#include "Core/PowerPC/JitInterface.h"
|
|
#include "Core/PowerPC/PowerPC.h"
|
|
#include "Core/PowerPC/JitCommon/JitBase.h"
|
|
|
|
namespace EMM
|
|
{
|
|
#ifdef ANDROID
|
|
typedef struct sigcontext mcontext_t;
|
|
typedef struct ucontext {
|
|
uint32_t uc_flags;
|
|
struct ucontext* uc_link;
|
|
stack_t uc_stack;
|
|
mcontext_t uc_mcontext;
|
|
// Other fields are not used by Google Breakpad. Don't define them.
|
|
} ucontext_t;
|
|
#endif
|
|
|
|
static void sigsegv_handler(int sig, siginfo_t *info, void *raw_context)
|
|
{
|
|
if (sig != SIGSEGV)
|
|
{
|
|
// We are not interested in other signals - handle it as usual.
|
|
return;
|
|
}
|
|
ucontext_t *context = (ucontext_t *)raw_context;
|
|
int sicode = info->si_code;
|
|
if (sicode != SEGV_MAPERR && sicode != SEGV_ACCERR)
|
|
{
|
|
// Huh? Return.
|
|
return;
|
|
}
|
|
|
|
// Get all the information we can out of the context.
|
|
mcontext_t *ctx = &context->uc_mcontext;
|
|
|
|
// comex says hello, and is most curious whether this is arm_r10 for a
|
|
// reason as opposed to si_addr like the x64MemTools.cpp version. Is there
|
|
// even a need for this file to be architecture specific?
|
|
uintptr_t fault_memory_ptr = (uintptr_t)ctx->arm_r10;
|
|
|
|
if (!JitInterface::HandleFault(fault_memory_ptr, ctx))
|
|
{
|
|
// retry and crash
|
|
signal(SIGSEGV, SIG_DFL);
|
|
}
|
|
}
|
|
|
|
void InstallExceptionHandler()
|
|
{
|
|
struct sigaction sa;
|
|
sa.sa_handler = 0;
|
|
sa.sa_sigaction = &sigsegv_handler;
|
|
sa.sa_flags = SA_SIGINFO;
|
|
sigemptyset(&sa.sa_mask);
|
|
sigaction(SIGSEGV, &sa, nullptr);
|
|
}
|
|
|
|
void UninstallExceptionHandler() {}
|
|
|
|
} // namespace
|