// 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.

#ifndef RUNTIME_VM_SIGNAL_HANDLER_H_
#define RUNTIME_VM_SIGNAL_HANDLER_H_

#include "vm/allocation.h"
#include "vm/globals.h"

#if defined(TARGET_OS_LINUX)
#include <signal.h>    // NOLINT
#include <ucontext.h>  // NOLINT
#elif defined(TARGET_OS_ANDROID)
#include <signal.h>  // NOLINT
#if !defined(__BIONIC_HAVE_UCONTEXT_T)
#include <asm/sigcontext.h>  // NOLINT
// If ucontext_t is not defined on Android, define it here.
typedef struct sigcontext mcontext_t;
typedef struct ucontext {
  uint32_t uc_flags;
  struct ucontext* uc_link;
  stack_t uc_stack;
  struct sigcontext uc_mcontext;
  uint32_t uc_sigmask;
} ucontext_t;
#endif                       // !defined(__BIONIC_HAVE_UCONTEXT_T)
#elif defined(TARGET_OS_MACOS)
#include <signal.h>        // NOLINT
#include <sys/ucontext.h>  // NOLINT
#elif defined(TARGET_OS_WINDOWS)
// Stub out for windows.
struct siginfo_t;
struct mcontext_t;
struct sigset_t {};
#elif defined(TARGET_OS_FUCHSIA)
#include <signal.h>    // NOLINT
#include <ucontext.h>  // NOLINT
#endif


// Old linux kernels on ARM might require a trampoline to
// work around incorrect Thumb -> ARM transitions. See SignalHandlerTrampoline
// below for more details.
#if defined(HOST_ARCH_ARM) &&                                                  \
    (defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)) &&                \
    !defined(__thumb__)
#define USE_SIGNAL_HANDLER_TRAMPOLINE
#endif


namespace dart {

typedef void (*SignalAction)(int signal, siginfo_t* info, void* context);

class SignalHandler : public AllStatic {
 public:
  template <SignalAction action>
  static void Install() {
#if defined(USE_SIGNAL_HANDLER_TRAMPOLINE)
    InstallImpl(SignalHandlerTrampoline<action>);
#else
    InstallImpl(action);
#endif  // defined(USE_SIGNAL_HANDLER_TRAMPOLINE)
  }
  static void Remove();
  static uintptr_t GetProgramCounter(const mcontext_t& mcontext);
  static uintptr_t GetFramePointer(const mcontext_t& mcontext);
  static uintptr_t GetCStackPointer(const mcontext_t& mcontext);
  static uintptr_t GetDartStackPointer(const mcontext_t& mcontext);
  static uintptr_t GetLinkRegister(const mcontext_t& mcontext);

 private:
  static void InstallImpl(SignalAction action);

#if defined(USE_SIGNAL_HANDLER_TRAMPOLINE)
  // Work around for a bug in old kernels (only fixed in 3.18 Android kernel):
  //
  // Kernel does not clear If-Then execution state bits when entering ARM signal
  // handler which violates requirements imposed by ARM architecture reference.
  // Some CPUs look at these bits even while in ARM mode which causes them
  // to skip some instructions in the prologue of the signal handler.
  //
  // To work around the issue we insert enough NOPs in the prologue to ensure
  // that no actual instructions are skipped and then branch to the actual
  // signal handler.
  //
  // For the kernel patch that fixes the issue see:
  // http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6ecf830e5029598732e04067e325d946097519cb
  //
  // Note: this function is marked "naked" because we must guarantee that
  // our NOPs occur before any compiler generated prologue.
  template <SignalAction action>
  static __attribute__((naked)) void SignalHandlerTrampoline(int signal,
                                                             siginfo_t* info,
                                                             void* context_) {
    // IT (If-Then) instruction makes up to four instructions that follow it
    // conditional.
    asm volatile("nop; nop; nop; nop" : : : "memory");

    // Tail-call into the actual signal handler.
    // Note: this code is split into a separate inline assembly block because
    // any code that compiler generates to satisfy register constraints must
    // be generated after four NOPs.
    register int arg0 asm("r0") = signal;
    register siginfo_t* arg1 asm("r1") = info;
    register void* arg2 asm("r2") = context_;
    asm volatile("bx %3"
                 :
                 : "r"(arg0), "r"(arg1), "r"(arg2), "r"(action)
                 : "memory");
  }
#endif  // defined(USE_SIGNAL_HANDLER_TRAMPOLINE)
};


#undef USE_SIGNAL_HANDLER_TRAMPOLINE


}  // namespace dart

#endif  // RUNTIME_VM_SIGNAL_HANDLER_H_
