#include #include #include #include #include #include #include pid_t pid; int ev_trace, ev_hard, ev_soft; void setup_trace(void) { struct perf_event_attr attr; memset(&attr, 0, sizeof(attr)); attr.type = PERF_TYPE_TRACEPOINT; attr.config = 0xc6; attr.exclude_kernel = 1; attr.exclude_hv = 1; ev_trace = syscall(__NR_perf_event_open, &attr, pid, -1, -1, 0); } void *thread_hard(void *arg) { struct perf_event_attr attr; memset(&attr, 0, sizeof(attr)); attr.type = PERF_TYPE_HARDWARE; attr.exclude_kernel = 1; attr.exclude_hv = 1; ev_hard = syscall(__NR_perf_event_open, &attr, pid, -1, ev_trace, 0); return NULL; } void *thread_soft(void *arg) { struct perf_event_attr attr; memset(&attr, 0, sizeof(attr)); attr.type = PERF_TYPE_SOFTWARE; attr.exclude_kernel = 1; attr.exclude_hv = 1; ev_soft = syscall(__NR_perf_event_open, &attr, pid, -1, ev_trace, 0); return NULL; } void hard_event_independent(void) { struct perf_event_attr attr; memset(&attr, 0, sizeof(attr)); attr.type = PERF_TYPE_HARDWARE; attr.exclude_kernel = 1; attr.exclude_hv = 1; syscall(__NR_perf_event_open, &attr, pid, -1, -1, 0); } int main(int argc, char **argv) { pthread_t th[2]; pid = fork(); if (pid == 0) { sleep(9999); exit(EXIT_SUCCESS); } setup_trace(); pthread_create(&th[0], 0, thread_hard, 0); pthread_create(&th[1], 0, thread_soft, 0); pthread_join(th[0], 0); pthread_join(th[1], 0); close(ev_trace); close(ev_hard); close(ev_soft); hard_event_independent(); return 0; }