[nce] signal hanlder fixes for sigaction
Signed-off-by: lizzie <lizzie@eden-emu.dev>
This commit is contained in:
parent
4d56d9a96a
commit
1a81f13c8d
2 changed files with 13 additions and 18 deletions
|
@ -10,27 +10,16 @@
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
|
#ifdef __ANDROID__
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T* LookupLibcSymbol(const char* name) {
|
T* LookupLibcSymbol(const char* name) {
|
||||||
#if defined(__BIONIC__)
|
|
||||||
Common::DynamicLibrary provider("libc.so");
|
Common::DynamicLibrary provider("libc.so");
|
||||||
if (!provider.IsOpen()) {
|
ASSERT_MSG(provider.IsOpen(), "Failed to open libc!");
|
||||||
UNREACHABLE_MSG("Failed to open libc!");
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// For other operating environments, we assume the symbol is not overridden.
|
|
||||||
const char* base = nullptr;
|
|
||||||
Common::DynamicLibrary provider(base);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void* sym = provider.GetSymbolAddress(name);
|
void* sym = provider.GetSymbolAddress(name);
|
||||||
if (sym == nullptr) {
|
if (sym == nullptr) {
|
||||||
sym = dlsym(RTLD_DEFAULT, name);
|
sym = dlsym(RTLD_DEFAULT, name);
|
||||||
}
|
}
|
||||||
if (sym == nullptr) {
|
ASSERT_MSG(sym != nullptr, "Unable to find symbol {}!", name);
|
||||||
UNREACHABLE_MSG("Unable to find symbol {}!", name);
|
|
||||||
}
|
|
||||||
|
|
||||||
return reinterpret_cast<T*>(sym);
|
return reinterpret_cast<T*>(sym);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,5 +27,10 @@ int SigAction(int signum, const struct sigaction* act, struct sigaction* oldact)
|
||||||
static auto libc_sigaction = LookupLibcSymbol<decltype(sigaction)>("sigaction");
|
static auto libc_sigaction = LookupLibcSymbol<decltype(sigaction)>("sigaction");
|
||||||
return libc_sigaction(signum, act, oldact);
|
return libc_sigaction(signum, act, oldact);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
int SigAction(int signum, const struct sigaction* act, struct sigaction* oldact) {
|
||||||
|
return sigaction(signum, act, oldact);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|
|
@ -66,19 +66,20 @@ _ZN4Core6ArmNce37ReturnToRunCodeByExceptionLevelChangeEiPv:
|
||||||
#endif
|
#endif
|
||||||
/* This jumps to the signal handler, which will restore the entire context. */
|
/* This jumps to the signal handler, which will restore the entire context. */
|
||||||
/* On entry, x0 = thread id, which is already in the right place. Even on macOS. */
|
/* On entry, x0 = thread id, which is already in the right place. Even on macOS. */
|
||||||
/* Move tpidr to x9 so it is not trampled. */
|
mov x9, x1 /* Move tpidr to x9 so it is not trampled. */
|
||||||
mov x9, x1
|
|
||||||
mov x1, #(ReturnToRunCodeByExceptionLevelChangeSignal)
|
mov x1, #(ReturnToRunCodeByExceptionLevelChangeSignal)
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
/* I can never be happy, why no tkill in mach kernel? Ugh ... */
|
/* I can never be happy, why no tkill in mach kernel? Ugh ... */
|
||||||
/* Signature: 328 AUE_PTHREADKILL ALL { int __pthread_kill(int thread_port, int sig); } */
|
/* Signature: 328 AUE_PTHREADKILL ALL { int __pthread_kill(int thread_port, int sig); } */
|
||||||
mov x16, #(328)
|
mov x16, #(328)
|
||||||
|
svc #0x80 /* Tail call the signal handler. */
|
||||||
|
brk #0xF000 /* See: https://discourse.llvm.org/t/stepping-over-a-brk-instruction-on-arm64/69766/7 */
|
||||||
#else
|
#else
|
||||||
/* Signature: int tgkill(pid_t tgid, pid_t tid, int sig); */
|
/* Signature: int tgkill(pid_t tgid, pid_t tid, int sig); */
|
||||||
mov x8, #(__NR_tkill)
|
mov x8, #(__NR_tkill)
|
||||||
#endif
|
|
||||||
svc #0 /* Tail call the signal handler. */
|
svc #0 /* Tail call the signal handler. */
|
||||||
brk #1000 /* Block execution from flowing here. */
|
brk #1000 /* Block execution from flowing here. */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* static void Core::ArmNce::ReturnToRunCodeByExceptionLevelChangeSignalHandler(int sig, void* info, void* raw_context) */
|
/* static void Core::ArmNce::ReturnToRunCodeByExceptionLevelChangeSignalHandler(int sig, void* info, void* raw_context) */
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue