hooks_manager.cc 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "hooks_manager.h"
  2. #include "log.h"
  3. const char* HookType::hook_type_names[] = {
  4. "HOOK_PERIODIC",
  5. "HOOK_PERIODIC_INS",
  6. "HOOK_SIM_START",
  7. "HOOK_SIM_END",
  8. "HOOK_ROI_BEGIN",
  9. "HOOK_ROI_END",
  10. "HOOK_CPUFREQ_CHANGE",
  11. "HOOK_MAGIC_MARKER",
  12. "HOOK_MAGIC_USER",
  13. "HOOK_INSTR_COUNT",
  14. "HOOK_THREAD_CREATE",
  15. "HOOK_THREAD_START",
  16. "HOOK_THREAD_EXIT",
  17. "HOOK_THREAD_STALL",
  18. "HOOK_THREAD_RESUME",
  19. "HOOK_THREAD_MIGRATE",
  20. "HOOK_INSTRUMENT_MODE",
  21. "HOOK_PRE_STAT_WRITE",
  22. "HOOK_SYSCALL_ENTER",
  23. "HOOK_SYSCALL_EXIT",
  24. "HOOK_APPLICATION_START",
  25. "HOOK_APPLICATION_EXIT",
  26. "HOOK_APPLICATION_ROI_BEGIN",
  27. "HOOK_APPLICATION_ROI_END",
  28. "HOOK_SIGUSR1",
  29. };
  30. static_assert(HookType::HOOK_TYPES_MAX == sizeof(HookType::hook_type_names) / sizeof(HookType::hook_type_names[0]),
  31. "Not enough values in HookType::hook_type_names");
  32. HooksManager::HooksManager()
  33. {
  34. }
  35. void HooksManager::registerHook(HookType::hook_type_t type, HookCallbackFunc func, UInt64 argument, HookCallbackOrder order)
  36. {
  37. m_registry[type].push_back(HookCallback(func, argument, order));
  38. }
  39. SInt64 HooksManager::callHooks(HookType::hook_type_t type, UInt64 arg, bool expect_return)
  40. {
  41. for(unsigned int order = 0; order < NUM_HOOK_ORDER; ++order)
  42. {
  43. for(std::vector<HookCallback>::iterator it = m_registry[type].begin(); it != m_registry[type].end(); ++it)
  44. {
  45. if (it->order == (HookCallbackOrder)order)
  46. {
  47. SInt64 result = it->func(it->arg, arg);
  48. if (expect_return && result != -1)
  49. return result;
  50. }
  51. }
  52. }
  53. return -1;
  54. }