Chromium Code Reviews| Index: runtime/vm/signal_handler.cc |
| diff --git a/runtime/vm/signal_handler.cc b/runtime/vm/signal_handler.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..752305664096cd5980ea585eaf6fad1b14c80c44 |
| --- /dev/null |
| +++ b/runtime/vm/signal_handler.cc |
| @@ -0,0 +1,177 @@ |
| +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +#include "platform/utils.h" |
| +#include "vm/simulator.h" |
| +#include "vm/signal_handler.h" |
| + |
| +namespace dart { |
| + |
| +uintptr_t SignalHandler::GetProgramCounter(const mcontext_t& mcontext) { |
| + uintptr_t pc = 0; |
| + |
| +#if defined(TARGET_OS_MACOS) |
| +#if defined(TARGET_ARCH_IA32) |
| + pc = static_cast<uintptr_t>(mcontext->__ss.__eip); |
| +#elif defined(TARGET_ARCH_X64) |
| + pc = static_cast<uintptr_t>(mcontext->__ss.__rip); |
| +#elif defined(TARGET_ARCH_MIPS) && defined(USING_SIMULATOR) |
| + pc = static_cast<uintptr_t>(mcontext->__ss.__eip); |
| +#elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR) |
| + pc = static_cast<uintptr_t>(mcontext->__ss.__eip); |
| +#else |
| + UNIMPLEMENTED() |
| +#endif // TARGET_ARCH_... |
| +#endif // TARGET_OS_MACOS |
| + |
| +#if defined(TARGET_OS_LINUX) |
| +#if defined(TARGET_ARCH_IA32) |
| + pc = static_cast<uintptr_t>(mcontext.gregs[REG_EIP]); |
| +#elif defined(TARGET_ARCH_X64) |
| + pc = static_cast<uintptr_t>(mcontext.gregs[REG_RIP]); |
| +#elif defined(TARGET_ARCH_MIPS) && defined(USING_SIMULATOR) |
| + pc = static_cast<uintptr_t>(mcontext.gregs[REG_EIP]); |
| +#elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR) |
| + pc = static_cast<uintptr_t>(mcontext.gregs[REG_EIP]); |
| +#else |
| + UNIMPLEMENTED() |
| +#endif // TARGET_ARCH_... |
| +#endif // TARGET_OS_LINUX |
| + |
| +#if defined(TARGET_OS_ANDROID) |
| + UNIMPLEMENTED(); |
| +#endif // TARGET_OS_ANDROID |
| + |
| +#if defined(TARGET_OS_WINDOWS) |
| + UNIMPLEMENTED(); |
| +#endif // TARGET_OS_WINDOWS |
| + |
| + return pc; |
| +} |
| + |
| + |
| +uintptr_t SignalHandler::GetFramePointer(const mcontext_t& mcontext) { |
| + uintptr_t fp = 0; |
| + |
| +#if defined(TARGET_OS_MACOS) |
| +#if defined(TARGET_ARCH_IA32) |
| + fp = static_cast<uintptr_t>(mcontext->__ss.__ebp); |
| +#elif defined(TARGET_ARCH_X64) |
| + fp = static_cast<uintptr_t>(mcontext->__ss.__rbp); |
| +#elif defined(TARGET_ARCH_MIPS) && defined(USING_SIMULATOR) |
| + fp = static_cast<uintptr_t>(mcontext->__ss.__ebp); |
| +#elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR) |
| + fp = static_cast<uintptr_t>(mcontext->__ss.__ebp); |
| +#else |
| + UNIMPLEMENTED() |
| +#endif // TARGET_ARCH_... |
| +#endif // TARGET_OS_MACOS |
| + |
| +#if defined(TARGET_OS_LINUX) |
| +#if defined(TARGET_ARCH_IA32) |
| + fp = static_cast<uintptr_t>(mcontext.gregs[REG_EBP]); |
| +#elif defined(TARGET_ARCH_X64) |
| + fp = static_cast<uintptr_t>(mcontext.gregs[REG_RBP]); |
| +#elif defined(TARGET_ARCH_MIPS) && defined(USING_SIMULATOR) |
| + fp = static_cast<uintptr_t>(mcontext.gregs[REG_EBP]); |
| +#elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR) |
| + fp = static_cast<uintptr_t>(mcontext.gregs[REG_EBP]); |
| +#else |
| + UNIMPLEMENTED() |
| +#endif // TARGET_ARCH_... |
| +#endif // TARGET_OS_LINUX |
| + |
| +#if defined(TARGET_OS_ANDROID) |
| + UNIMPLEMENTED(); |
| +#endif // TARGET_OS_ANDROID |
| + |
| +#if defined(TARGET_OS_WINDOWS) |
| + UNIMPLEMENTED(); |
| +#endif // TARGET_OS_WINDOWS |
| + |
| + return fp; |
| +} |
| + |
|
siva
2013/10/28 05:19:21
Ditto comment about using individual files for eac
Cutch
2013/11/04 20:36:05
Done.
|
| + |
| +uintptr_t SignalHandler::GetStackPointer(const mcontext_t& mcontext) { |
| + uintptr_t sp = 0; |
| + |
| +#if defined(TARGET_OS_MACOS) |
| +#if defined(TARGET_ARCH_IA32) |
| + sp = static_cast<uintptr_t>(mcontext->__ss.__esp); |
| +#elif defined(TARGET_ARCH_X64) |
| + sp = static_cast<uintptr_t>(mcontext->__ss.__rsp); |
| +#elif defined(TARGET_ARCH_MIPS) && defined(USING_SIMULATOR) |
| + sp = static_cast<uintptr_t>(mcontext->__ss.__esp); |
| +#elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR) |
| + sp = static_cast<uintptr_t>(mcontext->__ss.__esp); |
| +#else |
| + UNIMPLEMENTED() |
| +#endif // TARGET_ARCH_... |
| +#endif // TARGET_OS_MACOS |
| + |
| +#if defined(TARGET_OS_LINUX) |
| +#if defined(TARGET_ARCH_IA32) |
| + sp = static_cast<uintptr_t>(mcontext.gregs[REG_ESP]); |
| +#elif defined(TARGET_ARCH_X64) |
| + sp = static_cast<uintptr_t>(mcontext.gregs[REG_RSP]); |
| +#elif defined(TARGET_ARCH_MIPS) && defined(USING_SIMULATOR) |
| + sp = static_cast<uintptr_t>(mcontext.gregs[REG_ESP]); |
| +#elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR) |
| + sp = static_cast<uintptr_t>(mcontext.gregs[REG_ESP]); |
| +#else |
| + UNIMPLEMENTED() |
| +#endif // TARGET_ARCH_... |
| +#endif // TARGET_OS_LINUX |
| + |
| +#if defined(TARGET_OS_WINDOWS) |
| + UNIMPLEMENTED(); |
| +#endif // TARGET_OS_WINDOWS |
| + |
| +#if defined(TARGET_OS_ANDROID) |
| + UNIMPLEMENTED(); |
| +#endif // TARGET_OS_ANDROID |
| + return sp; |
| +} |
| + |
| + |
| +void SignalHandler::Install(SignalAction action) { |
| +#if defined(TARGET_OS_WINDOWS) |
| + UNIMPLEMENTED(); |
| +#else |
| + struct sigaction act; |
| + act.sa_handler = NULL; |
| + act.sa_sigaction = action; |
| + sigemptyset(&act.sa_mask); |
| + act.sa_flags = SA_RESTART | SA_SIGINFO; |
| + // TODO(johnmccutchan): Do we care about restoring the signal handler? |
| + struct sigaction old_act; |
| + int r = sigaction(SIGPROF, &act, &old_act); |
| + ASSERT(r == 0); |
| +#endif |
| +} |
| + |
| + |
| +ScopedSignalBlocker::ScopedSignalBlocker() { |
| +#if defined(TARGET_OS_WINDOWS) |
| + // NOOP. |
| +#else |
| + sigset_t set; |
| + sigemptyset(&set); |
| + sigaddset(&set, SIGPROF); |
| + pthread_sigmask(SIG_SETMASK, &set, &old_); |
| +#endif |
| +} |
| + |
| + |
| +ScopedSignalBlocker::~ScopedSignalBlocker() { |
| +#if defined(TARGET_OS_WINDOWS) |
| + // NOOP. |
| +#else |
| + pthread_sigmask(SIG_SETMASK, &old_, NULL); |
| +#endif |
| +} |
| + |
| + |
| +} // namespace dart |