static void event_exit(void) { dr_mutex_destroy(syslock); dr_mutex_destroy(threadlock); CHECK(checked_tls_from_cache, "failed to hit clean call"); CHECK(checked_cls_from_cache, "failed to hit clean call"); CHECK(checked_tls_write_from_cache, "failed to hit clean call"); CHECK(checked_cls_write_from_cache, "failed to hit clean call"); CHECK(one_time_exec == 1, "failed to execute one-time event"); if (!drmgr_unregister_bb_instrumentation_event(event_bb_analysis)) CHECK(false, "drmgr unregistration failed"); if (!drmgr_unregister_bb_instrumentation_ex_event(event_bb4_app2app, event_bb4_analysis, event_bb4_insert, event_bb4_instru2instru)) CHECK(false, "drmgr unregistration failed"); if (!drmgr_unregister_cls_field(event_thread_context_init, event_thread_context_exit, cls_idx)) CHECK(false, "drmgr unregistration failed"); drmgr_exit(); dr_fprintf(STDERR, "all done\n"); }
DR_EXPORT void dr_init(client_id_t id) { drmgr_priority_t priority = {sizeof(priority), "drmgr-test", NULL, NULL, 0}; drmgr_priority_t priority4 = {sizeof(priority), "drmgr-test4", NULL, NULL, 0}; drmgr_priority_t sys_pri_A = {sizeof(priority), "drmgr-test-A", NULL, NULL, 10}; drmgr_priority_t sys_pri_B = {sizeof(priority), "drmgr-test-B", "drmgr-test-A", NULL, 5}; bool ok; drmgr_init(); dr_register_exit_event(event_exit); drmgr_register_thread_init_event(event_thread_init); drmgr_register_thread_exit_event(event_thread_exit); ok = drmgr_register_bb_instrumentation_event(event_bb_analysis, event_bb_insert, &priority); CHECK(ok, "drmgr register bb failed"); /* check register/unregister instrumentation_ex */ ok = drmgr_register_bb_instrumentation_ex_event(event_bb4_app2app, event_bb4_analysis, event_bb4_insert2, event_bb4_instru2instru, NULL); CHECK(ok, "drmgr_register_bb_instrumentation_ex_event failed"); ok = drmgr_unregister_bb_instrumentation_ex_event(event_bb4_app2app, event_bb4_analysis, event_bb4_insert2, event_bb4_instru2instru); CHECK(ok, "drmgr_unregister_bb_instrumentation_ex_event failed"); /* test data passing among all 4 phases */ ok = drmgr_register_bb_instrumentation_ex_event(event_bb4_app2app, event_bb4_analysis, event_bb4_insert, event_bb4_instru2instru, &priority4); tls_idx = drmgr_register_tls_field(); CHECK(tls_idx != -1, "drmgr_register_tls_field failed"); cls_idx = drmgr_register_cls_field(event_thread_context_init, event_thread_context_exit); CHECK(cls_idx != -1, "drmgr_register_tls_field failed"); dr_register_filter_syscall_event(event_filter_syscall); ok = drmgr_register_pre_syscall_event_ex(event_pre_sys_A, &sys_pri_A) && drmgr_register_pre_syscall_event_ex(event_pre_sys_B, &sys_pri_B); CHECK(ok, "drmgr register sys failed"); ok = drmgr_register_post_syscall_event_ex(event_post_sys_A, &sys_pri_A) && drmgr_register_post_syscall_event_ex(event_post_sys_B, &sys_pri_B); CHECK(ok, "drmgr register sys failed"); syslock = dr_mutex_create(); ok = drmgr_register_bb_app2app_event(one_time_bb_event, NULL); CHECK(ok, "drmgr app2app registration failed"); }